emacs/var/elfeed/db/data/0f/0fead78ab7597e8302a1bf2c299f351cf0e6efac
2022-01-03 12:49:32 -06:00

77 lines
6.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<p>How can we get org-mode to emphasize things smartly? Lets 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">&amp;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>