arthur.bebou

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

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

commit 2599427e66eb5e7daa17f998b490fcb3020704fc
parent d0979d80d0924ba940a77fe7a96d2a58f3cd44f0
Auterice: Arthur Pons <arthur.pons@unistra.fr>
Date:   Mon, 29 Apr 2024 17:31:17 +0200

Relecture article zenu et navigation

Diffstat:
Mcontents/navigation/index.sh | 135++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mcontents/zenu/index.sh | 98+++++++++++++++++++++++++++++++++++++++++++------------------------------------
2 files changed, 125 insertions(+), 108 deletions(-)

diff --git a/contents/navigation/index.sh b/contents/navigation/index.sh @@ -8,16 +8,16 @@ sectionmd: main D'expérience, sur un vieil ordinateur, faire tourner un naviguateur web est l'une des choses "classiques" les plus gourmandes en mémoire et en calcul. -S'en passer que c'est possible permettrait donc d'allonger la durée de vie de -certains terminaux en rendant l'usage du web plus léger. La solution que nous -allons documenter par la suite possède d'autres avantages, un peu de niche, -que nous allons expliquer à la fin de l'article. +S'en passer permettrait donc d'allonger la durée de vie de certains terminaux +en rendant l'usage du web plus léger. La solution que nous allons documenter +par la suite possède d'autres avantages que nous allons expliquer à la fin de +l'article. ## Récupérer le contenu d'une page sur le web sans navigateur -Les serveurs web écoutent sur internet et répondent à des requêtes http. +Les serveurs web écoutent sur internet et répondent à des requêtes HTTP. Pour contruire et envoyer des requêtes HTTP nous pouvons utiliser des logiciels -dédiés tels que `wget` et `curl`. Nous allons utiliser `curl` pour la suite. +dédiés tels que `wget` et `curl`. Nous allons utiliser `curl` par la suite. curl -s arthur.bebou.netlib.re/index.md @@ -42,10 +42,10 @@ Avec un petit `:setf markdown` on a même de la coloration syntaxique ! > Super mais comment on fait pour naviguer dans le site ? -Eh bien nous allons pouvoir le faire grâce à une fonctionnalité magique de vim, -le fait de pouvoir traiter le texte affiché à l'écran comme du code. On exécute -là où l'on lit. Ainsi, si un lien vers un autre fichier md apparaît dans le -document, il est possible d'y préfixer la commande curl qui va bien, d'exécuter +Nous allons pouvoir le faire grâce à une fonctionnalité magique de vim, le fait +de pouvoir traiter le texte affiché à l'écran comme du code. On exécute ce que +et là où l'on lit. Ainsi, si un lien vers un autre fichier md apparaît dans le +document il est possible d'y préfixer la commande curl qui va bien, d'exécuter la commande et récupérer le contenu du lien. Par exemple faire de : @@ -60,7 +60,7 @@ Par exemple faire de : se mettre sur la ligne avec le curl et taper `!!sh` puis faire entrer : 2024-04-26 - **[Naviguer en md dans vim] - Naviguer en md dans vim + # Naviguer en md dans vim D'expérience, sur un vieil ordinateur, faire tourner un naviguateur web est l'une des choses "classiques"[^1] les plus gourmandes en mémoire et en calcul. @@ -71,12 +71,12 @@ Il est ensuite possible de lire cet article. `u` reviendra en arrière (comme un de la première page. Il est clair que cette navigation n'est pas idéale. Personnellement dans un navigateur classique je préfère ouvrir mes liens dans un nouvel onglet. Ca tombe bien, vim permet d'ouvrir des fenêtres. -Si vous êtes dans vim vus pouvez lancer la commande `:vne` pour constater +Si vous êtes dans vim vous pouvez lancer la commande `:vnew` pour constater qu'une nouvelle fenêtre verticale s'est ouverte. Si l'on pouvait y lancer notre commande `curl` nous aurions donc le nouvel article dans une fenêtre séparée. Pour cela il est possible de d'abord copier le lien, ouvrir la fenêtre, y coller -le lien copier puis finalement y exécuter la commande. Puisque les liens sont entre -parenthèses la commande finale sera : +le lien copié puis finalement y exécuter la commande. Puisqu'en markdown les +liens sont (généralement) entre parenthèses la commande finale sera : yi(:vnew<CR>p!!xargs curl -s<CR> @@ -96,18 +96,18 @@ dans stdin (à savoir le lien qu'on vient de coller) en argument de `curl`. sectionmd: main -Il est possible de s'en faire une macro en ajoutant +Il est possible de s'en faire une macro en ajoutant map <F6> yi(:vnew<CR>p!!xargs curl -s<CR> -dans son `.vimrc`. Modifier `<F6>` pour y mettre la touche de son choix. +dans son `.vimrc`. `<F6>` peut être modifié pour y mettre la touche de son +choix. -Pour le moment cette macro n'est utile que pour ouvrir des documents qui -se lisent bien dans un éditeur de texte. Quant est-il si le lien renvoie -vers une image jpeg ? Pour remédier à ce problème il est possible de créer -un script dédié qui va, sur la base de l'url, déclencher plutôt tel ou -tel comportement. Ce script pourrait s'appeler `plumber.sh` et avoir la -tête suivante : +Pour le moment cette macro n'est utile que pour ouvrir des documents qui se +lisent bien dans un éditeur de texte. Quant est-il si le lien renvoie vers une +image ? Pour remédier à ce problème il est possible de créer un script dédié +qui va, sur la base de l'url, déclencher plutôt tel ou tel comportement. Ce +script pourrait s'appeler `plumber.sh` et avoir la tête suivante : case $1 in *"youtube.com" ) @@ -126,25 +126,27 @@ l'ouvre avec feh et si c'est un fichier markdown on utilise directement curl. Il faudra modifier la macro en remplaçant `curl -s` par le chemin du script `plumber.sh`. Ce concept de script agissant sur le contenu textuel ouvert dans -un éditeur de texte (ou plus largement dans la totalité de l'os) est une idée +un éditeur de texte est une idée importante dans le système d'exploitation [plan 9](https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs) où il porte le nom -de... [plumber](https://en.wikipedia.org/wiki/Plumber_(program)). +de... [plumber](https://en.wikipedia.org/wiki/Plumber_(program)) +et s'applique plus généralement à la totalité de l'os. -En plus de l'html le site sur lequel vous lisez cet article existe entièrement +Le site sur lequel vous lisez cet article existe entièrement en markdown. Essayez de modifier `index.html` en `index.md` (ou de l'ajouter à la fin) pour vous en convaincre. Cela veut dire que l'on peut le consulter sans -jamais ouvrir un navigateur web, facilitement voir rendant tout simplement -possible la navigation sur du matériel très contraint. +jamais ouvrir un navigateur web, rendant possible la navigation sur du matériel +très contraint. ## Comparatifs ### Performances -Tout est mesuré sur un raspberry 3b sur la page de cet article. Les résultats -pourraient être très différents si l'on faisait le comparatif sur un site très -lourd. Ici les écarts sont presque aussi petits que possibles puisque j'essaye -de faire de l'html assez léger. +Tout est mesuré sur un raspberry 3b requêtant la page que vous lisez. Les +résultats pourraient être très différents si l'on faisait le comparatif sur un +site très lourd. Ici les écarts sont presque aussi petits que possibles puisque +j'essaye de faire de l'html assez léger. Disons que c'est le *best case scenario* +pour firefox. | | Nav "sobre" | Nav firefox | |---|-------------|-------------| @@ -155,63 +157,65 @@ de faire de l'html assez léger. | Nb requêtes | 1 | 3 | Dans un contexte où le stockage serait vraiment contraint il se peut que -firefox soit gros pour l'installer mais si l'on parle de l'impact -environnemental du numérique ce ne sont pas quelques centaines de Mo de -stockage sur une carte SD qui feront vraiment la différence. +firefox soit trop gros pour l'installer mais si l'on parle réduction de +l'impact environnemental du numérique ce ne sont pas quelques centaines de Mo +de stockage sur une carte SD qui feront vraiment la différence. La quantité de données est plus faible côté markdown parce que c'est un langage avec moins de cérémonie, `# machin` vs `<h1>machin</h1>` et parce que l'on ne télécharge pas de css. -Au final c'est, je pense, vraiment le temps d'exécution qui fait une vraie +Au final c'est, je pense, vraiment le temps d'exécution qui fait une la différence. Je crois me souvenir qu'en moyenne une personne ne tolère que -2/3 secondes de chargement pour une page web avant d'abandonner son chargement. -Avec les 10 secondes à l'ouverture du navigateur et quelques secondes à -l'ouverture d'un onglet et au chargement de la page *dans le meilleur des -cas* on s'approche vraiment de cette limite. Il n'est donc pas déraisonnable -penser qu'une moyenne jugerai la navigation web via firefox sur un rasp non -satisfaisante et serait fortement tentée de changer de matériel. Et pourtant -le rasp est tout à fait capable d'ingérer ces données si on le fait via -une interface différente. +2/3 secondes de chargement avant d'abandonner. +Charger la page en 10 secondes en partant de zéro et en quelques secondes à +l'ouverture d'un onglet *dans le meilleur des cas* on s'approche vraiment de +cette limite. Une personne pourrait donc juger la navigation web via firefox +sur son vieil ordi non satisfaisante et serait fortement tentée de changer de +matériel. Et pourtant le rasp est tout à fait capable d'ingérer ces données si +on le fait via une interface différente. ### Limites Évidemment la comparaison a ses limites. L'expérience de navigation dans vim est peut-être fonctionnelle et, de plusieurs façons, supérieure à l'utilisation d'un navigateur classique mais n'est certainement pas identique. Exit le css et -une bonne partie de la forme par exemple. Bien que je sois de l'avis que bien -plus de sites devraient être bien plus simples et pouvoir se résumer à du -markdown il est vrai que certains n'auraient pas vraiment de sens sous un -format markdown. +une bonne partie de la forme. Je pense que beaucoup de sites +devraient et pourraient se résumer à du markdown markdown mais est vrai que +certains ne feraient pas vraiment sens sous un format markdown. On hérite aussi des désavantages du markdown, de sa syntaxe parfois limitée et -pas toujours parfaitement agréable à lire tel quel non plus. Par exemple le +pas toujours parfaitement agréable à lire non plus. Par exemple le petit accordéon que j'utilise dans cet article ne peut pas être fait en -markdown. Résultat ? Le markdown de cette page contient de l'html pour cette -partie là. Je pourrais modifier mon générateur de site pour contourner ce souci -mais au mieux je serai obligé d'intégrer une syntaxe strictement personnelle -annonçant l'existence d'un accordéon qui ne sera pas forcément comprise par -tous·tes et certainement pas par les parsers de markdown. +markdown. Résultat ? La version markdown de cette page contient de l'html pour +cette partie là. Je pourrais modifier mon générateur de site pour contourner ce +souci mais au mieux je serais obligé d'intégrer une syntaxe strictement +personnelle annonçant l'existence d'un accordéon qui ne sera pas forcément +comprise par tous·tes et certainement pas par les parsers de markdown. ### Autres avantages Étant dans un éditeur de texte il est très facile d'enregistrer le document pour -le consulter de façon hors-ligne. C'est également possible de le faire pour un site +le consulter en mode hors-ligne. C'est également possible de le faire pour un site web mais l'affordance est moins incitative. -Il est possible d'écrire directement dans le document pour prendre des notes. Non -seulement on exécute ce que et là où l'on lit mais on y écrit également. vim est -une ui qui permet de fondre ces trois actions en un seul espace. Une conséquence -de cela qui est, pour mes usages, très agréable, est qu'il est possible de suivre -des tutoriels contenant du code en exécutant directement le code dans le document ! -Si le document consulté est par exemple un tutoriel python il y apparaitra probablement -quelque chose comme : +Il est possible d'écrire directement dans le document pour prendre des notes. +Non seulement on exécute ce que l'on et là où l'on lit mais on y écrit +également ! vim est une ui qui permet de fondre ces trois actions en un seul +espace. Une conséquence de cela qui est, pour mes usages, très agréable, est +qu'il est possible de suivre des tutoriels contenant du code en exécutant +directement le code dans le document ! Si le document consulté est +un tutoriel python il y apparaîtra probablement quelque chose comme : + +- - - Pour afficher une chaîne de caractère on peut utiliser la fonction `print` : print("Coucou tout le monde !") +- - - + Si je lis ce tuto en markdown dans vim je peux me placer sur cette ligne, taper `!!python3` et obtenir son résultat dans le buffer vim[^1]. Cela économise des copier coller mais permet également de modifier et tester la ligne de code directement @@ -219,14 +223,19 @@ dans l'éditeur. Niveau sécurité il est toujours recommandé de *ne pas exécu votre machine du code que vous ne comprenez pas* mais au moins dans un éditeur de texte il n'est à priori pas possible de [manipuler ce qui se retrouve dans votre presse papier](https://research.securitum.com/the-curious-case-of-copy-paste/). +Il est possible que cela vous fasse penser au concept de "notebook" à la Jupyter +et c'est tant mieux parce que ça y ressemble ! Il est tout à fait possible +d'écrire un document qui mèle texte et code dans vim et n'y exécuter que le code. +Avec une [macro pour le faire facilement](/macrosvim) et notre plumber on peut +créer des documents vraiment intéressants. Pour le shell en particulier suivre un tuto sous cette forme est particulièrement agréable. Par exemple si un article contient des chemins bidons partout dans ses exemples vous pouvez faire un remplacement dans tous le -fichier puis `!!sh` les commandes. Par exemple dans cette +fichier puis `!!sh` les commandes. Dans cette [faq](http://bebou.netlib.re/faq/) il est écrit `votre_utilisateurice` partout où devrait apparaître le nom de votre compte. Si celui-ci est `alice` alors on -peut lancer la commande vim `:%s/votre_utilisateurice/alice/` et suivre le tuto +peut lancer la commande vim `:%s/votre_utilisateurice/alice/g` et suivre le tuto comme s'il avait été personnalisé pour soi. [^1]: en réalité non puisque j'écris les blocs de code avec des tabulations et python n'est donc pas content... diff --git a/contents/zenu/index.sh b/contents/zenu/index.sh @@ -6,7 +6,6 @@ description: Explorons pourquoi et comment avoir des menus simples dans sa conso publication: 2023-11-24 sectionmd: main - 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 : @@ -18,10 +17,7 @@ pour les utilisateurices aguerri·e·s : 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 - -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 ! + * faciliter le téléchargement et l'installation de commandes via le partage de menus zenu Zenu a été écrit par Marc Chantreux. @@ -29,7 +25,14 @@ Zenu a été écrit par Marc Chantreux. ### Dépendances -Zenu est écrit en zsh. +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. ### Télécharger le code @@ -39,11 +42,11 @@ Le code est disponible dans nos dépôts git ### 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 +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 @@ -52,20 +55,25 @@ 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 +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 +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 -entrée. Il est possible de la modifier comme expliqué [ici](#changer-la-touche-pour-remonter-dun-menu). +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](#changer-la-touche-pour-remonter-dun-menu). ### Créer ses propre menus @@ -76,23 +84,22 @@ 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 : +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 + _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. +Cela voudrait dire que seront surlignées les lettres m pour rentrer dans le +menu mail, o dans le menu todo etc. 2. 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 +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. @@ -101,7 +108,7 @@ Par exemple ## pre ip -br a -affichera des infos sur vos interfaces réseaux en dessuos du menu. +affichera des infos sur vos interfaces réseaux en dessous du menu. 3. Une section de scripting `react` @@ -111,11 +118,11 @@ un commentaire `## react`. Un exemple : ## react ;; (m) zenu+ mail ;; (o) zenu+ todo - ;; (d) date +"author: %e %B %H:%M" + ;; (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é dans la première section du menu sinon il y aura désaccord entre ce qui +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 @@ -131,45 +138,46 @@ Ici dans notre exemple `m` ouvrira le sous-menu mail, `o` le sous-menu todo et La totalité du menu serait donc - ^_mail - t^_odo - ^_date + _mail + t_odo + _date ## pre ip -br a ## react ;; (m) zenu+ mail ;; (o) zenu+ todo - ;; (d) date +"author: %e %B %H:%M" + ;; (d) date +"%e %B %H:%M" ## Modifications -Après ces modifications il faut relancer `make` pour qu'elles soient prises en -compte. +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 entrée par la touche `q` ou la touche `r` (il -peut y en avoir plusieurs) : +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 (\$'q') zenu-- - ;; (\$'r') zenu-- + in (\$'r') zenu-- + ;; (\$'\n') 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: +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/\x1f(.)/\x1b[7m\1\x1b[m/;s/^/ /p' "$@" + ;; (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 `_` : +utiliser `~` : - ;; (face | -f) sed -rn '/^##/q;s/_(.)/\x1b[7m\1\x1b[m/;s/^/ /p' "$@" + ;; (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. -