9 mar
2008
Comme promis dans mon post précédent sur la personnalisation du shell sous Linux, on va maintenant essayer de booster encore un peu notre shell en lui rajoutant des fonctionnalités comme la complétion automatique des options pour certaines commandes, des paquets pour apt, et bien d'autres encore, pour avoir un shell comme ça :
(note : toutes les commandes suivantes ont été réalisées sur la distribution Linux Debian 4.0 « Etch ». Cependant, la plupart des commandes et fichiers doivent être identiques ou quelque peu adaptés selon les paquets présents pour fonctionner sur une autre distribution)
Installation
ZSH est un paquet disponible dans la plupart des distributions, et peut de toute façon être installé à partir d'un archive disponible sur www.zsh.org. Dans le cas d'un utilisateur sous Debian utilisant le gestionnaire de paquets apt, il suffit donc de faire (en root) :
apt-get install zshou bien si vous adoptez les alias conseillés dans mon billet précédent :
i zsh
Une fois le paquet installé, on va commencer par se délogguer du compte root pour retourner sur notre compte user. Ensuite, on va appliquer zsh comme shell par défaut à notre compte utilisateur en utilisant la commande chsh, pour CHange SHell, de cette manière :
ATTENTION : il faut bien renseiger le path COMPLET de l'exécutable, sinon il se peut que vous ne puissiez plus jamais vous logguer sur votre machine. En réalité, d'après la page de manuel de chsh, il est possible de mettre n'importe quel shell disponible dans le fichier /etc/shells, sauf si on est superutilisateur, où on peut mettre n'importe quoi.
[user@host][~] chshLà vous allez devoir rentrer votre mot de passe, et vous allez obtenir quelque chose ressemblant à ça :
Changement d'interpréteur de commandes initial pour user
Entrez la nouvelle valeur ou « Entrée » pour conserver la valeur proposée
Interpréteur de commandes initial [/bin/bash]:Il suffit donc de rentrer le path de zsh que l'on obtient en faisant un
which zshpuis de valider. Et voilà, notre shell par défaut est zsh ! Pourtant, on voit pas grand changement ... mais c'est normal, parce que cela va être pris en compte uniquement à partir de la prochaine console que vous lancerez, ou bien si vous lancez tout de suite zsh :
zsh
(En cas de mauvaise manipulation : logguez-vous en root, et éditez le fichier /etc/passwd, il suffit de trouver la ligne correspondant à l'utilisateur, et de changer le tout dernier champ par /bin/bash ce qui donne à peu près :
test:x:1012:1015:User de test,,,:/home/test:/bin/bashpuis essayez à nouveau de vous logguer.)
Configuration
Au premier lancement de zsh, un menu va apparaître vous demandant quoi faire :
This is the Z Shell configuration function for new users, zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~). This function can help you with a few settings that should
make your use of the shell easier.
You can:
(q) Quit and do nothing. The function will be run again next time.
(0) Exit, creating the file ~/.zshrc containing just a comment.
That will prevent this function being run again.
(1) Continue to the main menu.
Vous pouvez suivre pas-à-pas le menu en faisant 1, et ajuster votre configuration comme bon vous semble grâce aux instructions. Mais une fois cette première configuration terminée, nous allons tout de même explorer le fichier ~/.zshrc afin de voir ce qu'il contient, et le modifier selon nos besoins.
Note : si vous avez une erreur du genre :
~/.zshrc:setopt:5: no such option: VOTREOPTIONça veut dire que vous avez mal écrit l'option, ou bien qu'elle n'est pas disponible dans votre version de zsh
Options
Dans ce fichier, on va s'intéresser aux commandes setopt et unsetopt qui permettent respectivement d'activer et de désactiver des options, et prennent en paramètre une liste d'options. Grâce au menu d'introduction, vous avez du activer un certain nombre de ces options, voici celles que je vous recommande (au moins à essayer) :
- setopt auto_cd : évite de taper
, mais justecd pathpath - setopt correct : permet de corriger les petites erreurs de frappes de ce genre :
[test@kiwi][~] mdkir test zsh: correct 'mdkir' to 'mkdir' [nyae]? - unsetopt beep ou setopt beep : permet de désactiver les bips lors de la complétion automatique (bip bien connu des utilisateurs d'Ubuntu)
Complétion automatique
Maintenant on va ajouter la complétion automatique :
autoload -U compinit
compinitpuis de préciser ce sur quoi on ajoute la complétion :
zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin
/usr/sbin /usr/bin /sbin /bin /usr/X11R6/binOn va ensuite ajouter un cache qui va nous servir entre autre pour le gestionnaire de paquets, afin d'avoir une complétion la plus fluide possible :
zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path ~/.zsh/cache
Amélioration du prompt
On va commencer par charger le module qui sert à utiliser des prompts :
autoload -U promptinit
promptinit
à partir de ce moment, on peut lister les prompts par défaut déjà définis grâce à la commande (une fois que vous aurez sourcé votre ~/.zshrc bien entendu) :
prompt -lpuis voir ce qu'ils donnent directement grâce à
prompt -p LENOMDUTHEMESi vous en trouvez un qui vous plait, par exemple le theme fire
vous pouvez l'appliquez en utilisant l'argument -s de cette façon :
prompt -s fire
Si vous n'avez pas trouvé votre bonheur dans les prompts disponibles, vous allez pouvoir faire votre propre prompt personnalisé ! Voici tout d'abord les caractères d'échappement dont vous pourrez avoir besoin :
- %d : le répertoire courant, depuis la racine
- %~ : le répertoire courant, relatif à votre home (~/)
- %B[...]%b : balise de début et de fin pour mettre [...] en gras
- %U[....]%u : balise de début et de fin pour mettre [...] en souligné
- %M : le nom complet du serveur (ex: kiwi.cyber116.fr)
- %m : le nom du serveur, s'arrétant au premier '.' (ex : kiwi)
- %n : votre nom d'utilisateur (login)
- %T : heure du système au format HH:mm
- %* : heure du système au format HH:mm:ss
- %D : date du système au format AA-MM-JJ
- %l : le numéro du tty courant
Vous pouvez donc maintenant utiliser ces caractères dans votre fichier ~/.zshrc de cette manière par exemple :
# Ceci est la partie gauche de votre prompt
export PS1='[%B%n@%m%b][%B%~%b] '
# Ceci est la partie droite de votre prompt
export RPS1='[%B%T%b]'ce qui vous donnera le même prompt que j'utilise dans cette capture :
Vous pouvez également ajouter des couleurs, je vous conseille pour cela d'aller voir cette page qui vous fournira les séquences d'échappement adaptées.
Petites astuces
- Rétablir le comportement de la touche Fin :
(vous pouvez rétablir le comportement normal de plein d'autres touches, allez donc voir des exemples sur cette page)bindkey "\e[4~" end-of-line - Petite fonction sur les
../:
Ainsi, si vous êtes dansrationalise-dot() { if [[ $LBUFFER = *.. ]]; then LBUFFER+=/.. else LBUFFER+=. fi } zle -N rationalise-dot bindkey . rationalise-dot/etc/le/path/qui/va/bienet que vous voulez retourner juste sur/etc/le/path, soit 3 répertoires plus haut, vous avez juste à taper
qui va automatiquement se transformer en....../../..
Pour finir bien sûr, je vous donne mon .zshrc que j'utilise depuis quelques mois déjà :
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
setopt appendhistory auto_cd auto_pushd nomatch notify correct
unsetopt beep
bindkey -e
zstyle ':completion:*' use-cache on
zstyle ':completion:*' cache-path ~/.zsh/cache
zstyle ':completion:*' squeeze-slashes true
zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin \
/usr/sbin /usr/bin /sbin /bin /usr/X11R6/bin
zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:kill:*' force-list always
rationalise-dot() {
if [[ $LBUFFER = *.. ]]; then
LBUFFER+=/..
else
LBUFFER+=.
fi
}
zle -N rationalise-dot
bindkey . rationalise-dot
bindkey "\e[4~" end-of-line
bindkey "\e[3~" delete-char
autoload -U compinit
compinit
autoload -U promptinit
promptinit
export PS1='[%B%n@%m%b][%B%~%b] '
export RPS1='[%B%T%b]'
# alias :
alias l='ls -lh --color'
alias ll='ls -Alh --color'
alias e='mcedit'
alias m='less'
alias ap2r='/etc/init.d/apache2 restart'
alias maj='apt-get update && apt-get dist-upgrade'
alias i='apt-get install'
alias r='apt-get remove'
alias x='tar xzvf'
alias xj='tar xjvf'
alias c='tar czvf'
alias cj='tar cjvf'
case $TERM in (xterm*|rxvt)
precmd () { print -Pn "\e]0;%n@%m: %~\a" }
preexec () { print -Pn "\e]0;%n@%m: $1\a" }
;;
esac
Pour aller plus loin, je vous conseille ces quelques pages spécifiques à zsh :


Commentaires
Le lundi 10 mars 2008 à 09:50, DeFr a écrit :
Le lundi 10 mars 2008 à 15:36, KissCoolMan a répondu :
Le lundi 17 mars 2008 à 16:51, kezar a écrit :
Ajouter un commentaire