Zsh (Français) - ArchWiki

Jump to content

Cet article ou section a besoin d'être traduit(e).

Notes: Cet article ne respecte pas la structure de sa version anglophone, merci de le réécrire en conséquence. Vous pouvez aussi ajouter à la version anglophone les informations à-jour et dignes d’intérêt qui ne seraient portées que par la version francophone. Voir ArchWiki:Translation Team (Français) (Discuss in Talk:Zsh (Français)#)

Le Z shell ou zsh est un shell Unix qui peut être utilisé de façon interactive, à l'ouverture de la session ou en tant que puissant interpréteur de commande. Zsh peut être vu comme un « Bourne shell » étendu avec beaucoup d'améliorations. Il reprend en plus la plupart des fonctions les plus pratiques de bash, ksh et tcsh.

## Fonctionnalités

En particulier, Zsh apporte les fonctionnalités suivantes :

- Complétion des commandes, des options et des arguments de la plupart des commandes. Par exemple, taper la suite de caractères « cd <TAB> » ne permettra la complétion que par des répertoires.
- Partage de l'historique des commandes entre tous les shells zsh actuellement actifs.
- Utilisation améliorée des variables et des tableaux.
- Édition des commandes multi lignes dans un seul buffer.
- Correction « orthographique » des commandes tapées.
- Plusieurs modes de compatibilité (zsh peut par exemple être vu comme un shell bourne quand il est exécuté en tant que /bin/sh).
- Invite de commande personnalisable, avec la possibilité d'afficher des informations sur le côté droit de l'écran qui disparaissent si la commande tapée est trop longue.

Zsh prends en charge l'Unicode depuis peu et s'avère plus flexible et léger que bash, notamment grâce à une découpe du code en modules chargeables dynamiquement ( Source)

## Installation

Installer le paquet zsh

### Lancement

    exec zsh

zsh peut être lancé en tant que login shell avec l'option `--login`.

### Lancement automatique dans les différentes consoles

    chsh -s /bin/zsh

## Configuration

Le fichier de base : ~/.zshrc En voici un exemple : Chez ubuntu :$

### Ajouter les alias ssh, scp, sftp aux concatenations

#### Méthode native ZSH

Attention : sachez que cette méthode vous rend vulnérable à une propagation d'attaque par "Island Hopping") Dans l'exemple Ubuntu ci-dessus, la ligne `autoload -U compinit && compinit` permet l'auto-complétion des commandes mais pour que celle-ci fonctionne avec les noms d'hôtes (sous ssh/ftp/scp), encore faut-il que ces noms ne soient pas stockés hashés par le client ssh local dans le ~/.ssh/known_hosts. Pour ce faire il faut donc désactiver la ligne suivante (ou mettre le paramètre à `no`) dans /etc/ssh/ssh_config :

    HashKnownHosts yes

Déplacez ensuite le ~/.ssh/known_hosts ailleurs pour que le client ssh le recréé et cette fois-ci avec les noms en clair (attention vous perdrez vos hôtes connus).

#### Méthode alternative

Si la méthode native ne fonctionne pas, Wisthler nous a concocté un petit script comme il a fait ca bien y a rien a ajouter ... je le place dans ~/.script/print_hosts.zsh

    #!/bin/zsh
    # print_hosts.zsh
    #
    # Auteur : wisthler <wisthler@gmail.com>
    # Version : 1.1

    # Le but de ce script est de parser le fichier .ssh/config (et à terme
    # d'autre fichiers similaires si l'utilité s'en fait sentir) pour en
    # extraire les alias faisant référence à des hosts pour pouvoir les
    # utiliser pour faire de l'auto-complétion pour la commande ssh et
    # toutes celles dérivées de celles-ci comme scp, sftp, sshfs, ...

    # On définit un tableau avec les différents fichiers à parser
    FICHIERS=( $HOME/.ssh/config )

    # On définit un tableau avec les différents préfixs à repérer
    PREFIXS=("Host=" "Host ")

    # On itère sur les fichiers
    for i in $FICHIERS
    do
        # On itère sur les préfixes
        for j in $PREFIXS
        do
            # 1/ On affiche le fichier "i"
            # 2/ On récupère les lignes qui match le préfix "j"
            # 3/ On enlève le préfix pour ne garder que le reste de la ligne
            # 4/ On afficher les résultats
            cat $i | grep -i $j | sed "s/$j//i"
        done
    done

on ajoute ces deux lignes au .zshrc :

    #ssh & co :)
    HOSTS=("${(f)$($HOME/.script/print_hosts.zsh)}") # hosts defined by the user like the ones in .ssh/config
    zstyle ':completion:*:(ssh|scp|sftp|sshfs):*' hosts $HOSTS

### Gestion des types MIMES

zsh gère les types MIMES qui permettent d'associer une application a un type de fichier. Il faut obtenir un fichier référençant tous les types :/etc/mime.types,et éventuellement ~/.mime.types

    pacman -S mime-types

Les associations type-applications sont définies par défaut dans /etc/mailcap et ~/.mailcap. Archlinux ne fournit pas de tels fichiers. Vous pouvez installer celui de Debian qui est dans AUR, toutefois il est aussi possible de créer le sien. Pour faire propre, plaçons le dans /etc/mailcap_perso. Commençons par charger le module zsh utilisé :

    autoload -U zsh-mime-setup
    autoload -U zsh-mime-handler
    zsh-mime-setup

Par la suite rajouter ces lignes au zshrc. Il faut ensuite ajouter ce fichier a la liste des fichiers mailcap de zsh :

    zstyle ':mime:*' mailcap /etc/mailcap_perso

Voici un exemple de fichier mailcap personnel simple :

    video/*; /usr/bin/mplayer '%s'; needsterminal
    text/*; less '%s'; needsterminal
    audio/*; /usr/bin/audacious '%s';

On relance, et lancer un fichier audio l'ouvre avec audacious :) :

    zsh-mime-setup
    ./ma_chanson

Astuce: Pour connaitre le type d'un fichier :

    file -i mon_fichier

Il est aussi possible d'ajouter manuellement des associations avec les extensions des fichiers :

    alias -s txt='less'

ou bien :

    zstyle ':mime:.txt:' handler less %s

### Raccourcis clavier

Zsh n'utilise pas readline, mais son propre éditeur de ligne Zsh (ZLE), plus puissant. Il ne lit pas `/etc/inputrc` ou `~/.inputrc`. Lisez A closer look at the zsh line editor and creating custom widgets pour une introduction à la configuration de ZLE.

ZLE possède un mode Emacs et un mode vi (Français). Si la variable d'environnement `VISUAL` ou `EDITOR` contient la chaîne `vi`, le mode vi sera utilisé ; sinon, le mode Emacs sera utilisé par défaut. Définissez explicitement le mode avec `bindkey -e` ou `bindkey -v` respectivement pour le mode Emacs ou le mode vi.

Les raccourcis clavier sont assignées en associant une séquence d'échappement correspondant à une pression sur une touche à un widget ZLE. Les widgets disponibles, avec la description de leurs actions et de leurs raccourcis clavier par défaut, sont listés dans zshzle(1) § STANDARD WIDGETS et zshcontrib(1) § ZLE FUNCTIONS.

La manière recommandée de définir les raccourcis clavier dans Zsh est d'utiliser les capacités de chaînes de caractères de terminfo(5). Par exemple [1] [2] :

    ~/.zshrc

    # create a zkbd compatible hash;
    # to add other keys to this hash, see: man 5 terminfo
    typeset -g -A key

    key[Home]="${terminfo[khome]}"
    key[End]="${terminfo[kend]}"
    key[Insert]="${terminfo[kich1]}"
    key[Backspace]="${terminfo[kbs]}"
    key[Delete]="${terminfo[kdch1]}"
    key[Up]="${terminfo[kcuu1]}"
    key[Down]="${terminfo[kcud1]}"
    key[Left]="${terminfo[kcub1]}"
    key[Right]="${terminfo[kcuf1]}"
    key[PageUp]="${terminfo[kpp]}"
    key[PageDown]="${terminfo[knp]}"
    key[Shift-Tab]="${terminfo[kcbt]}"

    # setup key accordingly
    [[ -n "${key[Home]}"      ]] && bindkey -- "${key[Home]}"       beginning-of-line
    [[ -n "${key[End]}"       ]] && bindkey -- "${key[End]}"        end-of-line
    [[ -n "${key[Insert]}"    ]] && bindkey -- "${key[Insert]}"     overwrite-mode
    [[ -n "${key[Backspace]}" ]] && bindkey -- "${key[Backspace]}"  backward-delete-char
    [[ -n "${key[Delete]}"    ]] && bindkey -- "${key[Delete]}"     delete-char
    [[ -n "${key[Up]}"        ]] && bindkey -- "${key[Up]}"         up-line-or-history
    [[ -n "${key[Down]}"      ]] && bindkey -- "${key[Down]}"       down-line-or-history
    [[ -n "${key[Left]}"      ]] && bindkey -- "${key[Left]}"       backward-char
    [[ -n "${key[Right]}"     ]] && bindkey -- "${key[Right]}"      forward-char
    [[ -n "${key[PageUp]}"    ]] && bindkey -- "${key[PageUp]}"     beginning-of-buffer-or-history
    [[ -n "${key[PageDown]}"  ]] && bindkey -- "${key[PageDown]}"   end-of-buffer-or-history
    [[ -n "${key[Shift-Tab]}" ]] && bindkey -- "${key[Shift-Tab]}"  reverse-menu-complete

    # Finally, make sure the terminal is in application mode, when zle is
    # active. Only then are the values from $terminfo valid.
    if (( ${+terminfo[smkx]} && ${+terminfo[rmkx]} )); then
    	autoload -Uz add-zle-hook-widget
    	function zle_application_mode_start { echoti smkx }
    	function zle_application_mode_stop { echoti rmkx }
    	add-zle-hook-widget -Uz zle-line-init zle_application_mode_start
    	add-zle-hook-widget -Uz zle-line-finish zle_application_mode_stop
    fi

#### Recherche dans l'historique

Vous devez configurer le tableau `key` et vous assurer que ZLE passe en mode application pour utiliser les instructions suivantes ; voir #Raccourcis clavier.

Pour activer la recherche dans l'historique, ajoutez les lignes suivantes au fichier `.zshrc` :

    ~/.zshrc

    autoload -Uz up-line-or-beginning-search down-line-or-beginning-search
    zle -N up-line-or-beginning-search
    zle -N down-line-or-beginning-search

    [[ -n "${key[Up]}"   ]] && bindkey -- "${key[Up]}"   up-line-or-beginning-search
    [[ -n "${key[Down]}" ]] && bindkey -- "${key[Down]}" down-line-or-beginning-search

En faisant cela, seules les commandes passées correspondant à la ligne actuelle jusqu'à la position actuelle du curseur seront affichées lorsque les touches `Up` ou `Down` sont pressées.

#### Modificateurs Shift, Alt, Ctrl et Meta

Les terminaux compatibles xterm peuvent utiliser les définitions de touches étendues de user_caps(5). Il s'agit de combinaisons de `Shift`, `Alt`, `Ctrl` et `Meta` avec `Up`, `Down`, `Left`, `Right`, `PageUp`, `PageDown`, `Home`, `End` ou `Del`. Consultez le site zkbd source pour obtenir une liste des noms recommandés pour les touches de modification et les combinaisons de touches.

Par exemple, pour `Ctrl+Gauche` déplacer au début du mot précédent et `Ctrl+Droit` déplacer au début du mot suivant :

    ~/.zshrc

    key[Control-Left]="${terminfo[kLFT5]}"
    key[Control-Right]="${terminfo[kRIT5]}"

    [[ -n "${key[Control-Left]}"  ]] && bindkey -- "${key[Control-Left]}"  backward-word
    [[ -n "${key[Control-Right]}" ]] && bindkey -- "${key[Control-Right]}" forward-word

## Fonctionnalités utiles

Zsh est particulièrement pratique pour une utilisation interactive. Nous nous intéressons ici a des fonctionnalités propres a zsh, il n'est pas question de présenter les utilisations classiques d'un shell.

### Expansions et substitutions

Zsh procède a diverses expansions lorsqu'il parse la commande. Elles sont exécutées linéairement en 5 étapes :

1. historique des commandes,
2. alias,
3. substitution des commandes et des processus, expansion des expressions mathématiques, des paramètres,
4. expansion des noms de fichiers,
5. génération des noms de fichiers, mieux connu sous le nom de "globbing".

#### Historique des commandes

zsh conserve un historique des commandes. Pour voir les dernières commandes de l'historique :

    fc -l

La commande fc ouvre la dernière commande de l'historique dans $EDITOR, pratique pour corriger les commandes multi-lignes. La commande r permet de répéter la dernière commande de l'historique, tout en autorisant des substitutions :

    r foo=bar

Le caractère "!" permet l'expansion historique des commandes :

    !-2

exécute la commandes en position -2 dans l'historique. Il est aussi possible de fournir la position absolue en argument. Noter qu'il existe d'autes arguments tels que

    !str

qui rappelle la première commande commençant par str.

#### Alias

Outre la gestion habituelle des alias, notons la possibilité de définir des alias globaux, qui sont remplacés a n'importe quel endroit de la ligne :

    alias -g M='| more'
    commande M

#### Substitution des processus

Les classiques $(...) et `...` sont bien entendu fonctionnels. La syntaxe =(...) permet de stocker le résultat de la commande dans un fichier :

    emacs -nw =(ls -d | grep foo)

Les redirections permettent aussi la substitutions :

    paste <(cut -f1 fichier)

#### Expansion des Paramètres

    ${nom}

renvoie la valeur du paramètre nom s'il est défini. Il est possible de modifier la valeur de l’expansion du paramètre.

    ${nom:u}
    ${nom:l}

change la casse de nom. (uppercase et lowercase)

    ${nom:s/foo/bar/}

opère la substitution de foo par bar dans nom.

    ${nom#foo}

si nom commence par foo, alors supprime foo. Utile avec un joker ! Même chose avec % pour "finit par". Et bien plus ! voir le man pour plus de détails.

#### Génération des noms de fichiers (globbing)

Les syntaxes *,?,[...],[:alpha:] utilisées dans les expressions régulières sont utilisables. Pour pouvoir utiliser les options de filtrage étendues, il faut activer les options :

    setopt extendedglob
    setopt numericglobsort

Le caractère ^ inverse le filtrage qui suit. x|y correspond a un OU : filtre les expressions correspondant a x ou a y

    ls *.(pdf|ps)

x~y correspond a l'opérateur logique ET NON :

    ls (*.sh~*foo*)

liste tous les fichiers d'extension .sh ne contenant pas foo. On peut aussi spécifier le type de fichier :

    ls *(@)

liste tous les liens. Les options courantes sont :

- / les répertoires,
- . les fichiers,
- x les exécutables par tout le monde, X par l'utilisateur courant,
- r,R les lisibles,
- w,W les inscriptibles,
- s les setuid,
- S les setgid.

On peut bien entendu combiner ces options :

    ls *(x^/)

Les caractères %%**/%% forcent la recherche récursive :

    ls **/*(x^/)

Une expression de la forme <x-y> filtre une série d'entiers.

    ls foo<10-100>

### Les redirections

Il est possible de faire en sorte que zsh n'écrive pas dans un fichier non vide avec >. Cette opération nécessite alors la redirection >|. `unsetopt clobber`

### La pile des répertoires

Zsh maintient un historique des répertoires visités, implémenté sous la forme d'une pile. La commande pushd ajoute le répertoire passé en argument a la pile et change de répertoire. La commande popd retire le dernier répertoire de la pile et change de répertoire. Exemple :

    ~ % pushd foo/bar
    ~/foo/bar % popd
    ~ %

    dirs

permet de voir la pile.

    cd -n

change le répertoire courant au n-ème répertoire de la pile. Taper le nom d'un répertoire l'ajoute a la pile et change le répertoire courant :

    ~ % /etc
    /etc % ..
    / %

L'option `setopt pushd_silent` permet de ne pas afficher la pile après `pushd` ou `popd`.

Si la commande tapée est invalide mais correspond à un sous répertoire, changer `pwd` à ce sous-répertoire : `setopt auto_cd`.

## Extensions

Note: Les configurations seront à ajouter dans /etc/zsh/zshrc ou ~/.zshrc.

### Oh-my-zsh

Oh-My-Zsh est un framework open source géré par la communauté pour configurer Zsh.

#### Installation

Installez le paquet oh-my-zsh-gitAUR disponible sur AUR.

#### Configuration

    #-------------------------------------------------------------------------------
    # Oh-My-Zsh
    #-------------------------------------------------------------------------------

    ZSH='/usr/share/oh-my-zsh'
    ZSH_THEME='alanpeabody'
    ZSH_CACHE_DIR="$HOME/.zsh_cache"
    DISABLE_AUTO_UPDATE='true'
    DISABLE_LS_COLORS='false'

    plugins=(
       #'plugin1'
       #'plugin2'
       #'...'
    )

    source "$ZSH/oh-my-zsh.sh"

Variables de configuration disponibles :

    less /usr/share/oh-my-zsh/zshrc

Liste des plugins disponibles :

    ls /usr/share/oh-my-zsh/plugins

### Zaw

Zaw crée automatiquement des sources (e.g: historique, alias, applications...).
Ces sources sont accessibles via des raccourcis, il est ensuite possible d'appliquer un filtrage et d'effectuer une sélection.

#### Installation

Installez le paquet zaw-gitAUR disponible sur AUR.

#### Configuration

Astuce: Pour connaître les raccourcis clavier de votre terminal, tapez la commande `cat -v` puis votre raccourci.

    #-------------------------------------------------------------------------------
    # Zaw
    #-------------------------------------------------------------------------------

    source '/usr/share/zaw/zaw.zsh'

    # Exemple de raccourcis
    bindkey '^A' zaw-applications  # Ctrl-A
    bindkey '^R' zaw-history       # Ctrl-R
    bindkey '^X' zaw               # Ctrl-X

Liste des sources disponibles :

    zaw-print-src

### Zsh-Syntax-Highlighting

Zsh-Syntax-Highlighting, coloration syntaxique pour Zsh.

#### Installation

Installez le paquet zsh-syntax-highlighting.

#### Configuration

Attention: Le fichier zsh-syntax-highlighting.zsh doit être sourcé en dernier dans zshrc.

    #-------------------------------------------------------------------------------
    # Zsh-Syntax-highlighting
    #-------------------------------------------------------------------------------

    source '/usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh'

Category:

- Command-line shells (Français)

Hidden category:

- Pages or sections flagged with Template:Translateme (Français)