Réécriture de mon .zshrc

Vincent Bernat

J’utilise Zsh depuis maintenant 10 ans. Il s’agit d’un shell conçu pour une utilisation interactive mais qui est aussi assez puissant quand il s’agit d’écrire des scripts. Mon .zshrc a accumulé au fil des années un certains nombres de fonctionnalités mais je voulais le réécrire pour deux raisons :

  1. Je n’utilisais pas vraiment les nombreuses fonctionnalités offertes par Zsh comme l’expansion des paramètres, les tableaux, les expressions arithmétiques, etc. J’utilisais beaucoup de | head, | awk, | sed alors que Zsh sait faire tout cela en interne (et de manière très lisible, comme ${${(f)~~"$(</etc/hosts)"}%%\#*}).

  2. J’employais énormément de hacks pour accomoder certaines configurations qui n’existent sans doute plus. Il y avait également de nombreuses parties du code qui testaient le nom de la machine avant de s’exécuter. Pas très pratique à transposer sur une autre machine.

Le projet oh-my-zsh fournit une configuration très complète et flexible de Zsh. On y trouve une quarantaine de plugins, de nombreux thèmes et un cadre pour ajouter les fonctionnalités manquantes. L’idée principale est de forker ce projet et d’y apporter les modifications que l’on souhaite. J’utilisais auparavant une version modifiée de l’invite Zsh de Phil! et oh-my-zsh en contient une variation sous le nom de jonathan.

Toutefois, j’ai décidé de repartir de zéro (en reprenant des bonnes idées sur oh-my-zsh). En effet, en ce qui concerne le shell, j’aime bien configurer, à la virgule près, chaque fonctionnalité et oh-my-zsh fournit en standard un certain nombre de choses (des alias, des options, des fonctions) que je ne souhaite pas utiliser. Plutôt que de supprimer la moitié du code, il me semblait plus simple de partir de zéro.

Le résultat est disponible sur GitHub. Bien qu’il soit possible de l’utiliser tel quel, il me semble préférable de voler et d’adapter les morceaux de code qui vous intéressent. Voici la capture d’écran de l’invite (il ne reste plus beaucoup d’espace pour écrire) :

Mon invite Zsh
Mon invite Zsh

Mise à jour (02.2013)

Depuis que j’utilise le gestionnaire de fenêtres awesome, j’ai abandonné la date en partie droite de l’invite en raison de son mauvais comportement lorsque la taille de la fenêtre change. J’ai indiqué la dernière version de l’invite précédente avec le tag before-awesome. Ensuite, je suis passé sur une invite de type powerline. Celle-ci nécessite une fonte spécifique. La dernière version de l’invite précédente est marquée avec le tag before-powerline. Voici à quoi ressemble l’invite actuelle :

Capture d'écran de l'invite Zsh avec powerline
Invite Zsh utilisant une fonte powerline

À titre d’illustration, voici le bout de code qui initialise la variable EDITOR. Il utilise notamment une fonction anonyme (pour restreindre la portée des variables locales) et un tableau. Pour un autre exemple, voyez comment je sélectionne une locale valide.

() {
    local -a editors
    local editor
    editors=(
        "emacs23 -Q -D -nw" # Fast emacs
        "jove" "mg" "jed"   # Emacs clone
        "vim" "vi"          # vi
        "editor")           # fallback
    for editor in $editors; do
        (( $+commands[$editor[(w)1]] )) && {
            export EDITOR=$editor
            break
        }
    done
}

Enjoy !

Mise à jour (07.2011)

L’utilisation des fonctions anonymes a été introduite dans Zsh 4.3.7. Sur une version plus ancienne, le code ci-dessus ne fonctionne pas. J’utilise donc une fonction classique à la place :

__() {
    local -a editors
    local editor
    ...
} && __