trying to fix

This commit is contained in:
Chris Cochrun 2022-01-03 12:41:35 -06:00
parent fa407dfeb6
commit e013d7569e
22945 changed files with 447936 additions and 0 deletions

View file

@ -0,0 +1,77 @@
<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>