ZSH

Introduction

Zsh a été commencé en 90 par Paul Falstad, il était étudiant a Princeton… Un de ses profs s'appelait Zhong Shao, sur le LAN de l'université, son login était un zsh. l'histoire pouvait commencer…

  • vous utilisez la ligne de commandes perdez parfois du temps avec la ligne de commande
  • un clavier avec une touche tabulation en bon état
  • un paquet de kleenex (si vous ne connaissez pas encore zsh vous en aurez besoin)

Prérequis

  • zsh (sous ce nom parmi les paquets ubuntu)
  • subversion, pour récuperer la config de asyd
  • optionel: les versions GNU de ls et quelques autres outils pour FreeBSD, OpenBSD, MacOS X, <put a non-GNU system here>
  • optionel: keychain (sous ce nom dans vos paquet), gere proprement votre ssh-agent
  • l'outillage de base (une console réglée a votre convenance, un X qui fonctionne pour afficher la console)…
  • des dossiers bien remplis pour mettre en oeuvres les exemples hallucinants a venir, et un $HOME soigneusement chaotique

Pourquoi zsh ?

Parce que:

  • une completion complete et intelligente
  • un système de globbing de grande qualité
  • un historique terrible
  • plein d'autres trucs dont on ne pourra parler…

Premiers pas

Donc ouvrez un terminal et

$ zsh

zsh-newuser-install se lance, ce qui n'est pas idéal. Car zsh sans config c'est dur.

Récupération d'une config pour zsh

On va donc utiliser une config de zsh “par défaut”… Pour celà, vous fermez ce terminal et en ouvrez un autre (q + exit). Ne faites pas de $ touch ~/.zshrc, attendez d'avoir telecharge une bonne configuration.

$ cd
$ svn checkout http://svn.asyd.net/svn/zsh/trunk .zsh
$ ln -s .zsh/zshrc .zshrc

Note : la config que nous allons utiliser est de asyd, il l'a commencée en 2001, et la maintient depuis.

Lancer zsh :

$ zsh

Arrivé a ce point , on a tous un shell de cette forme :

"01:14 (user~host) /home/user
%                                                          [0.11 0.16 - 41% 3%]"

Note : [charge 1 min charge 5 min - charge RAM (en %) charge SWAP (en %)]

Configuration

Pour le prompt, changer les couleurs, eventuelement les infos et leurs dispositions, voir dans rc.os/prompt.zsh puis rc.os. La définition des couleurs se fait dans c.host/default.zsh

Utilisation

Exemples

% /usr # 3 frappes gagnées par changement de repertoire
% for i in 1 2 3 ; echo $i  # plus besoin de do et done

Note : Très pratique, bien sûr la forme bash reste compatible avec zsh. D'ailleurs zsh est entièrement compatible avec bash.

Completion

La configuration par défaut n'est pas terrible , et la config d'asyd ne la change pas, je vous ai donc preparé une config.Editez le fichier

~/.zshrc

pour y ajouter :

#Completion
zstyle ':completion:*' completer _expand _complete _approximate
zstyle ':completion:*:expand:*' tag-order all-expansions
zstyle ':completion:*' ignore-parents parent pwd
zstyle ':completion:*' list-colors ''
zstyle ':completion:*' menu select=1
zstyle ':completion:*' original true
zstyle ':completion:*:approximate:*' max-errors par 'reply=( $(( ($#PREFIX+$#SUFFIX)/3 )) numeric )'

Puis pour prendre en compte les modifications :

	
% source .zshrc
% source ~/.zsh

La première frappe sur <TAB> donne le même résultat qu'avec bash par contre les frappes suivantes permettent de parcourir les différents choix proposés.

Pour sortir de la complétion sans choix utilisez <ctrl>+c ou <backspace>.

Le shell propose seulement les répertoires où tu es susceptible d'aller et pas celui où l'on se trouve déjà. Pour changer celà, if faut supprimer

zstyle ':completion:*' ignore-parents parent pwd

du fichier .zshrc.

% mplayer /un/dossier/avec/des/video/<tab>

