30 lines
4.2 KiB
Plaintext
30 lines
4.2 KiB
Plaintext
<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 it’s 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>Here’s 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>It’s 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;">&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 you’re a Helm or Ivy user, as well as to write one for the comint mode <code>M-x shell</code>.</p> |