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

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.