Expansion automatique des alias dans Zsh

Vincent Bernat

Pour éviter les frappes superflues, fish propose des abréviations de commandes qui se substituent après avoir appuyé sur la barre d’espace. Nous pouvons émuler cette fonctionnalité avec Zsh:

# Définition de abbrev-alias pour la substitution automatique des alias
typeset -ga _vbe_abbrevations
abbrev-alias() {
    alias $1
    _vbe_abbrevations+=(${1%%\=*})
}
_vbe_zle-autoexpand() {
    local -a words; words=(${(z)LBUFFER})
    if (( ${​#_vbe_abbrevations[(r)${words[-1]}]} )); then
        zle _expand_alias
    fi
    zle magic-space
}
zle -N _vbe_zle-autoexpand
bindkey -M emacs " " _vbe_zle-autoexpand
bindkey -M isearch " " magic-space

# Corriger des typos
(( $+commands[git] )) && abbrev-alias gti=git
(( $+commands[grep] )) && abbrev-alias grpe=grep
(( $+commands[sudo] )) && abbrev-alias suod=sudo
(( $+commands[ssh] )) && abbrev-alias shs=ssh

# Économiser quelques touches
(( $+commands[git] )) && abbrev-alias gls="git ls-files"
(( $+commands[ip] )) && {
  abbrev-alias ip6='ip -6'
  abbrev-alias ipb='ip -brief'
}

# Options difficiles à se souvenir
(( $+commands[mtr] )) && abbrev-alias mtrr='mtr -wzbe'

Voici une démonstration où git ls-files remplace gls après avoir appuyé sur la barre d’espace:

Substitution automatique de gls par git ls-files

Je n’étends pas automatiquement tous les alias. Je continue à utiliser des alias classiques pour modifier légèrement le comportement d’une commande ou pour des abréviations bien connues:

alias df='df -h'
alias du='du -h'
alias rm='rm -i'
alias mv='mv -i'
alias ll='ls -ltrhA'