LCC 231 - Interview sur Vim avec Romain Lafourcade

Published: May 4, 2020, 7:43 p.m.

Romain Lafourcade \xe9change avec Guillaume et Emmanuel sur Vim: comment il y est venu, ce qu\u2019il a d\u2019unique, comment l\u2019appr\xe9hender, et bien d\u2019autres choses encore.

Enregistr\xe9 le 16 avril 2020

T\xe9l\xe9chargement de l\u2019\xe9pisode LesCastCodeurs-Episode\u2013231.mp3

Interview Ta vie, ton \u0153uvre

GitHub de Romain
Je m\u2019appelle Romain Lafourcade. Je suis Graphiste de formation et j\u2019ai chop\xe9 le virus du d\xe9veloppement en montant mon premier site en 1999. Je suis D\xe9veloppeur pour de vrai depuis 2007. J\u2019ai beaucoup fait de JS, bien s\xfbr, ainsi que du Flash et du Silverlight. \xc7a fait quelques ann\xe9es que je me concentre sur React et Vue.js.

Aujourd\u2019hui je suis chez Publicis Sapient France, une \u201cagence digitale\u201d de premier plan o\xf9 je m\u2019amusais d\xe9j\xe0 tr\xe8s bien jusqu\u2019\xe0 l\u2019arriv\xe9e des ex-Xebians. Et maintenant c\u2019est encore mieux. Je participe actuellement \xe0 la pr\xe9paration d\u2019une conf\xe9rence \u201cfront\u201d pointue pour la fin de l\u2019ann\xe9e : FrontSide.

Mes int\xe9r\xeats personnels gravitent autour de la programmation fonctionnelle : Haskell, Elixir.

Et Vim, bien s\xfbr.

Vim intro

Page wikipedia de Vim

Qu\u2019est-ce que Vim en 2 phrases ?

Vim est un \xe9diteur de texte orient\xe9 programmation, puissant et non-conformiste.

Que peut on dire de la diff\xe9rence entre un IDE et un \xe9diteur ?

Dans son expression la plus simple, un \xe9diteur de texte est un outil permettant l\u2019\xe9dition de fichiers de texte brut. Certains sont \u201cstandalone\u201d, comme Vim, Nano ou Gedit, se concentrant pour la majeure partie sur des questions li\xe9es \xe0 l\u2019\xe9dition de texte et d\xe9l\xe9guant les autres t\xe2ches li\xe9e au d\xe9veloppement logiciel \xe0 d\u2019autres outils \u201cstandalone\u201d. C\u2019est la vision UNIX traditionnelle :

\u201c\xc9crivez des programmes qui effectuent une seule chose et qui le font bien.\u201d

D\u2019autres sont \u201cint\xe9gr\xe9s\u201d avec d\u2019autres outils pour offrir une exp\xe9rience plus \u201ccl\xe9 en main\u201d, les IDEs.

L\u2019histoire de Vim

Vim est n\xe9 au d\xe9but des ann\xe9es 90 sur Amiga, pour la m\xeame raison que tous les autres clones de vi : l\u2019impossibilit\xe9 l\xe9gale d\u2019utiliser vi sur tel ou tel syst\xe8me. De tous les clones, c\u2019est celui qui s\u2019est le plus d\xe9marqu\xe9 de l\u2019original et c\u2019est le seul qui est encore d\xe9velopp\xe9 activement en 2020.

Les arch\xe9ologues en herbe trouveront quelques liens sur le sujet en bas de page.

Disponibilit\xe9 de Vim sur les distros de base

Un des arguments les plus souvent mis en avant pour convaincre les m\xe9cr\xe9ants de l\u2019utilit\xe9 d\u2019apprendre Vim est \u201cVim est partout\u201d.

Mais l\u2019ubiquit\xe9 l\xe9gendaire de Vim est un mythe. Ce qui est disponible dans tous les d\xe9riv\xe9s d\u2019UNIX, c\u2019est la commande vi. Le programme qui assure le boulot peut \xeatre Vim comme il peut \xeatre Elvis, Nvi, Busybox vi ou m\xeame le vi original. Et m\xeame quand c\u2019est Vim, c\u2019est souvent un build limit\xe9. Du coup, conna\xeetre Vim n\u2019est peut-\xeatre pas aussi utile que conna\xeetre vi.

