Bagaimana cara membuat alias direktori balik / maju untuk eshell?

9

Selama bertahun-tahun saya telah menggunakan skrip zsh yang menyebabkan pushd terjadi secara implisit setiap kali Anda mengubah direktori. Script juga mengatur alias 'b' dan 'f', kependekan dari belakang dan ke depan, yang menggerakkan Anda ke atas dan ke bawah tumpukan, mirip dengan tombol kembali dan maju di browser web. Sesi contoh:

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

Saya merasa ini sangat berguna dan saya bertanya-tanya, apa cara terbaik untuk mengatur ini di eshell?

Sunting: Lihat kode yang saya gunakan di sini, sedikit modifikasi di bawah ini: https://gist.github.com/jgarvin/0627ed76a773ade222f6

Joseph Garvin
sumber

Jawaban:

6

Berikut ini menyimpan cdriwayat dan menyediakan perintah eshell bdan funtuk menavigasi riwayat itu:

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

BTW, cdperintah bawaan eshell sudah menyediakan beberapa cara untuk melompat ke direktori sejarah, misalnya, cd -untuk direktori terakhir, cd -1untuk direktori kedua terakhir dan cd =tmpuntuk direktori terakhir yang berisi tmp. Lihat (eshell) Built-in untuk informasi lebih lanjut.

xuchunyang
sumber
Ini sangat bagus! Satu-satunya peringatan yang saya miliki adalah bahwa jika Anda melakukan 'b' berkali-kali melewati ujung tumpukan, itu akan mendorong direktori terakhir ke tumpukan berulang-ulang. Jadi jika Anda melakukan 'b' berulang kali sampai berhenti mundur, lalu tekan 4 kali lagi, Anda harus melakukan 'f' 4 kali sebelum benar-benar mulai maju dalam sejarah dir lagi. Mungkin hanya perlu pemeriksaan untuk memastikan di direktori ganti hook bahwa itu benar-benar berubah?
Joseph Garvin
Ups, saya mungkin perlu mengatur ulang eshell-hist-indexke nol setelah pengguna menjalankan cddari eshell.
xuchunyang
Satu saran lain, bukankah lebih baik menggunakan defvar-local? Kalau tidak, saya pikir Anda sedang berbagi sejarah cd yang sama di semua eshell yang saya pikir akan perilaku yang cukup mengejutkan.
Joseph Garvin
Ya, menggunakan variabel buffer-lokal di sini adalah benar dan saya akan melakukan itu, saat ini menggunakan setqadalah untuk kemudahan pengembangan (karena saya ingin ini dalam *scratch*buffer dan saya perlu memeriksa nilai-nilai mereka sering).
xuchunyang
Inilah upaya saya: gist.github.com/jgarvin/0627ed76a773ade222f6 . Saya mengubahnya untuk menggunakan defvar-local dan membuatnya jadi direktori awal dimasukkan ke dalam sejarah.
Joseph Garvin