Réécriture de mon .zshrc

Vincent Bernat

J’uti­lise Zsh de­puis main­te­nant 10 ans. Il s’agit d’un shell conçu pour une uti­li­sa­tion in­ter­ac­tive mais qui est aussi as­sez puis­sant quand il s’agit d’écrire des scripts. Mon .zshrc a ac­cu­mulé au fil des an­nées un cer­tain nombre de fonc­tion­na­li­tés mais je vou­lais le ré­écrire pour deux raisons :

  1. Je n’uti­li­sais pas vrai­ment les nom­breuses fonc­tion­na­li­tés of­fertes par Zsh comme l’ex­pan­sion des pa­ra­mètres, les ta­bleaux, les ex­pres­sions arith­mé­tiques, etc. J’uti­li­sais beau­coup de | head, | awk, | sed alors que Zsh sait faire tout cela en in­terne (et de ma­nière très li­sible, comme ${${(f)~~"$(< /etc/hosts)"}%%\#*}).

  2. J’em­ployais énor­mé­ment de hacks pour ac­co­mo­der cer­taines confi­gu­ra­tions qui n’existent sans doute plus. Il y avait éga­le­ment de nom­breuses par­ties du code qui tes­taient le nom de la ma­chine avant de s’exé­cu­ter. Pas très pra­tique à trans­po­ser sur une autre machine.

Le pro­jet oh-my-zsh four­nit une confi­gu­ra­tion très com­plète et flexible de Zsh. On y trouve une qua­ran­taine de plu­gins, de nom­breux thèmes et un cadre pour ajou­ter les fonc­tion­na­li­tés man­quantes. L’idée prin­ci­pale est de for­ker ce pro­jet et d’y ap­por­ter les mo­di­fi­ca­tions que l’on sou­haite. J’uti­li­sais au­pa­ra­vant une ver­sion mo­di­fiée de l’in­vite Zsh de Phil! et oh-my-zsh en contient une va­ria­tion sous le nom de jonathan.

Tou­te­fois, j’ai dé­cidé de re­par­tir de zéro (en re­pre­nant des bonnes idées sur oh-my-zsh). En ef­fet, en ce qui concerne le shell, j’aime bien confi­gu­rer, à la vir­gule près, chaque fonc­tion­na­lité et oh-my-zsh four­nit en stan­dard un cer­tain nombre de choses (des alias, des op­tions, des fonc­tions) que je ne sou­haite pas uti­li­ser. Plu­tôt que de sup­pri­mer la moi­tié du code, il me sem­blait plus simple de par­tir de zéro.

Le ré­sul­tat est dis­po­nible sur GitHub. Bien qu’il soit pos­sible de l’uti­li­ser tel quel, il me semble pré­fé­rable de vo­ler et d’adap­ter les mor­ceaux de code qui vous in­té­ressent. Voici la cap­ture d’écran de l’in­vite (il ne reste plus beau­coup d’es­pace pour écrire) :

Mon invite Zsh
Mon invite Zsh

Mise à jour (02.2013)

De­puis que j’uti­lise le ges­tion­naire de fe­nêtres awe­some, j’ai aban­donné la date en par­tie droite de l’in­vite en rai­son de son mau­vais com­por­te­ment lorsque la taille de la fe­nêtre change. J’ai in­di­qué la der­nière ver­sion de l’in­vite pré­cé­dente avec le tag before-awesome. En­suite, je suis passé sur une in­vite de type po­wer­line. Celle-ci né­ces­site une fonte spé­ci­fique. La der­nière ver­sion de l’in­vite pré­cé­dente est mar­quée avec le tag before-powerline. Voici à quoi res­semble l’in­vite actuelle :

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

À titre d’illus­tra­tion, voici le bout de code qui ini­tia­lise la va­riable EDITOR. Il uti­lise no­tam­ment une fonc­tion ano­nyme (pour res­treindre la por­tée des va­riables lo­cales) et un ta­bleau. Pour un autre exemple, voyez com­ment je sé­lec­tionne une lo­cale 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’uti­li­sa­tion des fonc­tions ano­nymes a été in­tro­duite dans Zsh 4.3.7. Sur une ver­sion plus an­cienne, le code ci-des­sus ne fonc­tionne pas. J’uti­lise donc une fonc­tion clas­sique à la place :

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