¿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

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.


¡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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.