arthur.bebou

Le site arthur.bebou.netlib.re - retour accueil

git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |

index.sh (6922B)


      1 #! page
      2 
      3 title: Zenu, des menus dans son terminal
      4 author: Arthur Pons
      5 description: Explorons pourquoi et comment avoir des menus simples dans sa console de façon à favoriser la découvrabilité
      6 publication: 2023-11-24
      7 sectionmd: main
      8 
      9 Zenu est un logiciel permettant d'afficher des menus, navigables via des
     10 accélérateurs, permettant d'exécuter des commandes arbitraires. L'objectif est
     11 pour les utilisateurices aguerri·e·s :
     12 
     13   * d'accélérer l'appel aux commandes fréquemment utilisées
     14   * rationaliser le "rangement" et l'utilisation des multiples alias et
     15   fonctions qui traînent ici et là
     16   * montrer aux personnes n'utilisant pas de cli qu'on peut y faire des choses sympas
     17 
     18 et pour les personnes moins aggueries
     19 
     20   * d'offrir une meilleure découvrabilité des fonctionnalités disponibles en cli
     21   * faciliter le téléchargement et l'installation de commandes via le partage
     22     de menus zenu
     23 
     24 Zenu a été écrit par Marc Chantreux.
     25 
     26 ## Installation
     27 
     28 ### Dépendances
     29 
     30 Zenu est écrit en zsh. Il vous faut donc installer zsh. Sous debian `sudo apt install zsh`
     31 fera l'affaire. Pour l'exécuter une première fois il faudra lancer la commande `zsh` et
     32 se laisser guider par le menu. Si vous comptez fréquemment utiliser zenu il fait sens
     33 de configurer zsh comme votre shell par défaut. Pour cela :
     34 
     35     sudo usermod -s $(where zsh | head -n1)
     36 
     37 devrait faire l'affaire sous debian.
     38 
     39 Il vous faudra aussi probablement GNU sed.
     40 
     41 ### Télécharger le code
     42 
     43 Le code est disponible dans nos dépôts git
     44 
     45 	git clone git://bebou.netlib.re/zenu
     46 
     47 ### L'exécuter
     48 
     49 Il faut d'une manière ou d'une autre sourcer le fichier `zenu.zsh`. Le moyen le
     50 plus direct serait probablement de mettre `. chemin/vers/zenu.zsh` dans votre
     51 `.zshrc`. Les fichiers des menus sont dans le dossier `menus`. Vous devez le
     52 créer s'il n'existe pas (`mkdir menus`). Des exemples existent dans le dossier
     53 `eg`. Il faut ensuite construire les fichiers de script :
     54 
     55 	make -B
     56 
     57 **Du fait d'un bug qui reste à corriger il est obligatoire de systématiquement
     58 refaire tous les menus. `make -B` est donc de mise plutôt que simplement `make`.**
     59 
     60 On lance ensuite la commande `zenu.loop in chemin/vers/zenu/menus`. Si tout
     61 fonctionne correctement vous devriez voir les menus s'afficher. Vous pouvez
     62 rendre cette commande facilement accessible avec les commandes zsh :
     63 
     64 	# Raccourci (ctrl+q)
     65 	bindkey -s '^Q' 'zenu.loop in chemin/vers/zenu/menus^M'
     66 	# Ou avec un alias
     67 	alias z="zenu.loop in chmein/vers/zenu/menus
     68 
     69 **Attention**, `^Q` et `^M` ne sont pas littéralement les caractères `^` suivi
     70 de `Q` mais la représentation (dans vim du moins) du caractère `ctrl+q` inséré
     71 dans un shell en faisant `ctrl+v` suivi par `ctrl+q`. `^M` est la
     72 représentation de la touche "entrée", l'idée étant que le raccourci exécutera
     73 automatiquement la commande après l'avoir tapé. Vous pouvez choisir d'autres
     74 caractères.
     75 
     76 Il est possible de les mettre dans son `.zshrc` ou tout autre fichier de
     77 configuration lu au démarrage de zsh pour que le raccourci et l'alias soient
     78 dispos dans toutes vos sessions.
     79 
     80 ## Usage
     81 
     82 ### Navigation
     83 
     84 Pour entrer dans un menu ou exécuter une commande il faut entrer la touche
     85 surlignée. Par défaut pour remonter d'un menu il faut appuyer sur la touche `q`.
     86 Il est possible de la modifier comme expliqué
     87 [ici](#changer-la-touche-pour-remonter-dun-menu).
     88 
     89 ### Créer ses propre menus
     90 
     91 L'intérêt de l'outil est évidemment de créer ses propres menus ou de se les
     92 échanger.
     93 
     94 Les menus sont stockés dans le dossier `menus`. Ce sont des fichiers texte sans
     95 extension. Le fichier nommé `main` est le menu de démarrage par défaut. Un menu
     96 est défini par :
     97 
     98   1. Une liste de commande et/ou de sous-menus
     99 
    100 Pour chaque entrée dans le menu, la lettre précédée par un underscore sera
    101 celle qu'il faudra utiliser pour entrer dans le sous menu ou exécuter la
    102 commande. Un exemple pourrait être :
    103 
    104 	_mail
    105 	t_odo
    106 	_date
    107 
    108 Cela voudrait dire que seront surlignées les lettres m pour rentrer dans le
    109 menu mail, o dans le menu todo etc.
    110 
    111   2. Une section `pre` optionnelle
    112 
    113 Cette section peut contenir du code zsh arbitraire. Il sera exécuté avant
    114 que zsh attende que vous entriez une touche pour naviguer. Elle sert par
    115 exemple à afficher sous le menu courant des informations contextuelles utiles
    116 à la navigation ou la prise de décision. Par défaut cette section commence après
    117 une ligne comportant un commentaire `## pre` dans la déclaration du menu.
    118 
    119 Par exemple
    120 
    121 	## pre
    122 	ip -br a
    123 
    124 affichera des infos sur vos interfaces réseaux en dessous du menu.
    125 
    126   3. Une section de scripting `react`
    127  
    128 C'est ici que se trouve le coeur du menu. Elle commence toujours par
    129 un commentaire `## react`. Un exemple :
    130 
    131 	## react
    132 	;; (m) zenu+ mail
    133 	;; (o) zenu+ todo
    134 	;; (d) date +"%e %B %H:%M"
    135 
    136 Chaque entrée du menu doit commencer par `;;` puis, entre parenthèses, la
    137 lettre qui permet d'activer l'entrée. Idéalement elle doit correspondre à celle
    138 notée dans la première section du menu sinon il y aura désaccord entre ce qui
    139 s'affiche et la touche qu'il faut utiliser. Après la touche d'activation il faut
    140 noter la commande à exécuter. Le schéma générique est donc
    141 
    142 	;; (touche_activation) commande
    143 
    144 La commande peut être n'importe quelle commande shell arbitraire. Elle peut
    145 s'écrire sur plusieurs lignes. Si l'entrée du menu doit ouvrir un sous-menu
    146 vous pouvez utiliser la fonction `zenu+` qui prend en argument le nom du
    147 fichier du sous-menu que vous voulez ouvrir.
    148 
    149 Ici dans notre exemple `m` ouvrira le sous-menu mail, `o` le sous-menu todo et
    150 `d` affichera la date au format "Vendredi 3 décembre 15:45".
    151 
    152 La totalité du menu serait donc
    153 
    154 	_mail
    155 	t_odo
    156 	_date
    157 	## pre
    158 	ip -br a
    159 	## react
    160 	;; (m) zenu+ mail
    161 	;; (o) zenu+ todo
    162 	;; (d) date +"%e %B %H:%M"
    163 
    164 ## Modifications
    165 
    166 Après ces modifications il faut relancer la commande `make -B` pour qu'elles
    167 soient prises en compte.
    168 
    169 ### Changer la touche pour remonter d'un menu
    170 
    171 Dans le fichier `bin/build` il faut modifier la touche appelant la fonction
    172 `zenu--`. Par exemple pour substituer la touche `q` par la touche `r` ou la
    173 touche entrer (il peut y en avoir plusieurs) :
    174 
    175 	...
    176 	case "\$zenu_key"
    177 	in (\$'r') zenu--
    178 	;; (\$'\n') zenu--
    179 	...
    180 
    181 ### Changer le caractère déterminant le surlignage
    182 
    183 il se peut que vous vouliez insérer des `_` dans les noms de vos menus. Il
    184 faudrait alors modifier le caractère marquant le surlignage.  Si vous souhaitez
    185 le changer dans le fichier `bin/build` remplacez `_` des lignes :
    186 
    187 	;; (face   | -f) sed -rn '/^##/q;s/_(.)/\x1b[7m\1\x1b[m/;s/^/ /p' "$@"
    188     sed -rn '/^##/q;s/(.*)_((.).*)/\3 \1\2 /;p' "$@" | awk '
    189 
    190 par le caractère que vous souhaitez utiliser. Par exemple si l'on souhaite
    191 utiliser `~` :
    192 
    193 	;; (face   | -f) sed -rn '/^##/q;s/~(.)/\x1b[7m\1\x1b[m/;s/^/ /p' "$@"
    194     sed -rn '/^##/q;s/(.*)~((.).*)/\3 \1\2 /;p' "$@" | awk '
    195 
    196 Évidemment il faudra modifier vos menus en fonction.