emacs/var/elfeed/db/data/bc/bc9af7e07ff7f6ac4f60fd09a792372caf8c6832
2022-01-03 12:49:32 -06:00

30 lines
4.2 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>A quick note that I thought might be interesting to document.</p>
<p>As befits a shell written in elisp, eshell is extremely easy to modify to your use. There are a few packages floating around that add autojump/fasd/z type functionality to eshell. These let you jump quickly to any previously visited directory. As it turns out its very easy to implement a more powerful version of this by piggybacking off of <a href="https://github.com/karthink/consult-dir">consult-dir</a>.</p>
<p>Heres a <strong>z</strong> command that lets you jump to any previously visited directory, as well as any bookmark, project or emacs-wide recent directory:</p>
<video controls="controls" loop="loop" width="700">
<source src="https://karthinks.com/img/eshell-z.mp4" type="video/mp4" />
Your browser does not support the video tag.
</video>
<p>Its a single function:</p>
<div class="highlight"><pre><code class="language-emacs-lisp">(<span style="color: #a2f;">defun</span> <span style="color: #b8860b;">eshell/z</span> (<span style="color: #a2f;">&amp;optional</span> <span style="color: #b8860b;">regexp</span>)
<span style="color: #b44;">"Navigate to a previously visited directory in eshell, or to
</span><span style="color: #b44;">any directory proferred by </span><span style="color: #b8860b;">`consult-dir'</span><span style="color: #b44;">."</span>
(<span style="color: #a2f;">let</span> ((<span style="color: #b8860b;">eshell-dirs</span> (<span style="color: #b8860b;">delete-dups</span>
(<span style="color: #00a000;">mapcar</span> <span style="color: #b8860b;">'abbreviate-file-name</span>
(<span style="color: #b8860b;">ring-elements</span> <span style="color: #b8860b;">eshell-last-dir-ring</span>)))))
(<span style="color: #a2f;">cond</span>
((<span style="color: #a2f;">and</span> (<span style="color: #b8860b;">not</span> <span style="color: #b8860b;">regexp</span>) (<span style="color: #a2f;">featurep</span> <span style="color: #b8860b;">'consult-dir</span>))
(<span style="color: #a2f;">let*</span> ((<span style="color: #b8860b;">consult-dir--source-eshell</span> <span style="color: #666;">`</span>(<span style="color: #a2f;">:name</span> <span style="color: #b44;">"Eshell"</span>
<span style="color: #a2f;">:narrow</span> <span style="color: #b44;">?e</span>
<span style="color: #a2f;">:category</span> <span style="color: #b8860b;">file</span>
<span style="color: #a2f;">:face</span> <span style="color: #b8860b;">consult-file</span>
<span style="color: #a2f;">:items</span> <span style="color: #666;">,</span><span style="color: #b8860b;">eshell-dirs</span>))
(<span style="color: #b8860b;">consult-dir-sources</span> (<span style="color: #00a000;">cons</span> <span style="color: #b8860b;">consult-dir--source-eshell</span>
<span style="color: #b8860b;">consult-dir-sources</span>)))
(<span style="color: #b8860b;">eshell/cd</span> (<span style="color: #00a000;">substring-no-properties</span>
(<span style="color: #b8860b;">consult-dir--pick</span> <span style="color: #b44;">"Switch directory: "</span>)))))
(<span style="color: #800;">t</span> (<span style="color: #b8860b;">eshell/cd</span> (<span style="color: #a2f;">if</span> <span style="color: #b8860b;">regexp</span> (<span style="color: #b8860b;">eshell-find-previous-directory</span> <span style="color: #b8860b;">regexp</span>)
(<span style="color: #00a000;">completing-read</span> <span style="color: #b44;">"cd: "</span> <span style="color: #b8860b;">eshell-dirs</span>)))))))
</code></pre></div><p>Plus <code>consult-dir</code>, of course.</p>
<p>Note that if you provide input to the command instead, <em>e.g.</em> <code>z doc</code>, it will jump directly to the last matching directory you visited in eshell, <em>i.e.</em> <code>~/Documents/</code> or something like it.</p>
<p>The idea is simple, and it should be trivial to write something similar if youre a Helm or Ivy user, as well as to write one for the comint mode <code>M-x shell</code>.</p>