¿Cómo crear alias de directorio hacia atrás / adelante para eshell?

9

Durante años he estado usando un script zsh que hace que un pushd suceda implícitamente cada vez que cambia de directorio. El script también configura los alias 'b' y 'f', abreviados hacia atrás y hacia adelante, que lo mueven hacia arriba y hacia abajo en la pila, de manera similar a los botones hacia atrás y hacia adelante en un navegador web. Sesión de ejemplo:

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

Lo he encontrado increíblemente útil y me preguntaba, ¿cuál es la mejor manera de configurar esto en eshell?

Editar: vea el código con el que fui aquí, una ligera modificación de abajo: https://gist.github.com/jgarvin/0627ed76a773ade222f6

Joseph Garvin
fuente

Respuestas:

6

Lo siguiente guarda el cdhistorial y proporciona comandos de eshell by fpara navegar por ese historial:

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

Por cierto, el comando incorporado de eshell cdya proporciona varias formas de saltar a los directorios del historial, por ejemplo, cd -para el último directorio, cd -1para el penúltimo directorio y cd =tmppara el último directorio que contiene tmp. Ver (eshell) Incorporados para más información.

xuchunyang
fuente
¡Esto funciona muy bien! La única advertencia que tengo es que si haces 'b' una y otra vez pasado el final de la pila, empujará el último directorio a la pila una y otra vez. Entonces, si hace 'b' una y otra vez hasta que deje de retroceder, luego presione 4 veces más, tendrá que hacer 'f' 4 veces antes de que realmente comience a avanzar nuevamente en el historial de directorios. ¿Tal vez solo necesita una verificación para asegurarse de que en el enlace de cambio de directorio realmente haya cambiado?
Joseph Garvin el
Oop, podría necesitar restablecer eshell-hist-indexa cero una vez que el usuario se ejecute cddesde eshell.
xuchunyang el
Otra sugerencia, ¿no sería mejor usar defvar-local? De lo contrario, creo que está compartiendo el mismo historial de CD en todos los shells, lo que creo que sería un comportamiento bastante sorprendente.
Joseph Garvin el
Sí, usar las variables locales del búfer aquí es correcto y lo haré, actualmente usarlo setqes para facilitar el desarrollo (porque las escribo en el *scratch*búfer y necesito examinar sus valores con frecuencia).
xuchunyang
Aquí está mi intento: gist.github.com/jgarvin/0627ed76a773ade222f6 . Lo cambié para usar defvar-local y lo hice para que el directorio de inicio se coloque en el historial.
Joseph Garvin el