eshellのバック/フォワードディレクトリエイリアスを作成する方法


9

私は長年、zshスクリプトを使用してきました。これにより、ディレクトリを変更するたびに、pushdが暗黙的に発生します。このスクリプトは、「b」および「f」エイリアスを設定します。これは、Webブラウザーの「戻る」および「進む」ボタンと同様に、スタックを上下に移動します。セッションの例:

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

私はそれが信じられないほど便利であると思ったので、これをeshellに設定するための最良の方法は何ですか?

編集:私がここで行ったコードを参照してください、以下のわずかな変更:https//gist.github.com/jgarvin/0627ed76a773ade222f6

回答:


6

以下は、節約cd歴史とESHELLコマンドを提供bし、fその歴史をナビゲートします:

;;*--- 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))

ところで、eshellの組み込みcdコマンドは、たとえば、cd -最後のディレクトリ、cd -1最後から2番目のディレクトリ、およびcd =tmpを含む最後のディレクトリなど、履歴ディレクトリにジャンプするいくつかの方法をすでに提供していますtmp。詳細については、(eshell)ビルトインを参照してください。


これはうまくいきます!唯一の注意点は、スタックの最後を何度も「b」を超えると、最後のディレクトリがスタックに何度もプッシュされることです。したがって、 'b'を何度も繰り返して、後戻りが停止し、さらに4回押すと、dir履歴で実際に前進を始める前に、 'f'を4回実行する必要があります。多分ちょうどそれが実際に変更されたことをディレクトリ変更フックで確認するためのチェックが必要ですか?
Joseph Garvin、2015年

おっと、eshell-hist-indexユーザーがcdeshellから実行したら、ゼロにリセットする必要があるかもしれません。
xuchunyang 2015年

もう1つの提案は、defvar-localを使用する方が良いのではないでしょうか?そうでなければ、あなたはすべてのeshellで同じCDの履歴を共有していると思いますが、これはかなり驚くべき動作だと思います。
Joseph Garvin

はい、ここでバッファローカル変数を使用することは正しく、私はそれを行います。現在使用しているのsetqは、開発を容易にするためです(これらを*scratch*バッファで書き込み、頻繁に値を調べる必要があるため)。
xuchunyang 2015年

これが私の試みです:gist.github.com/jgarvin/0627ed76a773ade222f6。defvar-localを使用するように変更し、開始ディレクトリが履歴に追加されるようにしました。
Joseph Garvin、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.