Artisan Numérique

/développement/éditeur de texte/vim/ Petite introduction à VIM

Cela fait quelques temps déjà que j'évoque VIM au détours de divers billets sans jamais m'y arrêter vraiment. Du coup, j'ai reçu deux trois messages me demandant d'en parler un peu plus. Dans ces mêmes messages il m'a été (très gentiment) "reproché" de faire des articles un peu trop fleuves. Du coup je vais essayer de saucissonner un peu plus qu'à l'accoutumée pour commencer par une introduction très générale à VIM. Le reste (customisation, plugins, etc.) viendra plus tard.

Mais d'où sors-tu une telle vieillerie ?

Que voulez-vous, dans ce monde d'iPad et autres doudoux numériques, même les développeurs veulent que ça claque, que ça brille, que ça gigote, et comme VIM ne fait rien de tout cela, ça ne les excite que peu... Mais de là à considérer VIM comme une vieillerie c'est aller un peu vite en besogne.

Ceci étant dit, VIM est effectivement un "vieux" logiciel qui existe depuis plus de 10 ans et qui s'inspire de VI qui lui est né dans les années 70... Pour la petite histoire, son auteur (celui de VIM) cherchait à créer un clone de VI pour l'Amiga en partant du code de STvi, un clone de vi pour Atari... VIM voulait à l'époque dire VI iMitation et ce n'est que plus tard qu'il devint VI iMproved.

C'est sans doute cette longue histoire qui donne à VIM son côté faussement ventage. Mais ce serait oublier un peu vite qu'un logiciel doté d'un tel héritage, c'est aussi plus de 30 ans d'améliorations et de perfectionnements. Et c'est aussi oublier que VIM est un projet actif même s'il ne suit pas le modèle de rythme effréné adopté par la fondation Mozilla, ce que nous serons je pense peu à lui reprocher...

Maintenant si l'on se base uniquement sur les fonctionnalités, VIM propose absolument tout ce que vous pouvez trouver ailleurs. Auto-complètement statique ou dynamique (en fonction du contexte), multi-documents, multi-fenêtrage, onglets, personnalisation extrême et langage de script, coloration syntaxique (avec thèmes dynamiques et plusieurs centaines de formats de fichiers reconnus !!), auto-indentation, reformatage, supports de plugins (en perl, en python, en ruby, en Tcl, etc.), prise en charge des écritures de gauche à droite, replis (possibilité de plier automatiquement ou manuellement des portions de texte), gestion native de diff, etc, etc. Et tout ceci en restant léger en mémoire et très très rapide.

Côté parfums, VIM en deux déclinaisons : mode texte dans un terminal, mode graphique avec l'application gVim qui fonctionne sous Gtk2, mais aussi nativement sous MacOS, Windows, etc. Avouons qu'en virant la carrosserie de pas mal d'éditeurs "hype", il ne leur reste pas toujours de quoi faire rougir VIM...

Notez au passage que la version graphique de VIM exploite un cœur commun avec la version texte qu'elle habille plus qu'autre chose de menus déroulants, assesseurs, menus contextuels et autres barres d'outils. Cela signifie que même si vous utilisez la version graphique, en faisant gaffe à deux trois trucs, toute votre configuration et vos plugins fonctionneront sur la version console et vice-versa. Et c'est un plus non négligeable je vous l'assure, que de pouvoir intervenir à distance via SSH sur la machine d'un client avec SON PROPRE environnement configuré aux petits oignons... Car petit détail qui compte, plus que rares sont les GNU/Linux qui n'ont pas VIM installé en standard.

Comme vous le voyez à travers cette liste à la Prévert, VIM est loin d'être l'éditeur ringard décrit par certains. Et son héritage avec VI est à prendre plus au sens philosophique qu'au sens littéral.

Moi je veux bien mais quant j'y tape un truc, y'a rien qu'imprime !!

Ah vi, la philosophie de vi :-) Comme c'est déroutant la première fois.. Papi se souvient la larme à l'œil le nombre de fois où il a manqué d'envoyer contre un mur le clavier de son terminal.. Un machin en texte connecté à un, déjà à l'époque, antique IBM 6150... Non sérieusement, je ne blâmerais pas celui qui me dira que vi n'est pas simple d'accès, car c'est un fait, vi est à l'opposé de tout ce que vous avez jamais utilisé pour éditer un texte jusqu'à aujourd'hui.

Le point clef à comprendre est que vi est modale alors que tous les autres éditeurs sont visuels. Certains dirons, et je ne trouve pas cela si idiot que cela, que vi est l'éditeur du cerveau gauche et que les autres sont calés sur le cerveau droit.