Et c\u2019est sans compter sur le fait que le syst\xe8me d\u2019exploitation le plus largement utilis\xe9, n\u2019a pas de commande vi ou vim du tout.

Vim vs emacs: la guerre ancestrale

et aussi d\xe9bile que toutes les guerres ancestrales.

Les variantes de Vim

Neovim est un fork r\xe9cent promettant une modernisation des processus de d\xe9veloppement et du code.

Vim au quotidien Pas de curseur?????

On a bien un curseur, mais les dispositifs de pointage sont rarement activ\xe9s par d\xe9faut. M\xeame si c\u2019est tout \xe0 fait possible d\u2019utiliser la souris ou le trackpad (:help 'mouse'), on est clairement dans un monde centr\xe9 autour du clavier.

Les modes (normal, insert, visual, etc.)

L\u2019\xe9dition modale, un concept initi\xe9 par vi, ne fait pas l\u2019unanimit\xe9. L\u2019id\xe9e, c\u2019est qu\u2019on est toujours dans un mode r\xe9serv\xe9 \xe0 une certaine cat\xe9gorie d\u2019activit\xe9s. Un des effets positifs, et aussi un des repoussoirs de ce m\xe9canisme est que \xe7a permet d\u2019avoir un vocabulaire plus vari\xe9 et expressif que dans un \xe9diteur classique. Le d\xe9placement du curseur, par exemple, se fait traditionnellement avec une combinaison de 4 touches de directions et 1 modificateurs, donc 8 d\xe9placements possibles : 1 caract\xe8re vers la droite ou la gauche, 1 mot vers la droite ou la gauche, 1 ligne vers le haut ou le bas, 1 paragraphe vers le haut ou le bas. C\u2019est tr\xe8s pauvre, m\xeame en ajoutant Home, End, Page Up et Page Down. Dans vim, on a tout \xe7a, bien s\xfbr, plus \u201cd\xe9but du mot\u201d, \u201cfin du mot\u201d, \u201cprochaine/pr\xe9c\xe9dente occurrence de \u201d, \u201cprochaine/pr\xe9c\xe9dente occurrence de \u201d, \u201cligne num\xe9ro X\u201d, \u201cn lignes vers le haut ou le bas\u201d, \u201chaut/bas/milieu de la fen\xeatre\u201d, \u201cmarqueur X\u201d, etc. Rien jjque \xe7a c\u2019est dingue. Et comme on est dans un \xe9diteur modal, tous ces mouvement peuvent \xeatre utilis\xe9s avec des op\xe9rateurs et l\xe0 c\u2019est la folie.

Les modes les plus couramment utilis\xe9s sont :

  • le mode normal, le mode par d\xe9faut quand on fait $ vim foo.txt, qui est utilis\xe9 pour naviguer, chercher, copier, coller, etc.
  • le mode d\u2019insertion, qui permet\u2026 d\u2019ins\xe9rer du texte dans le document,
  • les modes visuels, qui permettent de s\xe9lectionner une portion de texte,
  • le mode ligne de commande, qui permet d\u2019utiliser les commandes h\xe9rit\xe9es d\u2019Ex : :write, :s, :g, etc.
Le concept de verbe / op\xe9rateur + movement + destination

C\u2019est pour moi LA killer feature de Vim, surtout visible dans les modes normal et visuels. En gros, le mod\xe8le d\u2019interaction est bas\xe9 sur la notion de langage. Il y a :

  • des \u201cop\xe9rateurs\u201d, des verbes conjugu\xe9s \xe0 l\u2019imp\xe9ratif comme \u201cefface\u201d, \u201ccopie\u201d, \u201cremplace\u201d,
  • des compl\xe9ments d\u2019objet directs comme \u201cla ligne 78\u201d, \u201cce texte entre parenth\xe8ses\u201d, \u201cd\u2019ici \xe0 la fin du paragraphe\u201d,
  • des compl\xe9ments d\u2019objet indirects comme \u201cen dessous de la ligne 27\u201d ou \u201cau d\xe9but du buffer\u201d,
  • et des compl\xe9ments circonstanciels comme \u201c10 fois\u201d.

