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.
Sinon, y’a GNU screen, pour gérer des fenêtres dans un même terminal. Un screen avec vim dedans, et les autres avec les diférentes pages de man. Ctrl+a+p et Ctrl+a+n pour passer de l’un à l’autre, Ctrl+a+c pour en créer un nouveau.