RTFM
Par Jean-Seb le mardi 15 mars 2011, 00:17 - Linuxeries - Lien permanent
RTFM! Qui n'a jamais entendu cette injonction, tant laconique que
définitive, à la suite d'une innocente question ?
Alors on lance man... et les pages de manuel s'accumulent dans les
terminaux.
Mais il existe une solution.
Dans tous les moments de la vie, Vim est votre ami.
Apprendre à lire
man, classique
manest 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
manau 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-silentqui 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
$MANPAGERest 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
manavec l'option-Pqui 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.
- passer en
- 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,
gvimest un alias pourvim -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é.
- Vim peut également être lancé avec ou sans l'option
- 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.
- Vous pouvez initialiser Vim en précisant le nom du tab :
- 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 foodepuis Vim pour ouvrir la manpage foo. - Il serait cependant plus agréable de le faire d'un simple (double) clic.
- Vous pouvez bien sûr d'ores et déja faire
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.
Commentaires
Pour ouvrir automatiquement la page de manuel d'un mot il y a déjà la commande 'K'. Ce n'est pas aussi simple que de cliquer dessus, mais on s'en rapproche.