Comment créer des alias de répertoire back / forward pour eshell?

9

Depuis des années, j'utilise un script zsh qui provoque implicitement un pushd chaque fois que vous changez de répertoire. Le script définit également des alias «b» et «f», abrégés en arrière et en avant, qui vous déplacent vers le haut et vers le bas de la pile, de la même manière que les boutons précédent et suivant dans un navigateur Web. Exemple de session:

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

Je l'ai trouvé incroyablement utile et je me demandais, quelle est la meilleure façon de mettre cela en place en eshell?

Edit: Voir le code que j'ai utilisé ici, légère modification ci-dessous: https://gist.github.com/jgarvin/0627ed76a773ade222f6

Joseph Garvin
la source

Réponses:

6

Ce qui suit enregistre l' cdhistorique et fournit des commandes eshell bet fpour parcourir cet historique:

;;*--- 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, la commande intégrée d'eshell cdfournit déjà plusieurs façons de passer aux répertoires d'historique, par exemple, cd -pour le dernier répertoire, cd -1pour l'avant-dernier répertoire et cd =tmppour le dernier répertoire qui contient tmp. Voir (eshell) Built-ins pour plus d'informations.

xuchunyang
la source
Cela fonctionne très bien! La seule mise en garde que j'ai, c'est que si vous «b» maintes et maintes fois passez la fin de la pile, il poussera le dernier répertoire sur la pile encore et encore. Donc, si vous faites «b» encore et encore jusqu'à ce qu'il cesse de reculer, puis appuyez dessus 4 fois de plus, vous devrez faire «f» 4 fois avant qu'il ne recommence à avancer dans l'historique dir. Peut-être juste besoin d'une vérification pour vous assurer que le crochet de changement de répertoire a réellement changé?
Joseph Garvin
Oop, je pourrais avoir besoin de remettre eshell-hist-indexà zéro une fois que l'utilisateur s'exécute à cdpartir d'Eshell.
xuchunyang
Une autre suggestion, ne serait-il pas préférable d'utiliser defvar-local? Sinon, je pense que vous partagez la même histoire de CD à travers tous les eshells, ce qui, je pense, serait un comportement assez surprenant.
Joseph Garvin
Oui, l'utilisation de variables locales de tampon est correcte et je vais le faire, actuellement, setqc'est pour faciliter le développement (car je les écris dans le *scratch*tampon et j'ai besoin d'examiner leurs valeurs fréquemment).
xuchunyang
Voici ma tentative: gist.github.com/jgarvin/0627ed76a773ade222f6 . Je l'ai changé pour utiliser defvar-local et l'ai fait pour que le répertoire de départ soit mis dans l'historique.
Joseph Garvin