38 lines
3.2 KiB
Plaintext
38 lines
3.2 KiB
Plaintext
<p>I don’t know about you, but from time to time I definitely have the need to
|
||
re-run some Emacs command that takes user input (e.g. <code class="language-plaintext highlighter-rouge">query-replace</code>). For the
|
||
purpose of this article let’s call such commands “complex” commands.
|
||
Obviously we can just invoke the same command, provide again the input (directly or using some parameter history if available), but it would be nice if there was
|
||
a faster way to do this.</p>
|
||
|
||
<p>As it’s usually the case with Emacs, such a way already exists - the
|
||
built-in command <code class="language-plaintext highlighter-rouge">repeat-complex-command</code>. By default it’s bound to both
|
||
<code class="language-plaintext highlighter-rouge">C-x M-:</code> and <code class="language-plaintext highlighter-rouge">C-x M-ESC</code>.<sup id="fnref:1"><a class="footnote" href="https://emacsredux.com/blog/2021/11/24/redo-complex-command/#fn:1" rel="footnote">1</a></sup> When you invoke the command you’ll see in the
|
||
minibuffer the last Emacs command you ran and you can use <code class="language-plaintext highlighter-rouge">M-n</code> and <code class="language-plaintext highlighter-rouge">M-p</code> to move
|
||
forward and backward in the command history.</p>
|
||
|
||
<p>You’ll notice that the commands are listed as Emacs Lisp code that you can edit
|
||
directly if needed. You’ll also notice there are no commands that don’t any parameters on the list. Imagine something like:</p>
|
||
|
||
<div class="language-emacs-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">describe-key</span> <span class="o">'</span><span class="p">((</span><span class="s">"\272"</span> <span class="o">.</span> <span class="nv">[134217786]</span><span class="p">)))</span>
|
||
<span class="p">(</span><span class="nv">occur</span> <span class="s">"emacs"</span> <span class="no">nil</span><span class="p">)</span>
|
||
<span class="p">(</span><span class="nv">projectile-ag</span> <span class="s">"emacs"</span> <span class="no">nil</span><span class="p">)</span>
|
||
<span class="p">(</span><span class="nv">markdown-insert-gfm-code-block</span> <span class="s">"emacs-lisp"</span> <span class="no">nil</span><span class="p">)</span>
|
||
</code></pre></div></div>
|
||
|
||
<p>This might also give you a hint as to why the keybinding <code class="language-plaintext highlighter-rouge">C-x M-:</code> was chosen -
|
||
it’s pretty close to <code class="language-plaintext highlighter-rouge">M-:</code> (<code class="language-plaintext highlighter-rouge">eval-expression</code>), which allows you to run
|
||
arbitrary Emacs Lisp code from the minibuffer.</p>
|
||
|
||
<p>When it comes to Emacs we’re all constantly learning. I didn’t know about this
|
||
command until several days ago I saw it in a
|
||
<a href="https://twitter.com/mickeynp/status/1457826371057639429?s=20">tweet</a> shared by
|
||
<a href="https://twitter.com/mickeynp">Mickey Petersen</a>, a true Master of Emacs. Thanks
|
||
for the tip, Mickey!</p>
|
||
|
||
<div class="footnotes">
|
||
<ol>
|
||
<li id="fn:1">
|
||
<p>Not exactly the most convenient keybindings, right? <a class="reversefootnote" href="https://emacsredux.com/blog/2021/11/24/redo-complex-command/#fnref:1">↩</a></p>
|
||
</li>
|
||
</ol>
|
||
</div> |