Journal Petite astuce zsh

Posté par  . Licence CC By‑SA.
Étiquettes :
40
14
août
2020

Besoin

J'utilise massivement mon shell et j'utilise assez fréquemment la commande watch. Elle me permet de faire des petits monitoring du pauvre par exemple :

watch -n1 "ls /toto/tata

Va vous montrer chaque second le contenu du dossier /toto/tata.

Ce que j'aime bien avec le shell, c'est que je construit incrémentalement des commandes complexes qui peuvent finir par avoir des formes plus ou moins complexes :

ma_commande | awk '$4!=3&&/toto/{a+=1;print $6}END{print "count:",a}'

Une fois que ma commande est construite, si je veux la watcher ça n'est plus très pratique, il faut protéger les déjà plusieurs niveaux de protections :(

Solution

J'ai enfin pris le temps configurer mon zsh pour ça. zle est l'outil interne de zsh qui gère toutes les entrées clavier, c'est l'équivalent de readline. C'est lui qu'on va utiliser pour ma solution. Il fonctionne à partir de widgets qui sont des fonctions shell enregistrées comme widget (grosso modo, il n'y a pas besoin d'aller plus loin pour ce qu'on va faire). On va pouvoir grâce à zle associer un raccourcis clavier à un widget avec :

bindkey '^t' mon_widget

Pour enregistrer un widget c'est simple :

zle -N mon_widget ma_fonction

Il ne reste plus qu'à écrire ma fonction.

Une fonction peu appeler un widget via zle (par exemple zle self-insert) et il existe pleins de widget déjà existant (tous les raccourcis de zsh sont implémentés via ces widgets).

function ma_fonction() {
  zle quote-line
  BUFFER="watch -n1 ${BUFFER}"
  zle accept-line
}

On protège la ligne courante, on ajoute la commande watch avant et on exécute le tout. Une fois qu'on a mis dans son fichier .zshrc:

function watch_fonction() {
  zle quote-line
  BUFFER="watch -n1 ${BUFFER}"
  zle accept-line
}
zle -N watch_widget watch_fonction
bindkey '^t' watch_widget

Il me suffit de faire Ctrl+t pour lancer perpétuellement ma commande.
On peut imaginer pas mal de choses possibles.

Je vous laisse avec la doc pour créer ses propres widgets.

Voir aussi

Ça peut remplacer des système plus globaux de macros comme (entre autre) :

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.