Zenu, des menus dans son terminal

Auteurice : Arthur Pons

Temps de lecture : ~4 minutes


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 :

et pour les personnes moins aggueries

Un article dédié au concept de découvrabilité et des techniques pour améliorer celle des interface en ligne de commande arrivera bientôt !

Zenu a été écrit par Marc Chantreux.

Installation

Dépendances

Zenu est écrit en zsh.

Télécharger le code

Le code est disponible dans nos dépôts git

git clone git://katzele.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. Des exemples existent dans le dossier eg. Il faut ensuite construire les fichiers de script

make

et lancer 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+w)
bindkey -s '' 'zenu.loop in chemin/vers/zenu/menus'
# Ou avec un alias
alias z="zenu.loop in chmein/vers/zenu/menus

Usage

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 entrée. 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. Le fichier nommé main est le menu de démarrage par défaut. Un menu est défini par :

  1. Une liste de commande et/ou de sous-menus

Pour chaque entrée dans le menu, la lettre précédée par le caractère inséré en tapant ctrl+_ 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

sachant que ^_ est la façon dont s’affiche le caractère spécial. Cela voudrait dire que seront surlignées les lettres m pour rentrer dans le menu mail, o dans le menu todo etc.

  1. 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 mnu 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 dessuos du menu.

  1. 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 +"%A %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é 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 +"%A %e %B %H:%M"

Modifications

Après ces modifications il faut relancer make 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 entrée par la touche q ou la touche r (il peut y en avoir plusieurs) :

...
case "\$zenu_key"
in (\$'q') zenu--
;; (\$'r') zenu--
...

Changer le caractère déterminant le surlignage

Le caractère spécial ^_ inséré en faisant ctrl + _ peut être un peu confus. Si vous souhaitez le changer dans le fichier bin/build remplacez \x1f de la ligne:

;; (face   | -f) sed -rn '/^##/q;s/\x1f(.)/\x1b[7m\1\x1b[m/;s/^/ /p' "$@"

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' "$@"

Évidemment il faudra modifier vos menus en fonction.