Journal Alterner les répertoires avec zsh

Posté par . Licence CC by-sa
6
16
jan.
2017

Vous utilisez souvent C-^ pour alterner les deux derniers fichiers ouverts dans vim ?
Sachez qu’il est possible de réaliser une fonctionnalité analogue avec le shell zsh !

Première étape, créer un fichier alter-dirs contenant :

emulate -R zsh

setopt local_options

setopt warn_create_global

LBUFFER="cd -"

zle accept-line

Ensuite, insérer ces lignes dans votre zshrc :

# Inutile si vous placez le fichier dans un répertoire
# déjà existant dans $fpath
fpath+=(/répertoire/de/votre/fichier/alter/dirs)

# Chargement à la demande ...
autoload alter-dirs

# Définition du raccourci

zle -N alter-dirs

bindkey '^\^' alter-dirs

Voilà ! Ouvrez un nouveau terminal zsh et le raccourci C-^ devrait alterner les deux derniers répertoires utilisés.

Je me demande comment j’ai pu faire sans, cher Nal.

  • # Need moar info

    Posté par . Évalué à 1.

    Je ne comprends pas ce que tu entends par « alterner les deux derniers fichiers ouverts ». J'ai tenté, j'ai ouvert 2 fichiers et C-^ ne fait rien chez moi dans vim.

    • [^] # Re: Need moar info

      Posté par . Évalué à 1.

      Ah, c’est vrai, j’utilise un clavier légèrement modifié par xmodmap (asciicircum pour ^). La version par défaut attend une lettre à laquelle s’associer et ne fonctionne pas dans les raccourcis.

      si la touche <f2> est libre, tu peux ajouter :

      nnoremap <f2> <C-^>

      dans ton vimrc, et utiliser <f2> pour alterner les deux derniers fichiers ouverts.

      Pareil pour l’astuce zsh d’ailleurs, si C-^ ne donne rien, vous pouvez toujours essayer avec un autre raccourci.

  • # 1 <CR>

    Posté par . Évalué à 0.

    Est-ce que

    1 + \<CR\>
    

    ne fait pas la même chose ?

    • [^] # Re: 1 <CR>

      Posté par . Évalué à 1.

      La solution ci-dessus insère automatiquement <CR>.

      J’utilise aussi des alias :

      alias 1="pushd ~1"
      alias 2="pushd ~2"
      ...

      Tu es sûr que 1 fonctionne avec les réglages d’usine ?

  • # cd -

    Posté par . Évalué à 8.

    Et cd -, non ?

    en plus je peux tab-compléter après le "-", ce qui me propose les répertoires précédents.

    En bonus, avec fasd je tape d foo pour aller à n'importe quel répertoire qui comporte "foo" dans son nom (et qui a déjà été accédé après l'installation de fasd).

    • [^] # Re: cd -

      Posté par . Évalué à 2.

      en plus je peux tab-compléter après le "-", ce qui me propose les répertoires précédents.

      Tiens j'ai pas ça dans ma config zsh, c'est quelle option?

    • [^] # Re: cd -

      Posté par . Évalué à 6.

      J'avoue que c'est ce que j'utilise.
      Je crois que c'est grâce à l'autopushd.

      Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

    • [^] # Re: cd -

      Posté par . Évalué à 1.

      Il existe effectivement pas mal de solutions pour se balader
      efficacement dans les répertoires, des utilitaires indépendants
      de recherche exacte ou floue à la pile de répertoire du shell.

      Mais à l’usage, c’est le répertoire -1 qui revient le plus souvent, et mérite
      donc une petite optimisation bien sympathique.

      • [^] # Re: cd -

        Posté par (page perso) . Évalué à 4. Dernière modification le 16/01/17 à 20:36.

        Il existe effectivement pas mal de solutions pour se balader efficacement dans les répertoires, des utilitaires indépendants de recherche exacte ou floue à la pile de répertoire du shell.

        Oui, il y a z par exemple, que j'ai découvert ici. Je ne peux plus m'en passer. Et évidemment cd -, mais c'est la base, ça.

        • [^] # Re: cd -

          Posté par . Évalué à 1.

          Bonne idée le concept fréquent/récent, vais essayer à l’occasion.

  • # sudo

    Posté par (page perso) . Évalué à 4.

    J'utilise une astuce similaire pour faire "sudo" la dernière commande ou pour insérer/retirer sudo en début de commande.

    # Meta-S will toggle sudo
    function vbe-sudo-command-line() {
        [[ -z $BUFFER ]] && zle up-history
        if [[ $BUFFER == sudo\ * ]]; then
            LBUFFER="${LBUFFER#sudo }"
        else
            LBUFFER="sudo $LBUFFER"
        fi
    }
    zle -N vbe-sudo-command-line
    bindkey "\es" vbe-sudo-command-line

    Toujours dans le même genre, je transforme à la volée le ... en ../.. (et ainsi de suite):

    # Expand ... to ../..
    function vbe-expand-dot-to-parent-directory-path() {
      case $LBUFFER in
        (./..|* ./..) LBUFFER+='.' ;; # In Go: "go list ./..."
        (..|*[ /=]..) LBUFFER+='/..' ;;
        (*) LBUFFER+='.' ;;
      esac
    }
    zle -N vbe-expand-dot-to-parent-directory-path
    bindkey "." vbe-expand-dot-to-parent-directory-path
    bindkey -M isearch "." self-insert
    • [^] # Re: sudo

      Posté par . Évalué à 1.

      Ah oui, encore plus rapide que le sudo !!. Je note.

    • [^] # Re: sudo

      Posté par (page perso) . Évalué à 3.

      Pour le ... -> ../.., il y a aussi tout simplement :

      alias -g '...'='../..'
      

      (expansé au moment de l'exécution, pas en cours de frappe)

      • [^] # Re: ...

        Posté par . Évalué à 2. Dernière modification le 17/01/17 à 16:10.

        oui mais, si tu fais cela :

        • tu ne profites pas de la complétion sur .../<TAB>
        • le ... doit être un mot entier, donc cd .../Répertoire ne fonctionne pas

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.