arthur.bebou

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

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

index.sh (11191B)


      1 #! page
      2 title: Naviguer en md dans vim
      3 author: Arthur Pons
      4 description: Il est possible de naviguer sur un site web de page md en page md dans vim en se passant totalement de navigateur web. Voici comment faire.
      5 publication: 2024-04-26
      6 
      7 sectionmd: main
      8 
      9 D'expérience, sur un vieil ordinateur, faire tourner un naviguateur web est
     10 l'une des choses "classiques" les plus gourmandes en mémoire et en calcul.
     11 S'en passer permettrait donc d'allonger la durée de vie de certains terminaux
     12 en rendant l'usage du web plus léger. La solution que nous allons documenter
     13 par la suite possède d'autres avantages que nous allons expliquer à la fin de
     14 l'article.
     15 
     16 ## Récupérer le contenu d'une page sur le web sans navigateur
     17 
     18 Les serveurs web écoutent sur internet et répondent à des requêtes HTTP.
     19 Pour contruire et envoyer des requêtes HTTP nous pouvons utiliser des logiciels
     20 dédiés tels que `wget` et `curl`. Nous allons utiliser `curl` par la suite.
     21 
     22 	curl -s arthur.bebou.netlib.re/index.md
     23 	
     24 	Unix et environnement ?
     25 	[Liste des articles au format tsv](http://arthur.bebou.netlib.re/articles.tsv)\
     26 	Chaque page est disponible au format :
     27 
     28 	  * `.html` - de l'html
     29 	  * `.sh` - les sources
     30 	[...]
     31 
     32 Si l'on veut lire l'article dans un pager ou un éditeur de texte ou peut piper
     33 la sortie de curl.
     34 
     35 	curl -s arthur.bebou.netlib.re/index.md | less
     36 	#ou
     37 	curl -s arthur.bebou.netlib.re/index.md | vim -
     38 
     39 Avec un petit `:setf markdown` on a même de la coloration syntaxique !
     40 
     41 ## Naviguer dans vim
     42 
     43 > Super mais comment on fait pour naviguer dans le site ?
     44 
     45 Nous allons pouvoir le faire grâce à une fonctionnalité magique de vim, le fait
     46 de pouvoir traiter le texte affiché à l'écran comme du code. On exécute ce que
     47 et là où l'on lit. Ainsi, si un lien vers un autre fichier md apparaît dans le
     48 document il est possible d'y préfixer la commande curl qui va bien, d'exécuter
     49 la commande et récupérer le contenu du lien.
     50 
     51 Par exemple faire de :
     52 
     53 	2024-04-26 - **[Naviguer en md dans vim](http://arthur.bebou.netlib.re/navigation/index.md)**
     54 
     55 ça :
     56 
     57 	2024-04-26 - **[Naviguer en md dans vim]
     58 	curl -s http://arthur.bebou.netlib.re/navigation/index.md
     59 
     60 se mettre sur la ligne avec le curl et taper `!!sh` puis faire entrer :
     61 
     62 	2024-04-26 - **[Naviguer en md dans vim]
     63 	# Naviguer en md dans vim
     64 
     65 	D'expérience, sur un vieil ordinateur, faire tourner un naviguateur web est
     66 	l'une des choses "classiques"[^1] les plus gourmandes en mémoire et en calcul.
     67 	S'en passer que c'est possible permettrait donc d'allonger la durée de vie de
     68 
     69 Il est ensuite possible de lire cet article. `u` reviendra en arrière (comme un
     70 `ctrl+z` dans la plupart des logiciels) et permettra de reprendre la lecture
     71 de la première page. Il est clair que cette navigation n'est pas idéale.
     72 Personnellement dans un navigateur classique je préfère ouvrir mes liens
     73 dans un nouvel onglet. Ca tombe bien, vim permet d'ouvrir des fenêtres.
     74 Si vous êtes dans vim vous pouvez lancer la commande `:vnew` pour constater
     75 qu'une nouvelle fenêtre verticale s'est ouverte. Si l'on pouvait y lancer notre
     76 commande `curl` nous aurions donc le nouvel article dans une fenêtre séparée.
     77 Pour cela il est possible de d'abord copier le lien, ouvrir la fenêtre, y coller
     78 le lien copié puis finalement y exécuter la commande. Puisqu'en markdown les
     79 liens sont (généralement) entre parenthèses la commande finale sera :
     80 
     81 	yi(:vnew<CR>p!!xargs curl -s<CR>
     82 
     83 endsection
     84 
     85 <<\@ ./details "Explication détaillée de la commande" | save_html main
     86 * `y` pour copier ("yank"), `i` pour "inner", `(` pour le délimiteur. Autrement
     87 dit on copie tout ce qui se trouve à l'intérieur des parenthèses.  
     88 * `:vnew<CR>` pour ouvrir une nouvelle fenêtre verticale. `<CR>` permet de
     89 simuler le fait d'appuyer sur la touche entrée.  
     90 * `p` pour coller le lien.  
     91 * `!!` pour filtrer la ligne courante dans une commande.  
     92 * `xargs curl -s`, la commande en question, `xargs` mettra ce qui se trouve
     93 dans stdin (à savoir le lien qu'on vient de coller) en argument de `curl`.  
     94 * `<CR>` pour exécuter le tout.
     95 @
     96 
     97 sectionmd: main
     98 
     99 Il est possible de s'en faire une macro en ajoutant
    100 
    101 	map <F6> yi(:vnew<CR>p!!xargs curl -s<CR>
    102 
    103 dans son `.vimrc`. `<F6>` peut être modifié pour y mettre la touche de son
    104 choix.
    105 
    106 Pour le moment cette macro n'est utile que pour ouvrir des documents qui se
    107 lisent bien dans un éditeur de texte. Quant est-il si le lien renvoie vers une
    108 image ? Pour remédier à ce problème il est possible de créer un script dédié
    109 qui va, sur la base de l'url, déclencher plutôt tel ou tel comportement. Ce
    110 script pourrait s'appeler `plumber.sh` et avoir la tête suivante :
    111 
    112 	case $1 in
    113 		*"youtube.com" )
    114 			mpv --save-position-on-quit --ytdl-format="$format" --cache-secs=30 --volume=50 "$1" 2>  /dev/null
    115 			;;
    116 		*".jpeg" )
    117 			feh -. "$1"
    118 			;;
    119 		*".md" )
    120 			curl -Ls "$1"
    121 			;;
    122 	esac
    123 
    124 Ainsi si le lien est un lien youtube on lance mpv, si c'est une photo ou
    125 l'ouvre avec feh et si c'est un fichier markdown on utilise directement curl.
    126 
    127 Il faudra modifier la macro en remplaçant `curl -s` par le chemin du script
    128 `plumber.sh`. Ce concept de script agissant sur le contenu textuel ouvert dans
    129 un éditeur de texte est une idée
    130 importante dans le système d'exploitation [plan
    131 9](https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs) où il porte le nom
    132 de... [plumber](https://en.wikipedia.org/wiki/Plumber_(program))
    133 et s'applique plus généralement à la totalité de l'os.
    134 
    135 Le site sur lequel vous lisez cet article existe entièrement
    136 en markdown. Essayez de modifier `index.html` en `index.md` (ou de l'ajouter à
    137 la fin) pour vous en convaincre. Cela veut dire que l'on peut le consulter sans
    138 jamais ouvrir un navigateur web, rendant possible la navigation sur du matériel
    139 très contraint.
    140 
    141 ## Comparatifs
    142 
    143 ### Performances
    144 
    145 Tout est mesuré sur un raspberry 3b requêtant la page que vous lisez. Les
    146 résultats pourraient être très différents si l'on faisait le comparatif sur un
    147 site très lourd. Ici les écarts sont presque aussi petits que possibles puisque
    148 j'essaye de faire de l'html assez léger. Disons que c'est le *best case scenario*
    149 pour firefox.
    150 
    151 |   | Nav "sobre" | Nav firefox |
    152 |---|-------------|-------------|
    153 | Taille sur le disque | ~8Mo | 237Mo |
    154 | Temps de chargement d'une page de zéro | < 0,1s | ~ 10s |
    155 | Temps de chargement si firefox ou vim déjà ouvert | < 0,1s | ~ 2s |
    156 | Données téléchargées | 6,26Ko | 14,31Ko |
    157 | Nb requêtes | 1 | 3 |
    158 
    159 Dans un contexte où le stockage serait vraiment contraint il se peut que
    160 firefox soit trop gros pour l'installer mais si l'on parle réduction de
    161 l'impact environnemental du numérique ce ne sont pas quelques centaines de Mo
    162 de stockage sur une carte SD qui feront vraiment la différence.
    163 
    164 La quantité de données est plus faible côté markdown parce que c'est un langage
    165 avec moins de cérémonie, `# machin` vs `<h1>machin</h1>` et parce que l'on ne
    166 télécharge pas de css.
    167 
    168 Au final c'est, je pense, vraiment le temps d'exécution qui fait une la
    169 différence. Je crois me souvenir qu'en moyenne une personne ne tolère que
    170 2/3 secondes de chargement avant d'abandonner.
    171 Charger la page en 10 secondes en partant de zéro et en quelques secondes à
    172 l'ouverture d'un onglet *dans le meilleur des cas* on s'approche vraiment de
    173 cette limite. Une personne pourrait donc juger la navigation web via firefox
    174 sur son vieil ordi non satisfaisante et serait fortement tentée de changer de
    175 matériel. Et pourtant le rasp est tout à fait capable d'ingérer ces données si
    176 on le fait via une interface différente.
    177 
    178 ### Limites
    179 
    180 Évidemment la comparaison a ses limites. L'expérience de navigation dans vim
    181 est peut-être fonctionnelle et, de plusieurs façons, supérieure à l'utilisation
    182 d'un navigateur classique mais n'est certainement pas identique. Exit le css et
    183 une bonne partie de la forme. Je pense que beaucoup de sites
    184 devraient et pourraient se résumer à du markdown markdown mais est vrai que
    185 certains ne feraient pas vraiment sens sous un format markdown.
    186 
    187 On hérite aussi des désavantages du markdown, de sa syntaxe parfois limitée et
    188 pas toujours parfaitement agréable à lire non plus. Par exemple le
    189 petit accordéon que j'utilise dans cet article ne peut pas être fait en
    190 markdown. Résultat ? La version markdown de cette page contient de l'html pour
    191 cette partie là. Je pourrais modifier mon générateur de site pour contourner ce
    192 souci mais au mieux je serais obligé d'intégrer une syntaxe strictement
    193 personnelle annonçant l'existence d'un accordéon qui ne sera pas forcément
    194 comprise par tous·tes et certainement pas par les parsers de markdown.
    195 
    196 
    197 ### Autres avantages
    198 
    199 Étant dans un éditeur de texte il est très facile d'enregistrer le document pour
    200 le consulter en mode hors-ligne. C'est également possible de le faire pour un site
    201 web mais l'affordance est moins incitative.
    202 
    203 Il est possible d'écrire directement dans le document pour prendre des notes.
    204 Non seulement on exécute ce que l'on et là où l'on lit mais on y écrit
    205 également ! vim est une ui qui permet de fondre ces trois actions en un seul
    206 espace. Une conséquence de cela qui est, pour mes usages, très agréable, est
    207 qu'il est possible de suivre des tutoriels contenant du code en exécutant
    208 directement le code dans le document ! Si le document consulté est
    209 un tutoriel python il y apparaîtra probablement quelque chose comme :
    210 
    211 - - -
    212 
    213 Pour afficher une chaîne de caractère on peut utiliser la fonction `print` :
    214 
    215     print("Coucou tout le monde !")
    216 
    217 - - -
    218 
    219 Si je lis ce tuto en markdown dans vim je peux me placer sur cette ligne, taper
    220 `!!python3` et obtenir son résultat dans le buffer vim[^1]. Cela économise des copier
    221 coller mais permet également de modifier et tester la ligne de code directement
    222 dans l'éditeur. Niveau sécurité il est toujours recommandé de *ne pas exécuter sur
    223 votre machine du code que vous ne comprenez pas* mais au moins dans un éditeur de
    224 texte il n'est à priori pas possible de [manipuler ce qui se retrouve dans votre
    225 presse papier](https://research.securitum.com/the-curious-case-of-copy-paste/).
    226 Il est possible que cela vous fasse penser au concept de "notebook" à la Jupyter
    227 et c'est tant mieux parce que ça y ressemble ! Il est tout à fait possible
    228 d'écrire un document qui mèle texte et code dans vim et n'y exécuter que le code.
    229 Avec une [macro pour le faire facilement](/macrosvim) et notre plumber on peut
    230 créer des documents vraiment intéressants.
    231 
    232 Pour le shell en particulier suivre un tuto sous cette forme est
    233 particulièrement agréable. Par exemple si un article contient des chemins
    234 bidons partout dans ses exemples vous pouvez faire un remplacement dans tous le
    235 fichier puis `!!sh` les commandes. Dans cette
    236 [faq](http://bebou.netlib.re/faq/) il est écrit `votre_utilisateurice` partout
    237 où devrait apparaître le nom de votre compte. Si celui-ci est `alice` alors on
    238 peut lancer la commande vim `:%s/votre_utilisateurice/alice/g` et suivre le tuto
    239 comme s'il avait été personnalisé pour soi.
    240 
    241 [^1]: en réalité non puisque j'écris les blocs de code avec des tabulations et python n'est donc pas content...
    242