Avec tout \xe7a, on donne des commandes \xe0 la machine selon une syntaxe proche de celle d\u2019un langage parl\xe9 et elle ob\xe9it : \u201ccolle le texte contenu dans le presse papier 50 fois\u201d, \u201ccopie (d\u2019ici) jusqu\u2019\xe0 la prochaine parenth\xe8se ouvrante\u201d, etc. Dans un \xe9diteur de texte classique, la premi\xe8re se dit \u201cctrl+v ctrl+v \u2026 ctrl+v\u201d, ce qui n\u2019a presque rien \xe0 voir avec la t\xe2che telle qu\u2019imagin\xe9e : \u201ccolle truc 50 fois\u201d est devenu \u201ccolle colle \u2026 colle\u201d, ce qui est tr\xe8s peu expressif. Notre pens\xe9e abstraite de haut niveau doit \xeatre transform\xe9e en une s\xe9rie d\u2019action concr\xe8tes de bas niveau qui n\u2019ont que tr\xe8s peu de sens et souvent rien \xe0 voir avec la pens\xe9e haut niveau. Dans Vim, la premi\xe8re commande se dit \u201c50p\u201d, ce qui est tr\xe8s proche de la t\xe2che telle qu\u2019imagin\xe9e.

La syntaxe est peut-\xeatre un peu s\xe8che et les \xe9l\xe9ments sont peut-\xeatre ordonn\xe9s diff\xe9remment qu\u2019en fran\xe7ais, mais \xe7a reste tout \xe0 fait abordable et tr\xe8s proche de ce qu\u2019on a dans la t\xeate. L\u2019\xe9tape suivante est exactement la m\xeame que lorsqu\u2019on apprend une langue \xe9trang\xe8re : penser dans la langue.

Apprendre Vim, c\u2019est apprendre une grammaire simple et un vocabulaire expressif qui s\u2019enrichit au fur et \xe0 mesure o\xf9 on avance.

La notion de range

Vim h\xe9rite plein de trucs de vi, qui h\xe9rite lui-m\xeame plein de trucs de ex. Dans vim, toutes les commandes qui commencent par un \u201cdeux points\u201d sont des \u201ccommandes Ex\u201d, qui agissent sur des lignes car ex \xe9tait un \xe9diteur de ligne. Comme dans ex, ces commandes prennent des adresses (une seule ligne) et des ranges (de telle ligne \xe0 telle autre). Une ligne peut \xeatre indiqu\xe9e par son num\xe9ro, par un offset, par une recherche, par un marqueur, etc. C\u2019est un outil extr\xeamement puissant.

Par exemple, la commande suivante copie les lignes 10 \xe0 24 en fin de document :

 :10,24t$  

Celle-ci rassemble toutes les lignes contenant const dans la fonction courante vers le haut du corps de la fonction :

 :?func?,/^}/g/const/m?func?  

C\u2019est d\u2019une \xe9l\xe9gance insoutenable.

D\u2019autres concepts de base (window, tab, buffer, split, etc.)

On a toujours au moins un \u201cbuffer\u201d, une \u201cfen\xeatre\u201d et une \u201ctab page\u201d. Un buffer peut \xeatre affich\xe9 dans une ou plusieurs \u201cfen\xeatres\u201d, une \u201ctab page\u201d est un rassemblement de \u201cfen\xeatres\u201d. Contrairement \xe0 la plupart des \xe9diteurs de texte il ne peut pas y avoir de relation 1-\xe0\u20131 entre un buffer et une fen\xeatre ou entre un buffer et une tab page. C\u2019est un pi\xe8ge dans lequel tous les nouveaux tombent.

Tu l\u2019utilises pour quels genre d\u2019\xe9dition

