# [howto] zsh

## Bapt

Suite au débat https://forums.gentoo.org/viewtopic-t-523853.html je me suis rendu compte que beaucoup de gens souhaitent essayer zsh, je me suis donc dit qu'un petit howto serait le bienvenu 

Tout décrire ici serait trop long, mais ce HOWTO devrait donner un aperçu des possibilités des ZSH. En complément, je vous conseil d'aller voir :  ZSH LOVERS, vous pouvez aussi consulté la très grosse documentation ZSH : . Vous pouvez aussi récupérer ma configuration de zsh ici (Attention aux droits de .zsh/* qui doivent appartenir au user) 

```
chown -R user:grp .zsh*
```

 INTRODUCTION

zsh est un Shell au même titre que bash, csh ou ksh.

Les particularités principales de zsh sont les suivantes : 

Complétion très évoluée

Complétion programmable

Support mimes

Modes de compatibilité sh, csh, ksh, etc.

Fonctions "built-in" très nombreuses

Nombreux modules

ZSH est libre (sous licence BSD modifiée).

 INSTALLATION

En utilisant portage :

```
emerge zsh
```

Attention si vous êtes en stable, gentoo propose la version 4.2.5 qui ne supporte pas l'UTF-8, en ~arch la version de développement (très stable) de zsh supportant l'UTF-8 est disponible : 4.3.2

Je vous recommande chaudement les versions supérieures à la 4.3

 DETAIL DES USE FLAGS

zsh propose les use flags (version >= 4.3.2) :

