Apprendre à lire

man, classique
  • man est lancé depuis le terminal actif, puis fermé pour utiliser la commande.
    • Bien entendu, juste après la fermeture, la moitié des paramètres est déja oubliée.


man, séparé
  • Vous utilisez un autre terminal, et vous lancez man au sein de celui-ci.
    • Le terminal principal reste libre, et vous gardez le manuel ouvert à l'endroit qui vous intéresse.
    • Cette façon de faire est un peu meilleure, mais les terminaux ont tendance à se multiplier, voire s'empiler (sous X).


man avec Vim
  • Vim possède depuis plusieurs années déja le support des tabs.
    • Chaque tab correspond à une zone de saisie différente au sein de Vim.
    • A ne pas confondre avec le mode splitté de la zone de saisie (:help split).
    • Très pratique pour l'édition multiple de sources.
  • Pour tester les tabs:
    • Lancez Vim.
    • Et en mode commande: :tabnew
  • Pour avoir la liste de toutes les possibilités associées aux tabs:
    • :help tabs
  • Nous allons utiliser les tabs afin d'ouvrir chaque nouvelle page de man dans un nouveau tab.



Contrôle de Vim à distance

Tout cela est bien beau...
  • Vous allez me dire (et vous aurez bien raison) que tout cela est bien beau.
  • Et vous ajouterez (toujours avec raison) qu'encore faudrait-il avoir la possibilité de contrôler une instance de Vim depuis le shell.
  • Comme vous vous en doutez, on peut. A la seule condition que Vim ait été compilé avec l'option clientserver
    • Le paquet officiel de Arch comporte cette option. Utilisateurs Ubuntu, ne pleurez pas, vous bénéficiez du même traitement de faveur.
    • Les vrais mecs sous Gentoo n'ont plus qu'à recompiler avec le bon flag. Quand aux Slackers, ils ont d'autres soucis: Pango vient de se téléscoper Cairo après une mise à jour douteuse, et plus rien ne fonctionne.


Vim! Lève toi et marche!
  • Il faut lancer Vim en mode serveur, avec un nom d'instance pour le repérer par la suite:
    • Afin de bien appuyer le propos, finiderire est utilisé comme nom d'instance.
    • vim --servername finiderire
  • Et ensuite, on ouvre un fichier dans l'instance finiderire.
    • gvim --servername finiderire --remote-tab /etc/passwd
  • A noter l'option --remote-tab-silent qui ne provoquera pas d'avertissement de Vim si l'instance est créée en même que l'ouverture de la tab.
    • Nous allons utiliser cette option pour notre pager, afin d'éviter de tester l'existence de l'instance pour la première ouverture.
  • Et pour tout voir sans rien payer:
    • :help remote



Communication man/Vim

MANPAGER
  • $MANPAGER est une variable d'environnement du shell qui permet d'indiquer quel pager utiliser pour ouvrir une page man.
    • Il faudra penser à l'initialiser avec le nom et l'emplacement de notre script, une fois celui-ci au point.
  • Pour le moment, nous lançons man avec l'option -P qui a une priorité supérieur à $MANPAGER.
    • Pour avoir le comportement par défaut de man (ouverture dans le terminal de la page de manuel):
    • man -P "less -s" ls


Les opérations à réaliser
  • On commence par récupérer la sortie de man avec un simple cat:
    • man -P "cat " ls >/tmp/man.$$
  • Récupération de la page dans Vim:
    • gvim --servername finiderire --remote-tab-silent /tmp/man.$$
  • Effacement du fichier temporaire:
    • rm /tmp/man.$$



Script final

Voici un script plus complet.

#!/bin/bash

pageman=/tmp/$$.man

rm -f /tmp/*.man

cat | col -b -x > $pageman

man_asked=/tmp/"$(head -1 $pageman | sed 's/\(^[^\ \(]\+\).*/\1/')".man
mv "$pageman" "$man_asked"

gvim -R -c 'set ft=man nomod nolist nonumber guioptions="-T -m"' -font "Terminus (TTF) 12" -c 'map q :q!<CR>' --servername finiderire --remote-tab-silent $man_asked



Et voici les explications
  • Effacer les anciens fichiers man en entrée du script.
    • On ne peut pas le faire en sortie du script, car il n'y aurait plus rien dans Vim.
    • rm -f /tmp/*.man
  • Formatter la sortie de man.
    • cat | col -b -x > $pageman
  • Récupérer le nom de la page de manuel demandée.
    • Cela sert à générer le nom du fichier, afin d'afficher le nom de la commande dans la tab.

 man_asked=/tmp/"$(head -1 $pageman | sed 's/\(^[^\ \(]\+\).*/\1/')".man


  • Et le gros morceau: le lancement de Vim.
    • passer en read-only : -R
    • indiquer que le type de fichier est une page man, pour la coloration syntaxique: set ft=man
    • diverses commandes pour désactiver les préférences du .vimrc : nomod nolist nonumber
    • supprimer la toolbar et le menu pour gagner de la place: guioptions="-T -m"
    • changer la fonte par défaut: font "Terminus (TTF) 12". Cette fonte est disponible dans les paquets Arch.
    • permettre de quitter la page avec un simple appui sur la touche q : map q :q!<CR>. Et si vous modifiâtes par erreur le buffer, vous sortirez sans confirmation.
    • Et enfin, ouvrir la page man dans l'instance finiderire, dans une tab portant le nom de la commande demandée.


  • N'oubliez pas d'ajouter dans votre .bashrc (pour les utilisateurs de bash, bien sûr)
    • export MANPAGER=/path/vers/votre/script



Améliorations possibles

  • Dans ce script, j'utilise gvim, qui est la version X de Vim.
    • Vim peut également être lancé avec ou sans l'option -g, selon que vous désirez ou non la version X.
    • En d'autres termes, gvim est un alias pour vim -g
    • Vous pourrez donc modifier le script pour lancer en mode console vim, et passer en mode gvim si l'environnement graphique est détecté.
  • Une autre amélioration possible serait de nommer les tabs sans l'astuce du mv.
    • Vous pouvez initialiser Vim en précisant le nom du tab : :help setting-guilabel.
    • C'est d'ailleurs la façon la plus propre de procéder. Je n'ai découvert cette possibilité qu'après avoir écrit le script, à la relecture de ce billet.
    • Cette modification est donc laissée à titre d'exercice au lecteur.
  • Une modification sympathique serait d'intercepter le double clic de la souris, qui surligne un mot sous Vim, afin de lancer la page man correspondante.
    • Vous pouvez bien sûr d'ores et déja faire :!man foo depuis Vim pour ouvrir la manpage foo.
    • Il serait cependant plus agréable de le faire d'un simple (double) clic.



RTFM, RTFB

  • Si d'aventure vous goûtez au RTFM! sur un forum, consolez-vous en pensant que ça arrive même aux meilleurs.
    • Et si vraiment vous êtes vexé, consolez-vous en pensant que vous avez désormais le plus beau pager de la galaxie pour lire les pages man.
  • Voilà.
  • Et n'oubliez pas, RTFB !
    • Read The Finest Blog, bien entendu.