En effet, vi décompose l'action d'éditer un texte principalement (mais il y en a bien d'autres) en deux modes :

  • Le mode normal qui permet de naviguer et d'effectuer des opérations d'altération.
  • Le mode insertion qui permet de taper du texte au kilomètre.

Et comme VI démarre en mode normal, pour taper son premier texte, il faut commencer par presser i de sorte à passer en mode insertion (Esc permettra de revenir au mode normal). Sans cela, c'est la cata car tout ce qui est tapé sera interprété comme des commandes à appliquer sur le texte. Voilà l'origine de ce qui énerve un néophyte arrivant la bouche en cœur sous VI pour modifier une pauvre config et qui n'arrive qu'à la pourrir un peu plus...

Pour comprendre l'origine de cet étrange découpage, il faut encore remonter dans le temps. Je vous parlais plus haut de mon IBM 6150 que l'on appelait à l'époque un MainFrame, un "gros" serveur auquel était relié par des liaisons série des terminaux, sortes de minitels évolués. Tout ce que l'on tapait était transmis au serveur, qui l'interprétait et renvoyait au terminal ce qu'il fallait afficher sur l'écran (ça ne vous rappelle pas le web ;-) Comme vous pouvez l'imaginer les transmissions étaient lentes, d'autant plus lentes que l'on était plusieurs à bosser sur le pauvre CPU à 5.9Mhz et ses colossales 1Mb de mémoire. Le choix de l'approche modale était donc avant tout une question d'économie des touches tapées pour effectuer le maximum d'opérations en un minimum d'octets.

À cette contrainte se rajoutait, dans une moindre mesure, des claviers souvent réduits au minimum, sans flèches ni pavé numérique. Le principe de la modalité était donc d'utiliser l'ensemble des touches alphanumérique pour les opérations courantes. Ainsi pour détruire un bloc de 10 lignes, ce qui correspondait avec un éditeur type wordstar à Ctrl-K-B, 10xflèche Bas, Ctrl-K K, Ctrl-K Y s'écrivait en VI : 10D. Je vous laisse calculer l'économie... Le modalité permet donc de "multiplexer" les touches en leur donnant une signification différente selon les contextes.

Alors de nos jours, est-ce que cette économie a encore un sens ? Je pense que oui, et ce pour plusieurs raisons :

  • Ce qui allait vite hier va tout aussi vite aujourd'hui. Une fois que vous commencez à maîtriser les commandes, VIM devient absolument ahurissant de rapidité. Et comme il a été pensé depuis des dizaines d'années dans ce sens, vous passez votre vie à découvrir des perles vous faisant gagner encore du temps. Par exemple, j'ai découvert ce matin qu'en mode normal, si je suis entre deux guillemets et que je veux remplacer tout ce qui se trouve entre ces guillemets par un autre texte, il me suffit de taper ci". Cela supprime tout ce qui se trouve entre les guillemets et passe tout seul en mode insertion, me permettant de saisir le texte en remplacement. Cela fonctionne sur tout caractère de type ouvrant/fermant, y compris les parenthèses... Pratique non ?
  • Pour qui tape beaucoup de texte (développeur, rédaction d'articles, etc), toute économie de pression sur le clavier se ressent directement sur des doigts et les poignets moins douloureux en fin de journée. A l'heure où l'on parle de plus en plus des troubles musculo-squelettiques liées à l'usage de l'informatique, VI se trouve ici un nouveau statut d'éditeur zen pour les articulations.
  • VIM se contrôle entièrement au clavier. La souris y fonctionne parfaitement mais n'est en aucun cas nécessaire. Et là aussi c'est une cause de trouble musculo-squelettique en moins, et pas des moindres celle-là. Pour rire, tapez un texte ou du code avec votre éditeur habituel mais mettez la souris beaucoup plus loin que d'habitude. Vous prendre ainsi conscience du nombre de fois où votre bras doit 'décoller' du clavier pour aller chercher le mulot, puis revenir au clavier. Et tout cela juste pour une simple sélection de bloc de texte à copier que vous auriez fait avec VIM par un Esc 10Y (copie-moi les 10 lignes qui suivent sous le curseur).

Donc oui, une bonne partie de l'optimisation du contrôle de VIM vient d'un âge révolu, mais le système qui en est sorti est toujours d'actualité. Et c'est important à garder en tête pour tacler aussi les vimmers sado-maso. Ceux qui disent par exemple qu'un vrai vimmer, n'utilise pas les flèches et doit privilégier les touches h (gauche), l (droite), j (bas) et l (haut). Ne riez pas, j'en connais qui désactivent exprès les flèches pour se forcer à utiliser ces touches !! Car oui cela économise encore un peu de mouvements du poignet ce qui ne peut pas faire de mal, je ne le conteste pas. Mais 1/ ces touches de directions existent avant tout parce qu'à une lointaine époque il n'y avait simplement pas de flèches sur le clavier 2/ pour tous ceux qui bossent sur un portable, les touches de directions sont maintenant totalement intégrées au corps central, et c'est aussi le cas pour beaucoup de claviers semi-compacts 3/ Et pour les claviers 102 touches à l'ancienne, on ne va pas en faire des tartines juste pour un déplacement de 5 cm à tout casser, faut pas déconner non plus...

Bref, il faut savoir raison garder et chercher plutôt à capter la philosophie d'ensemble et dans tous les cas, il faut que cela reste ludique ! Promis, vos dents ne vont pas tomber si vous faites des entorses à l'Esprit VI. Moi-même je le confesse mon père, j'ai péché. J'ai créé prés de 50 lignes de redéfinition de touches juste pour sélectionner visuellement une zone par Shift-flèches haut/bas/gauche/droit. J'ai même fauté avec la combinaison Control-Shift-flèches... Ben entre nous, au delà de mes dents qui sont toujours là, c'est tout de même bien pratique lorsqu'on veut sélectionner un bloc sans avoir à compter les lignes...

VIm est un outil qui fait plaisir, essayez de comprendre comment il fonctionne mais ne vous martyrisez pas non plus. Et rapidement, si vous gardez l'esprit jouer, tout cela deviendra tellement naturel que vous pousserez de vilains jurons en utilisant OpenOffice parce que vous aurez salopé votre texte en y tapant ggVG> (oui, ça veut dire quelque chose en VIM;-).

VIM ou gVIM, le choix des armes

Là, pas de grands discours à faire c'est une question de goûts. Les deux moutures sont aussi performantes l'une que l'autre. La gestion de la souris en mode console est proprement excellente (vous pouvez redimensionner les fenêtres, sélectionner des blocs, etc) ce qui diminue encore l'espace entre les deux.

Pour l'heure j'utilise la version console (cf copie d'écran) avant tout parce que j'apprécie de pouvoir lancer mon environnement de développement sur des machines distantes ne disposant pas de couche graphique. N'utilisant pas les menus déroulants et les barres d'outils, la version graphique m'apporte peu mais là encore c'est une question personnelle qui n'a au fond que peu d'incidence.

Encore du blabla ou on pratique un peu ?

Moi qui comptait faire court, c'est vaguement loupé. Ceci dit ici ce n'est pas vraiment le site de la "barrière des 1000 mots" ;-) Ceci dit je vais essayer de me rattraper par ce chapitre de mise en selle.

Comment j'écris un truc ?

Lorsque vous lancez VIM pour la première fois, vous arrivez sur une page remplie de ~ (qui signifie "ligne vide"), un message de bienvenue vous invitant à faire une donation à l'association humanitaire de l'auteur originel de VIM, un peu d'aide et 2 lignes vides en bas de l'écran. Les ~ représentent la fenêtre principale d'édition, la première ligne vide la barre de statut et la seconde la barre de commandes.

Comme nous l'avons vu plus haut, VIM à son démarrage est en mode normal. Pour commencer une saisie, nous devons basculer en mode Insertion. Pour cela pressez la touche i (ou Insert, ça marche aussi). A la première lettre que vous allez saisir le message d'accueil va disparaitre. Tapez ainsi plusieurs lignes, puis pressez Esc pour revenir au mode normal.

Et si je veux le modifier ?

S'il s'agit de petites tâches comme ajouter/supprimer des caractères par-ci par-là, vous pouvez rester ou revenir au mode insertion. Sinon en restant en mode normal il est possible de faire des choses plus intéressantes. Vous pouvez par exemple détruire la ligne sous le curseur (dd). En réalité elle n'est pas détruite mais déplacée dans un registre (une sorte de presse-papier). Ainsi si vous tapez p (sorte de "coller") elle vous sera restituée. Souvent les commandes du mode normal peuvent être précédée d'un chiffre. Ainsi si vous tapez 2dd, vous transférez dans le registre non pas une mais deux lignes. Si vous voulez copier et non supprimer, remplacez d par y (yank). Ainsi pour copier deux lignes, ce sera 2yy ou 2Y pour sa version encore plus courte.

Moi j'aime pas compter...

Si vous avez la flemme de compter les lignes, vous pouvez passer en mode Visuel en pressant (en mode normal) la touche V (notez la majuscule). Là vous pouvez bouger le curseur et étendre la sélection. Pour copier/supprimer, ce sera les mêmes lettres que le mode normal mais une seule fois (d pour déplacer dans le registre, y pour copier dans le registre). Bien évidement il y a plein d'autre commandes comme par exemple > ou < pour indenter/désindenter le bloc en cours. Cela fonctionne aussi en mode normal en doublant. Par exemple 10>> en mode normal va indenter les 10 lignes sous le curseur, curseur compris.

En réalité il y a trois modes visuels. Le mode V est le mode visuel "par ligne". On peut lui préférer le mode visuel "par caractères" en tapant (en mode normal) la lettre v (en minuscule). Vous pouvez maintenant vous déplacer à gauche et à droite, en haut et en vas pour surligner une zone exactement comme vous l'auriez faut avec une souris. Comme pour V vous pouvez appliquer des commande de copie, etc.

Pour le plaisir, le troisième mode visuel est le mode "bloc" accessible par Control-v. Très pratique pour supprimer des colonnes de texte mais pas seulement. Pour le fun, passez en mode insertion et saisissez trois mots, un par ligne. Revenez en mode normal par Esc, allez sur le premier caractère du premier mot puis pressez Control-v. Sélectionnez ainsi les 3 premiers caractère de vos trois mots et pressez I (majuscule) puis Mot:, puis enfin Esc. Magie, vos trois mots sont maintenant précédés par ce que vous venez de taper.

Des "astuces" comme cela, sans rigoler, il y en a des milliers... Une petite pour la route ? Comment exécuter une commande du mode normal sans pour autant sortir du mode insertion. Un usage type est de vouloir détruire la fin de la ligne où se trouve le curseur alors que je suis en mode insertion. Normalement il aurait fallut que je tape Esc (pour repasser en normal), puis d$ qui permet de détruire tout jusqu'à la fin de la ligne ($ signifie jusqu'à la fin. Si à l'inverse vous désirez détruire du début jusqu'au curseur utilisez ^). Ensuite je dois re-presser i pour revenir en insertion, un peu longuet... Et si c'est long c'est qu'il y a forcement un autre moyen. Ce moyen c'est Control-o. En mode insertion si vous pressez Control-o cela vous bascule en mode normal juste pour une commande et vous replace en insertion juste après. Notre destruction se simplifie donc par un Control-od$, beaucoup mieux :-)

