ZSH : boostez votre shell ! - Betaphile.net : Amoureux des versions Beta...

Betaphile.net : Amoureux des versions Beta...

Linux, Développement, Administration, Logiciels Libres ...

Aller au contenu - Aller au menu - Aller à la recherche



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 :

Un tout petit aperçu des possibilités de zsh

(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 zsh

ou 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][~] chsh

Là 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 zsh

puis 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/bash

puis 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
    cd path
    , mais juste
    path
  • 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
compinit

puis 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/bin

On 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 -l

puis voir ce qu'ils donnent directement grâce à

prompt -p LENOMDUTHEME

Si vous en trouvez un qui vous plait, par exemple le theme fire

Un theme de prompt très moche pour zsh

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 :

Un tout petit aperçu des possibilités de zsh

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 :
    bindkey "\e[4~" end-of-line
    (vous pouvez rétablir le comportement normal de plein d'autres touches, allez donc voir des exemples sur cette page)
  • Petite fonction sur les ../ :
    rationalise-dot() {
      if [[ $LBUFFER = *.. ]]; then
        LBUFFER+=/..
      else
         LBUFFER+=.
      fi
    }
    zle -N rationalise-dot
    bindkey . rationalise-dot
    Ainsi, si vous êtes dans /etc/le/path/qui/va/bien et 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 :

Trackbacks

Aucun trackback pour le moment.

Les trackbacks pour ce billet sont fermés.

Commentaires

Le lundi 10 mars 2008 à 09:50, DeFr a écrit :

Petite précision: une fois que l'on est root, on n'est absolument pas obligé de changer le shell de l'utilisateur à la main comme une brute dans /etc/passwd, on peut parfaitement faire chsh toto pour changer le shell de toto avec une jolie interface ;-)

Et j'utilise aussi les 4 dernières lignes de ton zshrc, bien pratique pour avoir des informations utiles dans le titre quand on a un grand nombre de sessions ouvertes :-)

Le lundi 10 mars 2008 à 15:36, KissCoolMan a répondu :

Je ne suis pas une brute, ca se saurait tout de même ^^.

Le lundi 17 mars 2008 à 16:51, kezar a écrit :

Quelques alias en plus... (histoire d'avoir de la couleur un peu)

export LS_OPTIONS='--color=auto'
eval `dircolors`
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias la='ls $LS_OPTIONS -A'
alias lll='ls $LS_OPTIONS -al | more'
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
alias C='clear'
alias E='exit'
alias H='history'
alias P='pwd'
alias psm="echo '%CPU %MEM   PID COMMAND' && 
ps hgaxo %cpu,%mem,pid,comm | sort -nrk1 | head -n 10 | 
sed -e 's/-bin//' | sed -e 's/-media-play//'"
alias su='sudo -s'
alias hostip='wget http://checkip.dyndns.org/ -O - -o 
/dev/null | cut -d: -f 2 | cut -d\< -f 1'

Mes styles d'autocomplétion (un poil différents)

zstyle ':completion:*' 
completer _expand _complete _correct _approximate
zstyle ':completion:*' completions 1
zstyle ':completion:*' expand prefix suffix
zstyle ':completion:*' file-sort name
zstyle ':completion:*' format 'Correspondances pour "%d"'
zstyle ':completion:*' glob 0
zstyle ':completion:*' ignore-parents parent pwd
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' list-prompt %S%p - TAB pour la suite, 
ou tapez les caractères à insérer%s
zstyle ':completion:*' list-suffixes true
zstyle ':completion:*' matcher-list '+' 'm:{a-z}={A-Z}' 
'm:{a-zA-Z}={A-Za-z}'
zstyle ':completion:*' max-errors 2
zstyle ':completion:*' menu select=1
zstyle ':completion:*' preserve-prefix '//^/##/'
zstyle ':completion:*' select-prompt %SChoix : %p%s
zstyle ':completion:*' squeeze-slashes true
zstyle ':completion:*' substitute 0
zstyle ':completion:*' use-compctl true
zstyle :compinstall filename 'chemin vers le fichier .zshrc'
autoload -Uz compinit
compinit

Ajouter un commentaire