Wie erstelle ich Back / Forward-Verzeichnis-Aliase für eshell?

9

Seit Jahren verwende ich ein zsh-Skript, das bei jedem Verzeichniswechsel implizit einen Pushd verursacht. Das Skript richtet auch Aliase 'b' und 'f' ein, kurz für vorwärts und rückwärts, die Sie auf dem Stapel auf und ab bewegen, ähnlich wie die Schaltflächen vor und zurück in einem Webbrowser. Beispielsitzung:

/etc $ cd /tmp
/tmp $ cd /bin
/bin $ b
/tmp $ b
/etc $ f
/tmp $ f
/bin $

Ich fand es unglaublich nützlich und habe mich gefragt, wie ich das am besten in Eshell einrichten kann.

Bearbeiten: Siehe den Code, mit dem ich hier gegangen bin, geringfügige Änderung von unten: https://gist.github.com/jgarvin/0627ed76a773ade222f6

Joseph Garvin
quelle

Antworten:

6

Im Folgenden wird der cdVerlauf gespeichert bund eshell-Befehle bereitgestellt f, um in diesem Verlauf zu navigieren:

;;*--- track cd history ------------------------------------------------*/
(defvar-local eshell-hist-dirs nil)

(add-hook 'eshell-directory-change-hook
          (defun eshell-update-hist-dir ()
            (push (eshell/pwd) eshell-hist-dirs)
            (setq eshell-hist-index 0)))

;;*--- navigate history ------------------------------------------------*/
(defvar-local eshell-hist-index 0)

(defun eshell-forward (n)
  (unless eshell-hist-dirs
    (user-error "eshell-hist-dirs is empty, cd a few times"))
  (let ((dirs eshell-hist-dirs)
        (index (+ eshell-hist-index n)))
    (prog1 (eshell/cd (nth index dirs))
      (setq eshell-hist-dirs dirs
            eshell-hist-index index))))

(defun eshell/b ()
  (eshell-forward 1))

(defun eshell/f ()
  (eshell-forward -1))

Übrigens bietet der integrierte cdBefehl von eshell bereits mehrere Möglichkeiten, zu Verlaufsverzeichnissen zu springen, z. B. cd -für das letzte Verzeichnis, cd -1für das vorletzte Verzeichnis und cd =tmpfür das letzte Verzeichnis, das enthält tmp. Weitere Informationen finden Sie unter (eshell) Built-Ins .

Xuchunyang
quelle
Das funktioniert super! Die einzige Einschränkung, die ich habe, ist, dass, wenn Sie das Ende des Stapels immer wieder überschreiten, das letzte Verzeichnis immer wieder auf den Stapel verschoben wird. Wenn Sie also immer und immer wieder 'b' machen, bis es nicht mehr rückwärts geht, und dann noch viermal drücken, müssen Sie viermal 'f' machen, bevor es tatsächlich wieder im Verzeichnisverlauf vorwärts geht. Vielleicht muss nur überprüft werden, ob sich im Verzeichniswechsel-Hook tatsächlich etwas geändert hat?
Joseph Garvin
Hoppla, ich muss möglicherweise eshell-hist-indexauf Null zurücksetzen , sobald der Benutzer cdvon eshell ausgeführt wird.
Xuchunyang
Ein weiterer Vorschlag: Wäre es nicht besser, defvar-local zu verwenden? Ansonsten denke ich, dass Sie über alle Eshells hinweg dieselbe CD-Geschichte teilen, was meiner Meinung nach ein ziemlich überraschendes Verhalten wäre.
Joseph Garvin
Ja, die Verwendung von pufferlokalen Variablen hier ist korrekt, und ich werde dies tun. Derzeit wird die Verwendung setqzur Vereinfachung der Entwicklung verwendet (da ich diese im *scratch*Puffer schreibe und ihre Werte häufig überprüfen muss).
Xuchunyang
Hier ist mein Versuch: gist.github.com/jgarvin/0627ed76a773ade222f6 . Ich habe es geändert, um defvar-local zu verwenden, und es so gemacht, dass das Startverzeichnis in den Verlauf aufgenommen wird.
Joseph Garvin