caps : permet de gérer les capacités POSIX.1e via le module interne zsh/cap (je ne sais pas de quoi il s'agit)

maildir : zsh permet de vérifier la présence de mail (localement) ce use flag offre le support du format maildir

pcre : ajoute le support des expressions régulières à ZSH via le module zsh/pcre

unicode active le support de l'unicode

 COMPLETION GENTOO

Pour activer la complétion des commandes gentoo (portage, gentoolkit, portage-utils et quelques autres) il faut installer zsh-completion : 

```
emerge zsh-completion
```

Encore une fois je recommande d'utiliser la version ~arch beaucoup plus à jour et stable.

 COMPLETION

ZSH dispose d'un système de complétion très avancé permettant aussi bien de faire de la complétion sur les noms des commandes, mais aussi sur leurs arguments, fichiers supportés etc.

Activation de la complétion : 

```
autoload -U compinit

compinit
```

Exemples de tuning de la complétion : 

Pour que la commande cd offre la complétion sur les répertoires locaux pour les répertoires du cdpath :

```
zstyle ':completion:*:*:cd:*' tag-order local-directories path-directories
```

Pour disposer d'un menu pour la complétion et pouvoir sélectionner avec les flèches du clavier : 

```
zstyle ':completion:*' menu select=2

zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s
```

Eviter de reproposer un élément déjà proposé précédemment lors de la complétion pour les commandes rm, cp, mv :

```
zstyle ':completion:*:rm:*' ignore-line yes

zstyle ':completion:*:mv:*' ignore-line yes

zstyle ':completion:*:cp:*' ignore-line yes

```

Aller récupérer l'ensemble des hosts dans le fichier known_host de ssh pour permettre la completions aux programmes qui demande un host (genre ssh, telnet, ...)

```
local _myhosts

if [ -d ~/.ssh ]; then

  if [ -f ~/.ssh/known_hosts ];then

    _myhosts=(${=${${(f)"$(<$HOME/.ssh/known_hosts)"}%%[# ]*}//,/ })

   fi

fi

zstyle ':completion:*' hosts $_myhosts
```

EDIT : Si il manque des fonctions de completions à zsh et qu'elles sont présentent pour bash, il faut savoir que zsh supporte parfaitement la completion bash, voici la procédure à suivre :

Activation : 

```
autoload -U bashcompinit

bashcompinit
```

désormai il suffit de sourcer les fonctions de completions bash pour qu'elles fonctionnent sous ZSH  :Smile: 

 MIMES

ZSH supporte les mimes et permet ainsi de déterminer le programme souhaité pour l'ouverture d'un type de fichier donné comme le ferait un explorateur de fichier.

Activation : 

```
autoload -U zsh-mime-setup

autoload -U zsh-mime-handler

zsh-mime-setup
```

Cette fonction va aller récupérer les informations dans /etc/mime.types, ~/.mime.types, /etc/mailcap et ~/.mailcap 

Pour rajouter de nouveaux fichiers mailcap (par exemple /usr/local/etc/mailcap) :

```

zstyle ':mime:*' mailcap ~/.mailcap /usr/local/etc/mailcap

```

Pour rajouter manuellement des associations de fichiers, deux possibilités : 

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

ou 

```
alias -s txt="less"
```

Pour lister toutes les associations disponibles : 

```
alias -s
```

La fonction pick-web-browser est à disposition pour permettre de choisir un ordre de préférence sur le navigateur web :

```
autoload -U pick-web-browser

zstyle ':mime:*' x-browsers firefox elinks

alias -s html=pick-web-browser
```

 FONCTIONS INTERNES

ZSH dispose de très nombreuses fonctions internes.

Activation : 

```
autoload -U zfinit

zfinit
```

Fonctions disponibles en vrac : 

zcalc : une calculatrice (plus besoin de bc ou autres expr)

zargs : un super xargs

zmv : une commande permettant de faire du renommage/déplaçage en masse de fichiers.

 MODULES INTERNES

Pour charger un module : 

```
zmodload zsh/monmodule
```

Modules disponibles en vrac et de manière non exhaustive

clone : permet de cloner le shell courrant

datetime : permet la manipulation des dates nativement et simplement

files : commandes de manipulation de fichier interne (permet de ne plus avoir de limitation du nombre d'argument par exemple) : chgrp, chown, ln, mkdir, mv, rm, rmdir, sync

net/socket : permet de manipuler des sockets

net/tcp : offre le support du protocol TCP (un client irc en zsh et un serveur web existe)

zftp : un client ftp natif

zpty permet de créer un pty virtuel et de lire/écrire ce qui se passe dedans (à la expect)

 GLOBBING & DIVERS

zsh permet la manipulation très avancée des variables permettant d'écrire des scripts sans utiliser sed, grep, find, etc., pouvant aller très loin, je ne mettrais ici que des exemples : 

Rechercher tous les fichiers .txt de manières récursive: 

```
ls **/*.txt
```

Le même en s'assurant qu'il s'agit bien de fichier et non de répertoire :

```
ls **/*.txt(.)
```

Le même cherchant indifféremment dans les fichiers cachés ou non : 

```
 ls **/*.txt(D.)
```

Lister tous les répertoires vides : 

```
print -rl **/*(D/^F)
```

ou 

```
ls **/*(D/^F)
```

Liste tous les fichiers vides : 

```
ls **/**(D.L0))
```

Lister les 10 fichiers les plus gros : 

```
zmodload zsh/stat

print -rl ./**/*(d`stat +device .`OL[1,10])
```

Renommage massif de fichier mkv : mise en minuscule du nom du fichier sauf la première lettre de chaque mot, remplacement des "." par " " et des "_" par " ". 

```
zmv '(*).mkv' '${${(LC)1//./ }//_/ }.mkv'
```

Last edited by Bapt on Thu Dec 21, 2006 4:50 pm; edited 1 time in total

----------

## galerkin

Ca m'a l'air très complet

Merci pour cette contribution 

je m'en vais tester de ce pas...

----------

## Bapt

ZSH est très complet mais ce howto est très très light comparé à ce que te permet ZSH. mais je ne sais pas comment en mettre plus sans le rendre trop lourd.

----------

## kwenspc

MARCIII!!! Vais me mettre à zsh tiens piske c'est à la mode  :Razz: 

(non serieux ça a l'air sympa)

----------

## davidou2a

Joli tuto mais je reste sur Csh et bash par contre me parlez pas de KornShell (ksh) 

*** Envie de vomir ^^ ***

----------

## truc

juste comme ça, pour ceux qui installeront 'zsh-completion' , dans une optique de non polution du world, je propose, de n'emerger que ce paquet  :Wink:  les dépendances deront le reste.

Sinon, ça a l'air très sympa, encore une fois merci

EDIT: aaahahhhh mon c-a-a dans screen ne marche plus!! j'suppose qu'il doit y avoir un moyen de le retrouver?

----------

## Bapt

 *truc wrote:*   

> juste comme ça, pour ceux qui installeront 'zsh-completion' , dans une optique de non polution du world, je propose, de n'emerger que ce paquet  les dépendances deront le reste.
> 
> Sinon, ça a l'air très sympa, encore une fois merci
> 
> EDIT: aaahahhhh mon c-a-a dans screen ne marche plus!! j'suppose qu'il doit y avoir un moyen de le retrouver?

 

Je ne connaissais pas j'ai jamais fait gaffe à ça  :Smile:  il doit y avoir moyen de corriger ça.

SI c'est pour revenir au début de la ligne la touche home fait très bien l'affaire

----------

## Scullder

Cool ce tutos, moi aussi je donne ma petite astuce. =)

En fait, après emerge de zsh et configuration, j'avais toujours des touches mortes, qui répondaient par ~, comme les touches del, ins, home, page up, page down, end. Pour remédier à ce problème on peut utiliser zkbd.

Dans le .zshrc, ajoutez ça :

```
autoload zkbd

zkbd
```

Relancez un terminal. Vous allez devoir appuyer sur les touches du clavier que le script vous demande.

Le script crée ensuite un fichier avec les définitions des touches : ~/.zkbd/$TERM-$VENDOR-$OSTYPE

Vous pouvez le lire, c'est un tableau qu'on va réutiliser juste après.

Dans votre .zshrc, supprimez les deux lignes autoload zkbd et zkbd.

Ajoutez :

```
source ~/.zkbd/$TERM-$VENDOR-$OSTYPE
```

On peut ensuiter lier les touches à des actions ( http://www.cs.elte.hu/zsh-manual/zsh_14.html ), comme ça par exemple :

```
[[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char

[[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char

[[ -n ${key[End]} ]] && bindkey "${key[End]}" vi-end-of-line

[[ -n ${key[Home]} ]] && bindkey "${key[Home]}" vi-beginning-of-line

[[ -n ${key[Insert]} ]] && bindkey "${key[Insert]}" overwrite-mode

[[ -n ${key[Delete]} ]] && bindkey "${key[Delete]}" delete-char
```

Sur chaque ligne, on teste l'existence du champ du tableau, et si il existe, on lie la touche avec une action en utilisant bindkey.

Il y a d'autres moyens, mais c'est la solution la plus propre que j'ai trouvée  :Smile: 

ZSH vaincra   :Cool: 

----------

## adjaxio

Bonjour,

Merci pour ce howto.

J'aurai une question peut être un peut con mais comment fait ton pour le mettre part défaut (sur un serveur connections SSH) ?

merci

----------

## truc

tu eux le changer dans /etc/passwd normalement, sinon, tu peux aussi te servir de chsh (pour changeshell si je n'm'abuse..) pour ça  :Smile: 

----------

## Bapt

A la demande de plusieurs, voici, ma configuration mise à jour : 

http://baptux.free.fr/zshconf-20080211.tar.bz2

Une fois décompressée n'oubliez pas de changer les droits pour qu'ils appartiennent votre utilisateur.

Ce que l'on retrouve dans la conf : 

.zshrc : la conf zsh basique : les différentes options : setopt et unsetopt, les bindkeys, et l'activation du prompt.

.zshalias : liste des alias non suffix (ie qui ne sont pas de type mimes)

.zshcomplete : configuration et activation de la completion

.zshfunctions : activation de certaines des fonctions : datetime, mime, 

.zshhash : gestion des hash (bookmark sur le FS)

.zshmimes : gestion des types mimes, et des alias suffix)

.zsh/functions/prompt_bapt_setup : mon prompt

.zsh/functions/src : une fonction permettant de recharger la conf en cas de modif et de la recompiler.

PS: j'ai commenté ce qui me semblait intéressant, néhsitez pas à me dire ce qui manque de commentaires.

----------

