Làm thế nào để tạo bí danh thư mục back / Forward cho eshell?


9

Trong nhiều năm, tôi đã sử dụng một tập lệnh zsh khiến cho một cú đẩy hoàn toàn xảy ra mỗi khi bạn thay đổi thư mục. Kịch bản cũng thiết lập các bí danh 'b' và 'f', viết tắt của tiến và lùi, giúp bạn di chuyển lên và xuống ngăn xếp, tương tự như các nút quay lại và chuyển tiếp trong trình duyệt web. Phiên ví dụ:

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

Tôi đã tìm thấy nó vô cùng hữu ích và tôi đã tự hỏi, cách tốt nhất để thiết lập điều này trong eshell là gì?

Chỉnh sửa: Xem mã tôi đã sử dụng ở đây, sửa đổi nhỏ bên dưới: https://gist.github.com/jgarvin/0627ed76a773ade222f6

Câu trả lời:


6

Sau đây lưu cdlịch sử và cung cấp các lệnh eshell bfđể điều hướng lịch sử đó:

;;*--- 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, lệnh tích hợp của eshell cdđã cung cấp một số cách để chuyển đến các thư mục lịch sử, ví dụ, cd -cho thư mục cuối cùng, cd -1cho thư mục áp chót và cd =tmpcho thư mục cuối cùng chứa tmp. Xem (eshell) Được xây dựng để biết thêm thông tin.


Điều này làm việc tuyệt vời! Tôi chỉ có một điều lưu ý là nếu bạn lặp đi lặp lại việc kết thúc ngăn xếp, nó sẽ đẩy thư mục cuối cùng lên ngăn xếp nhiều lần. Vì vậy, nếu bạn lặp đi lặp lại nhiều lần cho đến khi nó dừng lại, sau đó nhấn thêm 4 lần nữa, bạn sẽ phải thực hiện 4 lần nữa trước khi nó thực sự bắt đầu lại trong lịch sử dir. Có lẽ chỉ cần kiểm tra để đảm bảo trong thư mục thay đổi hook mà nó thực sự thay đổi?
Joseph Garvin

Rất tiếc, tôi có thể cần phải đặt lại eshell-hist-indexvề 0 khi người dùng chạy cdtừ eshell.
xuchunyang

Một đề nghị khác, sẽ tốt hơn nếu sử dụng defvar-local? Mặt khác, tôi nghĩ rằng bạn đang chia sẻ cùng một lịch sử cd trên tất cả các eshells mà tôi nghĩ sẽ là hành vi khá đáng ngạc nhiên.
Joseph Garvin

Có, sử dụng các biến cục bộ đệm ở đây là chính xác và tôi sẽ làm điều đó, hiện đang sử dụng setqlà để dễ phát triển (vì tôi muốn sử dụng các biến này trong *scratch*bộ đệm và tôi cần kiểm tra giá trị của chúng thường xuyên).
xuchunyang

Đây là nỗ lực của tôi: gist.github.com/jgarvin/0627ed76a773ade222f6 . Tôi đã thay đổi nó để sử dụng defvar-local và làm cho nó để thư mục bắt đầu được đưa vào lịch sử.
Joseph Garvin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.