Voilà ce que ca donne un geek qui a envie de geeker mais qui n'a pas
d'internet ! Petit conseil, lisez jusqu'au bout, je pense que ca vaut le
coup.
Table des matières
----------------------------------------------------------------------
1] Quelques exemples de widget
-) push-line
-) history-search-{forward,backward}
-) insert-last-word
-) run-help
2] Astuces
-) zle
-) bindkey
3] Définir d'un nouveau widget
4] Création d'un nouveau widget : regex-edit
0] Introduction
----------------------------------------------------------------------
ZLE (zsh line editor) est le composant de zsh qui interagit avec
l'utilisateur, celui qui reçoit les entrées du clavier. Il est
composé en widgets, certains sont builtins, d'autres sont des scripts
zsh (répertoire zle).
Voici quelques widgets que j'affectionne particulièrement, la séquence
entre parenthèse correspond au raccourci du mode emacs. ( ^[
correspond à ESC)
1] Quelques exemples de widget
----------------------------------------------------------------------
push-line (^[q)
Garde en mémoire le buffer actuel (la commande à éxécuter), puis
proprose un nouveau prompt, pour finalement insérer le contenu
du précedent buffer.
Exemple :
% vi .zshrc (on appuie pas sur entrée mais sur ^[q)
% cd
% vi .zshrc (rajouté automatiquement par zsh)
Ce widget est particulièrement utile pour changer de répertoire
avant d'exécuter la commande voulue.
history-search-forward (^[n]
history-search-backward (^[p)
Recherche avant (^[n) ou arrière (^[p) dans l'historique en
utilisant le premier mot (i.e. la commande) en motif de recherche.
Personnellement, ces deux widgets me sont vraiment très utile, et je
les utilise régulièrement. Concrètement, voici ce que ca donne :
% ping guses.org
[.. nombreuses commandes autre que ping ..]
% ping cli.asyd.net
[.. nombreuses commandes autre que ping ..]
% ping
Une première utilisation de history-search-backward complétera
cli.asyd.net, le second complétera guses.org, finalement
history-search-forward complétera cli.asyd.net
insert-last-word (^[.])
Insère le dernier mot de la commande précédente
% ssh kaoru
% ping rei
% ssh
le premier ^[.] complétera rei
le second complétera kaoru
run-help (^[h)
Exécute la commande man (généralement) avec en argument le premier
mot (la commande donc)
2] Astuces
----------------------------------------------------------------------
Lister les widgets disponibles
% zle -l
Lister les raccourcis
% bindkey
Définir un nouveau raccourci
% bindkey <widget>
Afficher en texte une séquence
% <Control-v>
Par exemple, la succession de Control-V ESC p affichera ^[p
3] Définir un nouveau widget
----------------------------------------------------------------------
Il suffit de créer une fonction puis d'utiliser la commande zle de la
manière suivante :
% zle -N <nom widget> [<nom fonction>]
Il existe un certain nombre de variables disponibles dans le contexte
zle, mais généralement le but est de modifier la variable BUFFER.
4] Création d'un nouveau widget : regex-edit
J'ai toujours révé d'un widget me permettant d'appliquer une regex
à la commande en cours, en fait, j'aurais dû me motiver plus tôt,
car c'est vraiment simple !
Il suffit de créer une fonction qui modifie la variable BUFFER (l'une
des nombreuses disponible dans un contexte ZLE). Dans mon cas,
j'utilise le module read-from-minibuffer pour demander à l'utilisateur
de fournir la regex, puis je modifie chaque mot de $BUFFER sauf le
premier (la commande). Merci aux quelques scripts zle qui m'ont permis
de trouver read-from-minibuffer !
--%--
# Charge le module
autoload -U read-from-minibuffer
regex-edit () {
# variables locales
local REPLY words result
# fais un split de BUFFER (créer un tableau avec chaque mot)
words=(${=BUFFER})
# demande la regexp (et rempli la variable REPLY)
read-from-minibuffer "Regex:"
if [ -n $REPLY ]; then
# applique la regex sur les mots 2 à (longueur du tableau)
# et finalement reforme BUFFER à partir de la commande et du
# résultat
BUFFER="$words[1] $(echo $words[2,${#words}] | sed ${REPLY})"
fi
}
zle -N regex-edit
bindkey "^[e"] regex-edit
--%--
Attention, il n'y a pas de gestion d'erreur sur sed.
Petit test :
% echo toto
Regex: s/o/a/g
% echo tata
Et voilà, zsh, c'est magique !
--
http://asyd.net/home/ - Home Page
http://guses.org/home/ - French Speaking Solaris User Group