Come creare alias di directory indietro / avanti per eshell?


9

Per anni ho usato uno script zsh che fa sì che un pushd accada implicitamente ogni volta che cambi directory. Lo script imposta anche gli alias 'b' e 'f', abbreviazione di avanti e indietro, che ti muovono su e giù nello stack, in modo simile ai pulsanti avanti e indietro in un browser web. Sessione di esempio:

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

L'ho trovato incredibilmente utile e mi chiedevo, qual è il modo migliore per configurarlo in eshell?

Modifica: vedi il codice con cui sono andato qui, leggera modifica di seguito: https://gist.github.com/jgarvin/0627ed76a773ade222f6

Risposte:


6

Quanto segue salva la cdcronologia e fornisce comandi eshell be fper navigare in quella cronologia:

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

A proposito, il comando integrato di eshell cdfornisce già diversi modi per passare alle directory della cronologia, ad esempio cd -per l'ultima directory, cd -1per la penultima directory e cd =tmpper l'ultima directory che contiene tmp. Vedi built-in (eshell) per maggiori informazioni.


Funziona benissimo! L'unica avvertenza che ho è che se fai 'b' più e più volte oltre la fine dello stack, spingerà l'ultima directory sullo stack più e più volte. Quindi, se fai 'b' ripetutamente fino a quando non smette di tornare indietro, quindi premi 4 volte in più, dovrai fare 'f' 4 volte prima che inizi effettivamente ad andare avanti nella storia della directory. Forse è necessario solo un controllo per assicurarsi che nel gancio di modifica della directory sia effettivamente cambiato?
Joseph Garvin,

Oop, potrebbe essere necessario reimpostare eshell-hist-indexa zero una volta che l'utente esegue cdeshell.
xuchunyang,

Un altro suggerimento, non sarebbe meglio usare defvar-local? Altrimenti penso che tu stia condividendo la stessa storia del cd in tutti gli eshells che penso sia un comportamento piuttosto sorprendente.
Joseph Garvin,

Sì, l'uso delle variabili buffer-local qui è corretto e lo farò, attualmente l'utilizzo setqè per facilitare lo sviluppo (perché li sto indossando nel *scratch*buffer e ho bisogno di esaminarne frequentemente i valori).
xuchunyang,

Ecco il mio tentativo: gist.github.com/jgarvin/0627ed76a773ade222f6 . L'ho cambiato per usare defvar-local e l'ho fatto in modo che la directory di partenza sia inserita nella cronologia.
Joseph Garvin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.