J\u2019utilise Vim de deux fa\xe7ons diff\xe9rentes : de longues sessions de programmation et des \xe9ditions rapides (config, git commit, etc.), pratiquement tout le temps dans un terminal.

Les colorschemes

La derni\xe8re fois que j\u2019ai check\xe9 il y en avait litt\xe9ralement des milliers, du simple qui marche partout, utilis\xe9 par quelques barbus ronchons, \xe0 l\u2019usine \xe0 gaz bugg\xe9e \xe0 mort, utilis\xe9e par la derni\xe8re g\xe9n\xe9ration de boutonneux. J\u2019en ai r\xe9alis\xe9 quelques uns, m\xeame, comme Apprentice, ainsi qu\u2019un mod\xe8le simple \xe0 utiliser. Maintenant qu\u2019on peut utiliser toutes les valeurs hexad\xe9cimales, m\xeame dans le terminal, c\u2019est la f\xeate.

Pour trouver des colorschemes, je recommande VimColors.

Les binding Vim dans les IDEs

Peut-\xeatre utile pour accompagner l\u2019apprentissage de Vim mais pass\xe9 un certain niveau c\u2019est l\u2019uncanny valley. C\u2019est un des probl\xe8mes caus\xe9s par des ann\xe9es de Vim, d\u2019ailleurs : \xe7a rend exigeant.

Le terminal

Le nerf de la guerre d\u2019un Vim qui fonctionne tmux?

Vim \xe9cosyst\xe8me La gestion des plugins

Si on a beaucoup de plugins \xe7a peut devenir compliqu\xe9 sans plugin manager. Le plus populaire est vim-plug.

Les plugins les plus utilis\xe9s

  • fugitive, un client Git bien int\xe9gr\xe9 \xe0 Vim
  • surround, permet de jouer avec les paires de caract\xe8res : (), {}, etc. Souvent consid\xe9r\xe9 comme un indispensable.
  • ALE, beaucoup plus qu\u2019un linter,
  • YouCompleteMe, beaucoup plus que de l\u2019autocompletion.

Vim et les plugins VSCode (via LSP)

Les sp\xe9cifications de pas mal de fonctionnalit\xe9s de Visual Studio Code sont actuellement publi\xe9es, ce qui permet \xe0 d\u2019autres outils de d\xe9veloppement de b\xe9n\xe9ficier de l\u2019\xe9tendue de son ecosyst\xe8me. Il y a LSP, par exemple, qui permet d\u2019impl\xe9menter des serveurs pour n\u2019importe quel langage et des clients pour n\u2019importe quel \xe9diteur. Les clients \xe0 suivre pour Vim son lsc et CoC. Peut-\xeatre aurons-nous une int\xe9gration native un jour ? Il y a aussi DAP qui est utilis\xe9 par Vimspector pour fournir une interface de d\xe9bogage avanc\xe9e.

La navigation entre fichiers

Un faux probl\xe8me, souvent r\xe9solu en mode \u201cbrute force\u201d par manque de volont\xe9 d\u2019apprendre \xe0 se servir des fonctionnalit\xe9s de base. Du coup on a des dizaines de plugins fantaisistes et des g\xe9n\xe9rations de vimmers superficiels. C\u2019est triste. En vrai, :edit, :find et :buffer sont rapides et versatiles. Il suffit de prendre le temps d\u2019apprendre \xe0 s\u2019en servir.

Il existe un nombre hallucinant de plugins pour naviguer les fichiers alors que c\u2019est si simple et rapide avec les outils natifs.

La v\xe9rification orthographique

La fonctionnalit\xe9 est incluse de base. Il faut n\xe9anmoins l\u2019activer avec :help \u2019spell\u2019 et, si on veut de l\u2019aide pour autre chose que de l\u2019anglais, installer des dictionnaires. \xc7a sonne plus compliqu\xe9 que \xe7a ne l\u2019est vraiment.

Des tips Indentation Param\xe8tres custom par fichier via modeline

