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 du prompt 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 du prompt (il ne reste plus beaucoup d’espace pour écrire) :

Mon prompt ZSH

MISE À JOUR : Depuis que j’utilise le gestionnaire de fenêtres awesome, j’ai abandonné la date en partie droite du prompt en raison de son mauvais comportement lorsque la taille de la fenêtre change. J’ai indiqué la dernière version du prompt précédent avec le tag before-awesome. Ensuite, je suis passé sur un prompt de type powerline. Celui nécessite une fonte spécifique. La dernière version du précédent prompt est marqué avec le tag before-powerline. Voici à quoi ressemble le dernier prompt:

Capture d'écran du prompt ZSH avec 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 : 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
    ...
} && __