77 lines
6.3 KiB
Plaintext
77 lines
6.3 KiB
Plaintext
<p>How can we get org-mode to emphasize things smartly? Let’s find out.</p>
|
||
|
||
<p>Background: After <a href="https://emacstil.com/til/2021/11/26/make-org-emphasis-code-verbatim-bold-look-nicer/">hiding the markers and making them colorful</a>,
|
||
I want to make the act of emphasis as easy as possible.</p>
|
||
|
||
<p>The <code class="language-plaintext highlighter-rouge">M-x org-emphasize</code> or <code class="language-plaintext highlighter-rouge">C-c C-x C-f</code> is close but does not meet my
|
||
expectation because:</p>
|
||
|
||
<ul>
|
||
<li>It prompts me to input the marker, which
|
||
is extra overhead</li>
|
||
<li>It requires me to mark the region first. Too much ceremony needed.</li>
|
||
</ul>
|
||
|
||
<p>Basically, I need a command that can do what I mean
|
||
(<a href="https://en.wikipedia.org/wiki/DWIM">DWIM</a>).</p>
|
||
|
||
<p>My editing intention goes something like: <strong>Depend on the cursor position, it
|
||
either emphasizes the current word, or starts a new emphasis region.</strong></p>
|
||
|
||
<p>I found <a href="https://emacs.stackexchange.com/a/14586">this SO
|
||
answer</a>. With some tweaks, I
|
||
had a working solution:</p>
|
||
|
||
<div class="language-elisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">;; Adapted from https://emacs.stackexchange.com/a/14586</span>
|
||
<span class="p">(</span><span class="nb">defun</span> <span class="nv">org-emphasize-dwim</span> <span class="p">(</span><span class="k">&optional</span> <span class="nb">char</span><span class="p">)</span>
|
||
<span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
|
||
<span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">region-active-p</span><span class="p">)</span>
|
||
<span class="p">(</span><span class="nv">jz/maybe-mark-word</span><span class="p">))</span>
|
||
<span class="p">(</span><span class="nv">org-emphasize</span> <span class="nb">char</span><span class="p">))</span>
|
||
|
||
<span class="p">(</span><span class="nb">defun</span> <span class="nv">org-emphasize-with-verbatim-dwim</span> <span class="p">()</span>
|
||
<span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
|
||
<span class="p">(</span><span class="nv">org-emphasize-dwim</span> <span class="nv">?=</span><span class="p">))</span>
|
||
|
||
<span class="p">(</span><span class="nb">defun</span> <span class="nv">org-emphasize-with-code-dwim</span> <span class="p">()</span>
|
||
<span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
|
||
<span class="p">(</span><span class="nv">org-emphasize-dwim</span> <span class="nv">?~</span><span class="p">))</span>
|
||
</code></pre></div></div>
|
||
|
||
<p>I use <code class="language-plaintext highlighter-rouge">code</code> and <code class="language-plaintext highlighter-rouge">verbatim</code> a lot, so I created two dedicated
|
||
functions for them: <code class="language-plaintext highlighter-rouge">(org-emphasize-with-verbatim-dwim)</code> and
|
||
<code class="language-plaintext highlighter-rouge">(org-emphasize-with-code-dwim)</code>.</p>
|
||
|
||
<p>Below is the implementation of <code class="language-plaintext highlighter-rouge">(jz/maybe-mark-word)</code>.</p>
|
||
|
||
<div class="language-elisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">jz/cursor-outside-of-any-word</span> <span class="p">()</span>
|
||
<span class="p">(</span><span class="nb">not</span> <span class="p">(</span><span class="nv">bounds-of-thing-at-point</span> <span class="ss">'word</span><span class="p">)))</span>
|
||
|
||
<span class="p">(</span><span class="nb">defun</span> <span class="nv">jz/cursor-at-beginning-of-a-word</span> <span class="p">()</span>
|
||
<span class="p">(</span><span class="nb">eq</span> <span class="p">(</span><span class="nv">point</span><span class="p">)</span> <span class="p">(</span><span class="nb">car</span> <span class="p">(</span><span class="nv">bounds-of-thing-at-point</span> <span class="ss">'word</span><span class="p">))))</span>
|
||
|
||
|
||
<span class="p">(</span><span class="nb">defun</span> <span class="nv">jz/maybe-mark-word</span> <span class="p">()</span>
|
||
<span class="s">"Mark the current word. If cursor is outside of a word bounds, mark the empty position."</span>
|
||
<span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
|
||
<span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nb">or</span> <span class="p">(</span><span class="nv">jz/cursor-outside-of-any-word</span><span class="p">)</span> <span class="p">(</span><span class="nv">jz/cursor-at-beginning-of-a-word</span><span class="p">))</span>
|
||
<span class="p">(</span><span class="nv">backward-word</span><span class="p">))</span>
|
||
<span class="p">(</span><span class="nb">unless</span> <span class="p">(</span><span class="nv">jz/cursor-outside-of-any-word</span><span class="p">)</span>
|
||
<span class="p">(</span><span class="nv">mark-word</span><span class="p">)))</span>
|
||
</code></pre></div></div>
|
||
|
||
<p><strong>The gist is to prevent calling <code class="language-plaintext highlighter-rouge">(backward-word)</code> if the cursor is at
|
||
the beginning of a word, or outside of a word</strong>.</p>
|
||
|
||
<p>Finally, I bind the functions with backtick key because I found myself
|
||
rarely use it, so I bind the keystrokes:</p>
|
||
|
||
<div class="language-elisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nb">defun</span> <span class="nv">jz/org-mode-hook</span> <span class="p">()</span>
|
||
<span class="p">(</span><span class="nv">local-set-key</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">"M-`"</span><span class="p">)</span> <span class="ss">'org-emphasize-with-verbatim-dwim</span><span class="p">)</span>
|
||
<span class="p">(</span><span class="nv">local-set-key</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">"`"</span><span class="p">)</span> <span class="ss">'org-emphasize-with-code-dwim</span><span class="p">))</span>
|
||
|
||
<span class="p">(</span><span class="nv">add-hook</span> <span class="ss">'org-mode-hook</span> <span class="ss">'jz/org-mode-hook</span><span class="p">)</span>
|
||
</code></pre></div></div>
|
||
|
||
<p>Right now if I press the <code class="language-plaintext highlighter-rouge">`</code> or <code class="language-plaintext highlighter-rouge">M-`</code> key, Emacs emphasizes the
|
||
current word correctly as I like!</p> |