Press "Enter" to skip to content

Vim une introduction francophone en douceur

Si vous êtes ici, vous savez sans doute en quoi consiste Vim. Il s’agit d’un éditeur de texte minimaliste mais très pratique bien qu’ayant la réputation d’être difficile à prendre en main (un truc de vieux con en gros). Pour vous donner une idée Vim c’est… ça:

Mon bureau avec une fenêtre Vim ouverte. C’est pas mal hein? C’est français.

Et aujourd’hui j’ai envie de parler de Vim…
Autant commencer en mettant les choses à plat. J’ai commencé à coder avec gedit (oh le grand débutant) avec lequel j’ai fait la moitié de ma thèse environ avant de découvrir Vim, puis Emacs… Puis de revenir à Vim sans regrets. Et j’ai même fini par plus ou moins tomber raide dingue du logiciel. J’ai souvent entendu que la courbe d’apprentissage de Vim est longue mais j’ai eu l’occasion de tester des IDE entre temps et je crois que je mets plus de temps à jouer au chat et à la souris avec les onglets (chat, souris, cliquer, blague, humour) pour trouver le raccourci ou la fonction que je cherche que de pondre une regex dans Vim ou l’écrire moi même dans un coin et assigner le raccourci que JE veux. Je ne dis pas que c’est le cas de tous le monde, je ne suis même pas informaticien professionnel, mais étant donné que beaucoup de développeurs apprennent sur des IDE, je pense qu’ils ne voient pas l’intérêt de repasser du temps à apprendre des choses pour lesquelles ils ont déjà mémorisé des habitudes de travail. Et je les comprends, même si les nouvelles habitudes seraient à terme plus rapide (enfin je crois). Cependant, Vim et moi c’est une sorte d’histoire d’amour et je vois trop le logiciel moqué pour ne pas apporter ma contribution à sa défense. La voici donc, une série d’articles en français sur mes propres astuces et mon parcours dans Vim1On va pas se mentir, je les fais autant pour vous que pour moi. Il faut bien que je m’entraîne à écrire. Taïhaut.

Niveau 0: quitter vim – les commandes fondamentales

J’évacue la blague directement. Ctrl+z ou :q!. ZZ ou :wq! pour sauvegarder. Ça me permet tout de même d’introduire : qui permet d’entrer des commandes avancées dans Vim. Et en parlant de commandes il y a suffisamment de listes mémo des commandes usuelles pour que je me permette de ne pas les rappeler ici. D’une part mon but est de partager mes conseils pour prendre vim en main plus rapidement, d’autre part, comme je le répéterai, Vim s’apprend par la pratique. Certains conseils, d’ailleurs, sont très communs. Je les ai entendus ailleurs, j’ai vérifié leur efficacité et je ne fais que témoigner de cette dernière. Le découpage en niveau est d’ailleurs inspiré de ce genre de lectures.

Niveau 1: vimtutor – move around

C’est quand même un comble de voir un logiciel autant décrié parce que ses commandes sont obscures alors qu’il est livré avec tout un entraînement par la pratique non? vimtutor est un fichier texte d’apprentissage de Vim. En 7 leçons relativement courtes, les commandes de Vim sont résumées avec des exemples pratiques. Il s’agit simplement d’un fichier texte donc modifiable en direct dans Vim et c’est très important car un des concepts clefs de Vim est la mémoire musculaire. En réalité la mémoire musculaire est la clef pour optimiser sa frappe au clavier. Comme Vim (et Vi avant lui) a pour objectif de modifier un maximum de texte avec un minimum de frappes au clavier, il tombe sous le sens que Vim soit pensé de manière à se servir de cette mémoire musculaire 2 une note de vimtutor met l’emphase sur la pratique plus que la mémorisation pour cette raison! . Mais j’y reviendrai. Je voudrais juste commenter quelque points importants sur lesquels vimtutor se contente de rapides notes:

Utiliser hjkl