Voir :help modeline pour des exemples. Je ne suis pas hyper fan en g\xe9n\xe9ral que je trouve \xe7a un peu sale de m\xe9langer data et metada mais \xe7a peut \xeatre bien en bas d\u2019un fichier Markdown dont on sait qu\u2019il va \xeatre \xe9dit\xe9 dans Vim :

 [//]: # ( Vim: set spell spelllang=en: )  

En pratique, je sugg\xe8re plut\xf4t editorconfig pour les r\xe9glages d\u2019indentation et compagnie.

Vim et git

Fugitive, mentionn\xe9 plus haut, est tr\xe8s populaire. Pour ma part, je pr\xe9f\xe8re garder mon \xe9diteur de texte pour \xe9diter du texte et utiliser d\u2019autres outils sp\xe9cialis\xe9s pour d\u2019autres t\xe2ches sp\xe9cialis\xe9es. J\u2019aime beaucoup tig, que j\u2019utilise au jour le jour depuis des ann\xe9es, et j\u2019ai d\xe9couvert git-jump r\xe9cemment, qui a fait une entr\xe9e fracassante dans mon workflow.

Sinon, pour les commandes basiques, un simple :!git fait largement le taf.

Les macros

Une macro est une s\xe9quence de commande. On peut enregistrer une macro dans le registre q :

 qq 02wciwfoo q  

et la rejouer sur plusieurs lignes, par exemple :

 :23,45normal! @q  

Mais avec un peu de pratique on peut compl\xe8tement zapper la phase \xab enregistrement \xbb :

 :23,45normal! 02wciwfoo  

Les macros sont un outil d\u2019automatisation extraordinaire qui \xe9pate facilement le spectateur. Voir :help complex-repeat.

Copier dans le buffer de l\u2019OS (ctrl+c ctrl+v)

Pour \xe7a, l\u2019id\xe9al est d\u2019avoir un Vim compil\xe9 avec la fonctionnalit\xe9 \u201cclipboard\u201d. Si c\u2019est pas possible on peut bricoler des trucs avec xclip/pbcopy/etc. ou utiliser les fonctionnalit\xe9s de copier/coller du terminal.

Le clipboard syst\xe8me est repr\xe9sent\xe9 par le registre + dans vim. Donc copier dans le clipboard: "+y, et ensuite coller, "+p. Note que " est la s\xe9lection de registre.

Remplacer via des expressions r\xe9guli\xe8res

La substitution, bas\xe9e sur les expressions r\xe9guli\xe8res ou pas, est une pratique courante dans Vim. Par exemple, pour remplacer toutes les occurrences de java par kotlin dans le buffer courant :

 :%s/java/kotlin/g  

Voir :help :s et le site Vim Regular Expressions 101 car Vim utilise un dialecte sp\xe9cial.

Mode vi dans le shell

Readline, la biblioth\xe8que utilis\xe9e par bash pour g\xe9rer l\u2019invite de commande, utilise des raccourcis inspir\xe9s par Emacs par d\xe9faut. On peut changer \xe7a en ajoutant la ligne suivante dans ~/.inputrc:

 set editing-mode vi  

Personnellement, je pr\xe9f\xe8re garder les raccourcis par d\xe9faut et \xe9diter mes commandes directement dans Vim, avec Ctrl-x Ctrl-e. Si vous ave mis le mode vi, alors pour \xe9diter la commande dans vim, tapez ESC v.

Vimdiff

On peut utiliser Vim pour afficher des diffs c\xf4te \xe0 c\xf4te et m\xeame pour g\xe9rer les merge conflicts dans Git.

Voir :help diff pour les d\xe9tails sanglants.

Aller plus loin Livres Histoire de vim Ressources Meetups Communaut\xe9 En vrac Nous contacter

Soutenez Les Cast Codeurs sur Patreon https://www.patreon.com/LesCastCodeurs
Faire un crowdcast ou une crowdquestion
Contactez-nous via twitter https://twitter.com/lescastcodeurs
sur le groupe Google https://groups.google.com/group/lescastcodeurs
ou sur le site web https://lescastcodeurs.com/