Zenu est un logiciel permettant d’afficher des menus, navigables via des accélérateurs, permettant d’exécuter des commandes arbitraires. L’objectif est pour les utilisateurices aguerri·e·s :
- d’accélérer l’appel aux commandes fréquemment utilisées
- rationaliser le “rangement” et l’utilisation des multiples alias et fonctions qui traînent ici et là
- montrer aux personnes n’utilisant pas de cli qu’on peut y faire des choses sympas
et pour les personnes moins aggueries
- d’offrir une meilleure découvrabilité des fonctionnalités disponibles en cli
- faciliter le téléchargement et l’installation de commandes via le partage de menus zenu
Zenu a été écrit par Marc Chantreux.
Installation
Dépendances
Zenu est écrit en zsh. Il vous faut donc installer zsh. Sous debian sudo apt install zsh
fera l’affaire. Pour l’exécuter une première fois il faudra lancer la commande zsh
et
se laisser guider par le menu. Si vous comptez fréquemment utiliser zenu il fait sens
de configurer zsh comme votre shell par défaut. Pour cela :
sudo usermod -s $(where zsh | head -n1)
devrait faire l’affaire sous debian.
Il vous faudra aussi probablement GNU sed.
Télécharger le code
Le code est disponible dans nos dépôts git
git clone git://bebou.netlib.re/zenu
L’exécuter
Il faut d’une manière ou d’une autre sourcer le fichier zenu.zsh
. Le moyen le
plus direct serait probablement de mettre . chemin/vers/zenu.zsh
dans votre
.zshrc
. Les fichiers des menus sont dans le dossier menus
. Vous devez le
créer s’il n’existe pas (mkdir menus
). Des exemples existent dans le dossier
eg
. Il faut ensuite construire les fichiers de script :
make -B
Du fait d’un bug qui reste à corriger il est obligatoire de systématiquement
refaire tous les menus. make -B
est donc de mise plutôt que simplement make
.
On lance ensuite la commande zenu.loop in chemin/vers/zenu/menus
. Si tout
fonctionne correctement vous devriez voir les menus s’afficher. Vous pouvez
rendre cette commande facilement accessible avec les commandes zsh :
# Raccourci (ctrl+q)
bindkey -s '^Q' 'zenu.loop in chemin/vers/zenu/menus^M'
# Ou avec un alias
alias z="zenu.loop in chmein/vers/zenu/menus
Attention, ^Q
et ^M
ne sont pas littéralement les caractères ^
suivi
de Q
mais la représentation (dans vim du moins) du caractère ctrl+q
inséré
dans un shell en faisant ctrl+v
suivi par ctrl+q
. ^M
est la
représentation de la touche “entrée”, l’idée étant que le raccourci exécutera
automatiquement la commande après l’avoir tapé. Vous pouvez choisir d’autres
caractères.
Il est possible de les mettre dans son .zshrc
ou tout autre fichier de
configuration lu au démarrage de zsh pour que le raccourci et l’alias soient
dispos dans toutes vos sessions.
Usage
Navigation
Pour entrer dans un menu ou exécuter une commande il faut entrer la touche
surlignée. Par défaut pour remonter d’un menu il faut appuyer sur la touche q
.
Il est possible de la modifier comme expliqué
ici.
Créer ses propre menus
L’intérêt de l’outil est évidemment de créer ses propres menus ou de se les échanger.
Les menus sont stockés dans le dossier menus
. Ce sont des fichiers texte sans
extension. Le fichier nommé main
est le menu de démarrage par défaut. Un menu
est défini par :
- Une liste de commande et/ou de sous-menus
Pour chaque entrée dans le menu, la lettre précédée par un underscore sera celle qu’il faudra utiliser pour entrer dans le sous menu ou exécuter la commande. Un exemple pourrait être :
_mail
t_odo
_date
Cela voudrait dire que seront surlignées les lettres m pour rentrer dans le menu mail, o dans le menu todo etc.
- Une section
pre
optionnelle
Cette section peut contenir du code zsh arbitraire. Il sera exécuté avant
que zsh attende que vous entriez une touche pour naviguer. Elle sert par
exemple à afficher sous le menu courant des informations contextuelles utiles
à la navigation ou la prise de décision. Par défaut cette section commence après
une ligne comportant un commentaire ## pre
dans la déclaration du menu.
Par exemple
## pre
ip -br a
affichera des infos sur vos interfaces réseaux en dessous du menu.
- Une section de scripting
react
C’est ici que se trouve le coeur du menu. Elle commence toujours par
un commentaire ## react
. Un exemple :
## react
;; (m) zenu+ mail
;; (o) zenu+ todo
;; (d) date +"%e %B %H:%M"
Chaque entrée du menu doit commencer par ;;
puis, entre parenthèses, la
lettre qui permet d’activer l’entrée. Idéalement elle doit correspondre à celle
notée dans la première section du menu sinon il y aura désaccord entre ce qui
s’affiche et la touche qu’il faut utiliser. Après la touche d’activation il faut
noter la commande à exécuter. Le schéma générique est donc
;; (touche_activation) commande
La commande peut être n’importe quelle commande shell arbitraire. Elle peut
s’écrire sur plusieurs lignes. Si l’entrée du menu doit ouvrir un sous-menu
vous pouvez utiliser la fonction zenu+
qui prend en argument le nom du
fichier du sous-menu que vous voulez ouvrir.
Ici dans notre exemple m
ouvrira le sous-menu mail, o
le sous-menu todo et
d
affichera la date au format “Vendredi 3 décembre 15:45”.
La totalité du menu serait donc
_mail
t_odo
_date
## pre
ip -br a
## react
;; (m) zenu+ mail
;; (o) zenu+ todo
;; (d) date +"%e %B %H:%M"
Modifications
Après ces modifications il faut relancer la commande make -B
pour qu’elles
soient prises en compte.
Changer la touche pour remonter d’un menu
Dans le fichier bin/build
il faut modifier la touche appelant la fonction
zenu--
. Par exemple pour substituer la touche q
par la touche r
ou la
touche entrer (il peut y en avoir plusieurs) :
...
case "\$zenu_key"
in (\$'r') zenu--
;; (\$'\n') zenu--
...
Changer le caractère déterminant le surlignage
il se peut que vous vouliez insérer des _
dans les noms de vos menus. Il
faudrait alors modifier le caractère marquant le surlignage. Si vous souhaitez
le changer dans le fichier bin/build
remplacez _
des lignes :
;; (face | -f) sed -rn '/^##/q;s/_(.)/\x1b[7m\1\x1b[m/;s/^/ /p' "$@"
sed -rn '/^##/q;s/(.*)_((.).*)/\3 \1\2 /;p' "$@" | awk '
par le caractère que vous souhaitez utiliser. Par exemple si l’on souhaite
utiliser ~
:
;; (face | -f) sed -rn '/^##/q;s/~(.)/\x1b[7m\1\x1b[m/;s/^/ /p' "$@"
sed -rn '/^##/q;s/(.*)~((.).*)/\3 \1\2 /;p' "$@" | awk '
Évidemment il faudra modifier vos menus en fonction.