Un commentaire récurrent de la part des nouveaux venus sur Vim porte sur l’utilisation des touches h (gauche), j (bas), k (haut) et l (droite) pour les déplacements du curseurs. L’habitude est plus portée sur les flèches et utiliser cette série de lettre semble contre intuitif. Cependant encore une fois, l’objectif est l’efficacité et une bonne partie du temps perdu l’est sur les déplacements des mains3Et sans déconner c’est au moins équivalent à l’utilisation d’une souris…. Sur la plupart des claviers, les flèches sont loin des lettres. Le doigt le plus proche est l’auriculaire et personne ne se sert de son petit doigt pour naviguer (sauf si on parle de déterminer le sens du vent, peut être). Dans le même ordre d’idée certaines touches proches des touches utiles sont inutilisées (Verr,Maj par exemple) quand d’autres très utiles sont éloignées (Échap). Utiliser h, j, k et l peut sembler embêtant mais après un peu d’entraînement (comptez une heure) devient parfaitement naturel et un gain de temps énorme. Une excellente méthode pour apprendre Vim consiste à sortir de sa zone de confort et à se pousser à utiliser ces touches en recentrant les touches utiles éloignées sur le clavier. Nous y reviendrons. Il faut simplement retenir qu’effectivement, la configuration initiale de vim n’est pas vraiment optimale, mais que ce n’est pas grave.

Ne pas utiliser que hjkl

Et vous allez me dire « Mais tu viens de nous dire d’utiliser hjkl! ». Je sais bien mais hjkl servent pour les déplacements locaux. Le traitement de texte, et notamment, de code, demande en général de voler dans un fichier (et parfois même plusieurs fichiers) entre des points éloignés de manière rapide. On va pas aller très loin en utilisant simplement les 4 touches de déplacement de base. Pour faire de plus grand déplacement il est intéressant d’ajouter quelque techniques à notre bagage. D’une part les quantificateurs, qui permettent de multiplier le nombre d’appel d’une commande, par exemple 4j permet de descendre de 4 lignes. D’autre part les opérateurs de déplacement, dont deux des plus utiles sont gg et G qui amènent directement à la première et à la dernière ligne du fichier, ainsi que xgg/xG/:x qui amènent tous à la ligne x. D’autres très utiles selon moi sont $ et 0 (le chiffre 0) qui amènent en fin et début de ligne, ou ^ qui amène au premier caractère non espace (tabulation etc…) de la ligne. D’autres comme b et e (begin et end) emmènent au début et à la fin de chaque mot, [[ et ]] désignent les paragraphes etc. Pourquoi est-ce qu’il est important d’apprendre à se déplacer ainsi? Et bien parce que déplacer le curseur efficacement permet de rentrer des commandes efficacement.

Apprivoiser le mode normal

Une des particularités de Vim est justement d’attribuer des commandes spécifiques aux lettres et de ne permettre l’édition que dans un mode précis (insertion). On aurait tendance à vouloir rester dans le mode insertion pour contrôler le flot de lettres mais on se rendra vite compte que le déplacement dans le fichier en devient vite limité. C’est justement parce que le mode insertion sert uniquement à l’insertion tandis que le mode normal est celui… bah dans lequel il faut rester en temps normal. Le langage du mode normal permet de décrire le contenu du fichier sur lequel on veut appliquer une commande et le passage du mode normal au mode insertion doit se faire de manière à limiter les commandes à rentrer en insertion. Exemple: je veux éditer la moitié d’une ligne. Je peux soit me mettre au bout de la ligne ($), passer en mode insertion (i), effacer la moitié de la ligne (x fois Retour arrière) et taper mon texte, ou bien me mettre au milieu de la ligne et utiliser l’opérateur de changement (c) jusqu’au bout de la ligne ($) et taper mon texte. De la même manière il sera plus rapide de changer deux mots en les effaçant depuis le mode normal en passant vers le mode insertion (c2w) que de les effacer dans le mode insertion. Le vrai secret du Vim Wizard vient de cette capacité à exprimer les portions de texte dans le langage de Vim et de les passer en argument de commandes et ce sans même rentrer dans la création de commandes avancées.