Et si ce n'est pas encore assez rapide pour vous, comme soufflé en commentaire, vous pouvez utilisez le raccourcis sur d$, D (majuscule). Ce qui nous donne Control-oD.

Ok, mais comment je sauve ?

La sauvegarde du texte comme beaucoup d'opération générales passe par la saisie d'une commande en mode... commande. Ce mode est accessible à partir de tous les modes sauf insertion par la touche :. Lorsque vous la pressez, le curseur se déplace sur la dernière ligne de l'écran, la barre de commande. Vous pouvez alors saisir votre commande puis l'exécuter en pressant entrée.

Pour sauvegarder notre texte, nous allons utiliser la commande :write mon_fichier.txt (lorsque je commence par un : cela veut dire une commande en mode commande et je sous entends qu'il faut presser entrée pour l'exécuter). Sous VIM tout s'abrège pour aller plus vite et vous pouvez donc remplacer cela par :w mon_fichier.txt.

Bien évidement, une fois que vous avez sauver avec un nom, aucun besoin de répéter ce nom les fois suivantes. Faites un :w et cela suffira.

Dans la série des commandes utiles, :edit nouveau_fichier.txt (qui s'abrège en :e nouveau_fichier.txt) permet d'ouvrir un fichier. Si ce fichier existe, vous pouvez utiliser les tabulation en mode commande pour chercher son chemin comme sous Bash. Si ce fichier n'existe pas, il sera créé lorsque vous le sauvegardez (et pas avant).

Et comment je ME sauve ?

On me le souffle en commentaire, j'en oublie un morceau pour le moins important. Pour quitter, c'est la commande :quit (ou :q). Si vous n'avez pas sauvé vos fichier VIM va couiner. Pour éviter cela (et si vous souhaiter perdre vos modifications !!!) utilisez le bang ! qui veut très souvent dire "fait pas ch--r" dans le monde VIM. Ainsi q! quittera sans poser de question.

Mais souvent on veut sauver et quitter, ce qui s'écrit :wq (oui, on peut combiner les commandes d'une seule lettre). Mais comme c'est un truc que l'on fait souvent, il y a bien évidement un version en une seule lettre :x.

Conclusion

Voilà qui devrait je pense suffire pour commencer à utiliser VIM en mode "même pas peur". Après le net est littéralement gavé de sites, tutoriaux et vidéos, expliquant tel ou tel aspect de ce fantastique éditeur. Il n'y a qu'à chercher vous trouverez votre bonheur à commencer par ces très bonnes planches visuelles pour se repérer dans les différents modes.

Maintenant à défaut de vous avoir expliquer toutes les arcanes de VIM, j'espère au moins vous avoir donné envie de l'essayer. Et croyez moi, je n'ai qu'à peine effleuré 1 petit pourcent du sujet. La customisation du VIM par exemple est un monde à part entière et chaque vimmer fini à terme par disposer d'un éditeur totalement personnalisé. Mais cela, nous le verrons une prochaine fois.