Ici seules les vidéos sont listées. De même avec votre éditeur de texte, zsh complète avec les fichiers textes seulement.Tester :

% apt-cache <tab>
% apt-get ins<tab>
% apt-get install opena<tab>
% ssh <début nom host><tab>

Note : Pour comprendre le fonctionnement de l'autocomplétion aller voir dans .zsh/rc et rc.osVous en avez pour un moment, zsh corrige les typo, travaille avec les users et les groupes. zsh connait énormément de patrons de commandes.Tester :

% cat `locate Xorg.0.log`<tab>  # zsh fait l'autocomplétion sur le résultat du locate et affiche directement le résultat
% print $(( 1 + 2 ))tab  # zsh sait aussi compter

Note : Nous sommes toujours sur la même ligne, nous n'avons pas fait <entrée> depuis tout à l'heure.Tester :

% /var/*<tab>

Globbing

Tout a l'heure on a utilisé locate pour retrouver Xorg.0.log mais nous aurions pu laisser zsh chercher…

Exemple :

% cat /**/Xorg.0.log # être patient, sinon <ctrl>+c, <ctrl>+q, l'exemple est un peu extrême

Note :

  • \* c'est tous les fichiers sous le répertoire donné ;
  • \*\* est un * récursif. Il remplace par tous les fichiers du répertoire ainsi que tous les fichiers des repertoires au sein du répertoire et ainsi de suite.
  • /88/ = global (fichiers, dossiers) et /* juste fichiers
% echo *(/)  # retourne juste les répertoires
% echo */    # sans les parenthèse zsh retourne aussi les sim-links
% echo *(^/) # retourne juste les fichiers

Note : Avec (@) on filtre sur les liens symboliquesTester :

% mplayer ~/musique/**/*.(flac|wac|aiff)
% mplayer  ~/musique/**/*.(flac|wav|aiff)~*Police*

Le ~ permet d'enlever des éléments de la sélection.

% mplayer ~/musique/**/*.(flac|wav|aiff)~*Police*~[pP]ink*
# Sans les morceaux dont le nom de fichier comporte Police et sans les morceaux dont le nom commence par Pink ou pink.

Les tableaux

Avec le bash on connaissait 2 types : les nombres et les chaines de caractères. Avec zsh on en ajoute un : le tableau. Un tableau est un groupement de variables.

Exemple :

% ma_musique=(morceau1.mp3 /media/partage/unautremorceau.mp3)

Ceci crée un tableau ma_musique.

% echo $ma_musique

Ceci affiche le contenu du tableau.

On peut ajouter du contenu au tableau

% ma_musique=($ma_musique encoreunmorceau.flac)

Ou directement

% ma_musique[5]=encoreun.flac

Note : * contrairement à la norme en vigueur dans les beaux langages, le numérotage du tableau commence à 1. * les tableaux sont infinis : on peut laisser du vide dans le tableaux ou le commencer par la fin.Ecouter de la musique :

% mplayer $ma_musique

Ou par ordre alphabétique :

% mplayer $(print $ma_musique | sort)

Note : Nombre d'éléments d'un tableau : ${#ma_musique}

Liste aléatoire :

% mplayer $ma_musique[$RANDOM%${#ma_musique}]
% ma_musique=( /media/*/musique/**/*.(mp3|flac|ogg) ; while true ; do mplayer $ma_musique[$RANDOM%${#ma_musique}] ; done

Jeux

Libre à vous d'ajouter la ligne “autoload tetris” `a votre .zshrc. Puis <alt>+x et sasissez 'tetris'.

Soucis

La touche <suppr> donne une tilde, pour y remédier ajoutez au fichier .zshrc :

autoload zkbd
[[ ! -f ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE ]] && zkbd
source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE

Puis

% source ~/.zshrc

Pour finir

Pour mettre zsh en shell par défaut, il faut utiliser la commande chsh. Le chemin du shell est /bin/zsh

Bibliographie

  • man zshtcpsys
  • man zshzftpsys

Le manuel est gigantesque et il est eclaté en une vingtaine de page!

 
Haut de page
cours/zsh.txt · Dernière modification: 2009/04/19 08:30 par gpocentek