Édition de plusieurs fichiers

Ce point n’est pas du tout abordé dans le vimtutor et c’est bien dommage. L’édition de plusieurs fichiers est pourtant quelque chose d’essentiel pour un éditeur de texte et la question de comment qu’on fait vient assez vite avec Vim. Et évidemment qu’on peut et qu’on peut même faire de plusieurs manières. Deux commandes très utiles sont celles qui permettent de découper la fenêtre split fu et vsplit bar qui partagent la fenêtre horizontalement pour ouvrir le fichier fu ou verticalement pour ouvrir le fichier bar. Le fichier en question peut même être le fichier déjà ouvert pour comparer rapidement deux endroits par exemple. On passe d’une fenêtre à l’autre à l’aide de Ctrl+w+x où x est une des 4 touches hjkl pour aller dans la fenêtre dans la direction indiquée, ou bien w/W pour aller à la fenêtre suivante/ précédente. L’autre méthode que j’apprécie est l’utilisation d’onglet dans vim avec la commande tabedit. On peut alors circuler entre les onglets à l’aide des commandes gt et gT pour aller dans un sens ou l’autre. Et chaque onglet peut être découpé avec split. C’est pas génial ça?4Pour ajouter un niveau de masturbation cérébrale on peut ouvrir un terminal dans une fenêtre Vim depuis la version 8 avec la commande :term. C’est dire à quel point ça devient n’importe quoi puisque Vim peut du coup se substituer à tmux. Mais je déconseille ce genre de montage foireux. x)

Niveau 2: Faire son vimrc

Je pense qu’une fois à l’aise avec les déplacement et les commandes de base, un bon moyen de comprendre Vim est de changer ce qui nous y déplaît. Et quoi de mieux pour ça que d’éditer son fichier de configuration .vimrc (celui que Vim lit à chaque démarrage)? Ce dernier est composé de commandes que l’on pourrait rentrer à la main une fois Vim ouvert et donc un bon moyen de se rappeler qu’est-ce qui y fait quoi. Je pense commenter ici quelque commandes de mon .vimrc. Quelque conseils cependant, 1) ne mettez jamais de commande que vous ne comprenez pas dans votre vimrc, 2) n’employez jamais les abréviations des commandes, c’est le meilleur moyen d’oublier ce qu’elles font, 3) n’hésitez pas à commenter ce qui est compliqué ou dont vous n’êtes pas sûrs.

Premièrement les commandes
nnoremap <up> <nop>
[...]
vnoremap <left> <nop>

Supprime les déplacements avec les flèches. Comme je l’ai dit plus haut, supprimer l’action de ces touches a pour but de forcer à utiliser hjkl. Désactiver les touches force effectivement à changer ses habitudes et est le meilleur moyen d’apprendre une nouvelle manière de faire (généralement plus rapide) dans Vim. On perd un peu de temps au début mais on se force à les intégrer dans sa mémoire musculaire et les déplacements se font très vite naturellement. C’est le cas avec toutes les commandes de Vim.

Les quatres commandes à partir de la ligne 100 (pourquoi commencer par le début quand on peut être chiant?)
nnoremap <esc> <nop>
vnoremap <esc> <nop>
nnoremap jk <esc>
vnoremap jk <esc>

vont ensemble et sont assez explicites. Elles suppriment l’action de la touche <esc> (retourner au mode normal) pour l’affecter à l’enchaînement jk. C’est une combinaison assez rarement tapée en français et en anglais donc elle peut servir à sortir du mode normal. Petit bémol, en pratique on peut se faire avoir dans le mode visuel lorsqu’on descend trop bas lors d’une sélection et qu’on veut remonter trop vite, on quitte le mode et la sélection est perdue. Avec un peu de pratique (et à terme, l’arrêt de l’utilisation du mode visuel, ce n’est plus un problème mais au début c’est un peu embêtant.

Ensuite la commande let mapleader = "\Space" permet d’attribuer à la barre d’espace la fonction de leader. Elle remplace la touche <leader> dans toutes les définitions de commandes qui suivent et ceci permet de donner de nouvelles fonctions aux touches sans effacer les anciennes. Par exemple, la commande nnoremap <leader>/ :nohlsearch<cr> me permet d’effacer la mise en avant des recherches en appuyant sur espace puis / qui sert à faire des recherches. Par défaut les recherches restent en mises en couleur et il faut explicitement taper :nohlsearch pour l’enlever. Moi ça m’énerve, j’ai fait une fonction pour le faire en deux touches. C’est plus élégant que de chercher eroapiudajj.

La première série de commande (en haut du fichier, j’y reviens pour être encore plus chiant) est une série de commande cosmétiques qui changent l’apparence de Vim. Je ne commente pas chacune de ces commandes mais je les mentionne pour dire qu’elles sont toutes intéressantes à connaître et toutes documentées. Comme pour beaucoup de commandes, on peut avoir une descriptions complète de chacune en tapant :help fu pour la commande fu. Je tiens à noter que j’ai fait mon propre colorscheme, turlututu, en modifiant (légèrement) le colorscheme peachpuff et que c’est celui-ci qui est chargé. Il est à installer si vous tenez à utiliser ma config. Mais je vous conseille plutôt de commencer avec les colorschemes déjà proposés par Vim et de les parcourir pour trouver votre préféré.

Le dernier point que je veux mettre en avant est l’ensemble des groupes définis entre les commande augroup xxx et augroup END. Ces groupes me servent à définir des commandes spécifiques à chaque type de fichier (par exemple pour commenter à l’aide d’un certain symbole selon le langage du fichier) à l’aide des autocmd. Cette commande permet à Vim de savoir quels combinaisons de touches sont associées à des commandes plus complexes et dans quels contexte les utiliser. Commencer les groupes par autocmd! permet de nettoyer la mémoire des commandes déjà chargées et de ne charger que les commandes voulues une seule fois pour chaque tampon. Mais c’est technique et j’y reviendrai un jour.

Niveau 3: Apprendre le zen du Vimscript

Le dernier secret du Vim wizard est d’apprendre le langage de Vim. « Oh non, encore un langage à apprendre? Mais ça va pas? » Attention, je ne dis pas qu’il faut réécrire Vim, mais simplement apprendre à lui parler. Vim dispose en effet d’un véritable langage de programmation interne assez puissant permettant la rédaction de commandes mais aussi de plugins tout entier pouvant complètement remplacer les fonctions d’IDE très poussés. J’utilise par exemple ALE qui est un permet d’exécuter divers programmes de linting et de vérification de codes de manière asynchrone à divers moments (sauvegarde, sortie du mode insert etc…) pour tout un paquet de langages (ce plugin est beaucoup trop bien). Cependant je déconseille l’installation de trop de plugins avant d’apprendre au moins les bases du vimscript et ceci parce que beaucoup de plugin ne font que des choses que Vim peut faire nativement simplement. Le meilleur cours de Vimscript que j’ai trouvé porte le nom engageant de Learn Vimscript the Hard Way et je ne peux que recommander son parcours. Rien que la moitié du cours (parties 1 et 2) devraient vous en apprendre beaucoup sur Vim. D’ailleurs j’ai réorganisé beaucoup de mon vimrc à partir des conseils de Losh, et ça se voit (jk, les marqueurs etc…). J’ai beaucoup gagné en vitesse et je suis beaucoup plus à l’aise pour taper avec Vim. Le dernier conseil que je peux donner à ceux qui liraient ces lignes serait de passer leur clavier en qwerty international. Vim a été pensé avec le qwerty en tête et la vitesse de frappe ainsi que le confort s’en ressentent grandement une fois le coup de main pris.

Je pense revenir à Vim un de ces jours plus en détail dans un autre article et éditer celui-ci au fil du temps pour l’équilibrer entre ses parties. J’espère que ces quelque notes serviront à ceux qui pourront passer ici. N’hésitez pas à laisser vos remarques et commentaires, ils sont les bienvenus. Sur ce à bientôt. Vim is love, Vim is life.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.