diff --git a/content/software/nvim-fr.md b/content/software/nvim-fr.md index 8ee7684..e24e5d5 100644 --- a/content/software/nvim-fr.md +++ b/content/software/nvim-fr.md @@ -1,14 +1,14 @@ --- Title: Quelques pointeurs pour ViM Date: 2023-05-13 11:00 -Modified: 2023-05-13 11:00 +Modified: 2023-05-13 18:00 Lang: fr Author: Fabrice Category: programmes Tags: vim, neovim Slug: nvim Header_Cover: ../images/covers/hand-fan.jpg -Summary: Des informations que j'aurais bien aimé connaître plus tôt dans (neo)vim. +Summary: Des informations que j’aurais bien aimé connaître plus tôt dans (neo)vim. --- [neovim](https://neovim.org/) est un éditeur de texte modal, héritier direct de @@ -22,75 +22,78 @@ Trolls mis à part, il s’avère que j’utilise vim/neovim comme éditeur de t quotidien pour éditer du code, [écrire certains e-mails]({filename}../tips/emails-md-fr.md), prendre des notes, écrire ce blog… -Cependant, si vous êtes un vimiste convaincu ou simplement intéressé par la +Cependant, si vous êtes un vimiste convaincu ou simplement intéressés par la question et avez essayé, vous vous serez sans doute rendu compte que la courbe -d'apprentissage n'est pas des plus douce, et qu’il est parfois compliqué de -trouver l'information que l'on cherche… notamment si on ignore qu'elle existe. +d’apprentissage n’est pas des plus douce, et qu’il est parfois compliqué de +trouver l’information que l’on cherche… notamment si on ignore qu’elle existe. -À ce sujet, je ne peux que recommander les rencontres avec d'autres usagers, +À ce sujet, je ne peux que recommander les rencontres avec d’autres usagers, comme par exemple aux [tuppervim](https://tuppervim.org). -Ces rencontres sont l'occasion de partager et de découvrir des informations +Ces rencontres sont l’occasion de partager et de découvrir des informations autour de ViM afin de les intégrer __progressivement__ à son flot de travail. -Malheureusement, cette solution n'est pas forcément des plus pratiques pour +Malheureusement, cette solution n’est pas forcément des plus pratiques pour tous : les rencontres ont lieues à Paris/Lyon/Grenoble, ce qui les rendent -difficile d'accès pour le sud-ouest de la France… voire pour les personnes en +difficile d’accès pour le sud-ouest de la France… voire pour les personnes en dehors de la France métropolitaine. -Ainsi, même si comme la documentation ViM qui regroupe toutes les informations -dont on pourrait avoir besoin, il existe des [archives des rencontres -précédentes](https://tuppervim.org/archives.html), il est fastidieux de naviguer -dans cette jungle de conseils. Ces archives sont plutôt pratiques pour les -personnes ayant déjà assisté à une des réunions et qui cherche à retrouver un -point particulier. +Ainsi, même si comme la [documentation ViM](https://www.vim.org/docs.php) qui +regroupe toutes les informations dont on pourrait avoir besoin, il existe des +[archives des rencontres précédentes](https://tuppervim.org/archives.html). +On se perd cependant très vite au milieu de cette jungle de conseils. +Ces archives sont plutôt pratiques pour les personnes ayant déjà assisté à une +des réunions et qui cherche à retrouver un point particulier. Ainsi je vais essayer de compiler quelques astuces et conseils que je pense être -intéressants et que j'aurais bien aimé découvrir plus tôt par moments… +intéressants et que j’aurais bien aimé découvrir plus tôt par moments… Pour rappeler quelques principes de base du [cheminement vers la -sagesse](https://fabi1cazenave.github.io/slides/2017-vim-ducklings/0-survive.html): -n'essayez pas de tout intégrer d'un coup, c'est un coup à se décourager. +sagesse](https://fabi1cazenave.github.io/slides/2017-vim-ducklings/0-survive.html) : +n’essayez pas de tout intégrer d’un coup : c’est un coup à se décourager. D’autant plus que vim est avant tout un couteau-suisse, ainsi on ne va pas -utiliser la lime à ongle pour couper du fromage: ça fonctionne mais c’est pas -très pratique. +utiliser la lime à ongle pour couper du fromage : ça peut fonctionner mais c’est +pas très pratique. Toutes les commandes et techniques ne se valent donc pas suivant l’usage de ViM que l’on a. -Ce billet n'est donc pas un cours pour apprendre à utiliser vim, mais simplement +Ce billet n’est donc pas un cours pour apprendre à utiliser vim, mais simplement quelques astuces pour des personnes qui utilisent vim régulièrement sans pour autant vouloir devenir des _vim-wizards_ et qui pourraient ignorer certains conseils qui améliorent la qualité de vie sans relever de l'ésotérisme. +Je ne vais d’ailleurs pas aborder le point des modules en détails et essayer de +rester le plus agnostique possible. Néanmoins, comme ce billet ne s’adresse pas nécessairement à des personnes qui découvriraient Vim, si je me mets à jargonner de manière incompréhensible et que vous trouvez cela dérangeant dans la lecture, merci de me le signaler (par mail, +irc, autre). # Parler à son éditeur -Lorsque j'ai découvert vim, comme indiqué dans la première phrase de ce billet, -ce qui m'a marqué est le mot « **modal** ». +Lorsque j’ai découvert vim, comme indiqué dans la première phrase de ce billet, +ce qui m’a marqué est le mot « **modal** ». Je pensais qu’il s’agissait de la partie importante dans la description de vim, -et que c'était ce qui le différenciait d'emacs ou autre. -En effet, lors de l'apprentissage de vim, la première réaction naturelle est de -se dire que pouvoir passer d'un mode à l'autre en une seule touche permet +et que c'était ce qui le différenciait d’emacs ou autre. +En effet, lors de l’apprentissage de vim, la première réaction naturelle est de +se dire que pouvoir passer d’un mode à l’autre en une seule touche permet d'éviter des acrobaties digitales pour appuyer sur trois touches à la fois, qui ne sont pas toujours bien placées. -Cependant, selon moi, ce qui fait la force de ViM, ce n'est pas seulement cette +Cependant, selon moi, ce qui fait la force de ViM, ce n’est pas seulement cette distinction entre modes qui permet de faire de la sélection visuelle, ou de -naviguer dans son fichier pour aller exactement où l’on souhaite aller en trois -entrées de touches, mais c'est la _langue_ de vim. +naviguer entre ses différents fichiers pour aller exactement où l’on souhaite +aller en trois entrées clavier, mais c’est la _langue_ de vim. -Ainsi, lors de l'apprentissage, il est important de comprendre ce qu'il se +Ainsi, lors de l’apprentissage, il est important de comprendre ce qu’il se passe. -De la même manière qu'il ne faut pas copier/coller des lignes de commandes qu'on +De la même manière qu’il ne faut pas copier/coller des lignes de commandes qu’on ne comprend pas dans sont terminal, il est impératif de ne pas simplement -apprendre des séquences de commandes dans vim sans comprendre ce qu'on est en +apprendre des séquences de commandes dans vim sans comprendre ce qu’on est en train de communiquer à son éditeur. -Pour citer une erreur de jeunesse, lorsque j'ai appris à utiliser vim, j'ai lu +Pour citer une erreur de jeunesse, lorsque j’ai appris à utiliser vim, j’ai lu quelque part sur internet que `gqap` en mode normal permettait de reformater un bloc de texte. Je ne comprenais pas exactement ce que « bloc » signifiait, mais ça fonctionnait globalement, et les modificateurs de répétition (par exemple `3gqap`) ont le comportement attendu. -Cependant, ce défaut d'abstraction fait d'une part que j'ai appris plus de +Cependant, ce défaut d’abstraction fait d’une part que j’ai appris plus de commandes par cœur que nécessaire, par exemple `dap` et `yap` construites sur le même principe, là où simplement savoir ce que signifie la commande aurait été un gain de place en mémoire, et fait gagner en flexibilité. @@ -100,41 +103,42 @@ Pour cela il existe pas mal de tutoriels : * [Learn Vim For the Last Time: A Tutorial and Primer](https://danielmiessler.com/study/vim/#language) * [Learning Vim in 2014: Vim as Language](https://benmccormick.org/2014/07/02/062700.html) -Mais pour faire simple, et ce que j'aurais bien aimé qu'on me dise à mes débuts +Mais pour faire simple, et ce que j’aurais bien aimé qu’on me dise à mes débuts (mais bon, après faut lire de la documentation rébarbative en anglais, et c'était pas très facile pour moi à l’époque), c’est qu’une commande vim est en fait… une phrase. On demande une action (par exemple `=` qui signifie « indenter »), on donne un champ d’action (`ap` qui signifie « autour du paragraphe », où un paragraphe est défini comme un bloc séparé par au moins deux retours chariots avant et après). -Et là encore ce champ d'action peut être modifié, ainsi le `a` de `ap` signifie +Et là encore ce champ d’action peut être modifié, ainsi le `a` de `ap` signifie _around_ (autour), et peut-être remplacé par `i` pour `inside`. Pour les paragraphes, cela signifie prendre en compte ou non les lignes vides autour de ce dernier, mais pour des parenthèses, cela peut-être plus intéressant. -Ainsi `ri(` permet de réécrire le contenu d'une parenthèse, ce qui peut être -utiles pour remplacer les arguments d'une fonction, là où `ra(` va aussi effacer +Ainsi `ri(` permet de réécrire le contenu d’une parenthèse, ce qui peut être +utiles pour remplacer les arguments d’une fonction, là où `ra(` va aussi effacer les parenthèses lors de la réécriture. Si vous n'êtes pas certain de ce que vous faites, il peut être intéressant de se -placer en mode visuel (`v`) pour voir et assimiler ce qu’il se passe. C'est un -peu comme mettre des sous-titres. +placer en mode visuel (`v`) pour voir et assimiler ce qu’il se passe. +C’est un peu comme mettre des sous-titres pour être sûr de comprendre ce qu'il +se dit. # Le mode visuel -Parlons de ce mode visuel d'ailleurs. +Parlons de ce mode visuel d’ailleurs. Comme beaucoup d’utilisateur Linux, j’ai été formaté pour trouver que tout ce -qui se fait simplement en ligne de commande est mieux que de devoir faire treize -clics pour arriver au même résultat. +qui se fait simplement en ligne de commande est beaucoup plus pur/élégant que de +devoir faire treize clics pour arriver au même résultat. Or comme tout dogmatisme, il révèle parfois ses limites et pousse à l’obstination là où ça n’a pas forcément lieu d’être. Une des conséquences perverse de cette préconception est d’avoir ignoré le mode visuel, ou alors essayer de trouver de manière de m’en passer par moments alors -qu'il permet de faire les choses avec un retour visuel qui permet de limiter les +qu’il permet de faire les choses avec un retour visuel qui permet de limiter les erreurs. Et de manière similaire à la frappe au clavier, la précision est plus importante que la vitesse : on perd beaucoup plus de temps et d’énergie à corriger une -faute que d'avoir pris quelques instants de plus pour garantir le résultat… sans +faute que d’avoir pris quelques instants de plus pour garantir le résultat… sans parler de la frustration induite. ## Changer la position du curseur visuel @@ -151,7 +155,8 @@ pression sur la touche `o`. ## Incrémenter une colonne de nombres -Si l'on souhaite créer une colonne de nombres (par exemple pour une énumération) comme ceci: +Si l’on souhaite créer une colonne de nombres (par exemple pour une énumération) +comme ceci: ``` 1 2 @@ -167,26 +172,26 @@ Si l'on souhaite créer une colonne de nombres (par exemple pour une énumérati Une technique consiste à insérer 10 fois 0: `10i0`, supprimer la ligne surnuméraire `dd`, rentrer en mode visuel `v`, sélectionner le bloc (s’il -est précédé d’une ligne vide ou d'un début de fichier): `ip`, et incrémenter de +est précédé d’une ligne vide ou d’un début de fichier): `ip`, et incrémenter de manière globale `g`. ## Utiliser le mode visuel pour limiter certaines actions -Parfois on est tenté de lancer de gros remplacements par expressions régulières -sur son fichier, mais on est pas toujours sûr de ce qu'on fait. -Lorsqu'on se met en mode ligne de commande sous vim pour effectuer un +On est parfois tenté de lancer de gros remplacements par expressions régulières +sur son fichier, mais on est pas toujours sûr de ce qu’on fait. +Lorsqu’on se met en mode ligne de commande sous vim pour effectuer un [remplacement](https://www.gnu.org/software/sed/manual/sed.html) par exemple, cela va commencer la ligne par `'<,'>`, qui indique que l’action se déroulera entre les marques `<` et `>` qui représentent le début et la fin de la sélection visuelle. -C'est ainsi possible de faire des tests pour vérifier si l'expression régulière -fait bien ce qui est attendu d'elle sur un petit exemple avant de passer à +C’est ainsi possible de faire des tests pour vérifier si l’expression régulière +fait bien ce qui est attendu d’elle sur un petit exemple avant de passer à l'échelle. Bien entendu, je ne recommande pas cette méthode, principalement parce qu’aujourd’hui il existe d’autres méthodes pour faire du remplacement de masse. -Par exemple, une des raisons qui peut pousser à cela, est le renommage d'une +Par exemple, une des raisons qui peut pousser à cela, est le renommage d’une variable dans un programme. Désormais, il est possible de faire appel au « _language-server protocol_ » (LSP) pour faire cela: @@ -197,15 +202,15 @@ faire cela: Un autre point que je trouve important et que j’ai découvert un peu tard est la structure des dossier `.config/{n,}vim/`. -J'ai en effet passé mes premières années avec un seul `.vimrc` avant de -l’étendre avec d'autres fichiers que je changeais (`source`) par la suite. +J’ai en effet passé mes premières années avec un seul `.vimrc` avant de +l’étendre avec d’autres fichiers que je changeais (`source`) par la suite. Or, le dossier `$VIMHOME` est rangé de manière sémantique: * [Vim Directory Structure](http://www.panozzaj.com/blog/2011/09/09/vim-directory-structure/) * [Plugin Layout in the Dark Ages](https://learnvimscriptthehardway.stevelosh.com/chapters/42.html) -Bien entendu je n’utilise par toute la structure, mais le point intéressant sont +N’utilisant pas toute la structure, je vais me concentrer ici sur mon usage : les dossiers `ftplugin` et `plugin`. Pour faire simple, le contenu de `plugin/*.{vim,lua}` sera automatiquement chargé au démarrage, et le contenu de `ftplugin/$FT.{vim,lua}` sera chargé @@ -213,38 +218,41 @@ lorsque vous ouvrez un fichier reconnu comme `$FT` par son [type de fichier](https://vimdoc.sourceforge.net/htmldoc/filetype.html). Ainsi, en ayant un fichier `ftplugin/pandoc.lua` avec le paramétrage de -[vim-pandoc-syntax](https://github.com/vim-pandoc/vim-pandoc-syntax) et mes [raccourcis pour pandoc]({filename}../tips/emails-md-fr.md) pour écrire -ce billet, il m'est facile de l'éditer par la suite et de retrouver quelle ligne -sert à quoi grâce au système de fichier. +[vim-pandoc-syntax](https://github.com/vim-pandoc/vim-pandoc-syntax) et mes +[raccourcis pour pandoc]({filename}../tips/emails-md-fr.md) pour écrire +ce billet. +Par la suite, il est plus facile de l'éditer et de retrouver la signification +des différentes lignes grâce au système de fichier. -De manière similaire, je sais que `plugin/bepo.lua` est mon réarrangement -partiel des raccourcis vim pour le [bépo](https://bepo.fr/). +De manière similaire, je sais que `plugin/bepo.lua` décrit mon réarrangement +partiel des raccourcis Vim pour le [bépo](https://bepo.fr/). # La navigation -Un autre point important, est la navigation dans vos projets. En effet, à partir -d'un moment, avoir un seul fichier pour tout devient irréaliste quel que soit le -projet, et il convient de savoir naviguer rapidement entre différents -emplacements dans le fichier. +Un autre point important, est la navigation dans vos projets. +En effet, à partir d’un moment, avoir un seul fichier pour tout devient +irréaliste quel que soit le projet, et il convient de savoir naviguer rapidement +entre différents emplacements dans le fichier. -Par soucis de généralité, nous allons ignorer les actions de navigations -spécifiques à certains plugins comme LSP. +Par soucis de généralité, je vais, dans la suite, ignorer les actions de +navigations spécifiques à certains plugins comme LSP. ## Sauter de fichier en fichier -Pour prendre un exemple de ma vie courante, j'utilise souvent LaTeX pour générer -des documents. Lorsque ces documents commencent à prendre de la place (par -exemple un [manuscrit de thèse](https://git.epheme.re/fmouhart/Manuscrit)) et -qu’ils sont séparés en plusieurs fichiers, on inclut les sous-fichiers à l'aide -de la macro `\include{filename}`. +Pour prendre un exemple de ma vie courante, j’utilise souvent LaTeX pour générer +des documents. +Lorsque ces documents commencent à prendre de la place (par exemple un +[manuscrit de thèse](https://git.epheme.re/fmouhart/Manuscrit)) et qu’ils sont +séparés en plusieurs fichiers, on inclut les sous-fichiers à l’aide de la macro +`\include{filename}`. Pour aller directement à au fichier `filename.tex`, il suffit de placer le -curseur dessus et d'utiliser la commande `gf` (_go file_ pour le mnémonique, -même si en terme de langue vim c'est pas exactement ça, c'est une approximation +curseur au dessus et d’utiliser la commande `gf` (_go file_ pour le mnémonique, +même si en terme de langue vim c’est pas exactement ça, c’est une approximation suffisante). Bien entendu cette commande peut s’étendre : [`gf`](https://vimdoc.sourceforge.net/htmldoc/windows.html#CTRL-W_gf) -permet de l'ouvrir dans un [nouvel +permet de l’ouvrir dans un [nouvel onglet](https://vim.fandom.com/wiki/Using_tab_pages). Et cela fonctionne aussi pour les en-têtes en C par exemple ou dans n’importe @@ -254,48 +262,48 @@ quel situation où un chemin vers un fichier existe dans le fichier ouvert. Si vous avez effectué la commande précédente (`gf`), pour revenir sur vos pas, il existe la commande `` qui permet de revenir en arrière dans -l'[historique de +l’[historique de sauts](https://vimdoc.sourceforge.net/htmldoc/motion.html#jumplist), que vous -pouvez visualiser à l'aide de la commande `jumps`. +pouvez visualiser à l’aide de la commande `jumps`. -Vous pouvez aussi revenir en avant à l'aide de la commande ``. +Vous pouvez aussi revenir en avant à l’aide de la commande ``. -C'est aussi pratique pour revenir plus haut après un grand déplacement (par +C’est aussi pratique pour revenir plus haut après un grand déplacement (par exemple une recherche avec `/`). ## Repliements Je ne vais pas rentrer dans les détails des repliements sous vim, surtout que -c’est parfois les plugins qui le gèrent, mais apprendre à les ouvrir et les -fermer peut-être utile alors je laisse ça ici: +c’est parfois les _plugin_s qui le gèrent, mais apprendre à les ouvrir et les +fermer est potentiellement utile alors je pose ça là: -* `zo`/`zc`: ouvrir/fermer d'un niveau le repli sous le curseur. +* `zo`/`zc`: ouvrir/fermer d’un niveau le repli sous le curseur. * `zO`/`zC`: ouvrir/fermer complètement le repli sous le curseur. -* `zm`/`zr`: ouvrir/fermer d'un niveau tous les replis. +* `zm`/`zr`: ouvrir/fermer d’un niveau tous les replis. * `zM`/`zR`: ouvrir/fermer complètement tous les replis. -Plus de ressources: +Plus de ressources : * [Learn Vim the smart way: Folds](https://github.com/iggredible/Learn-Vim/blob/master/ch17_fold.md) # Le reste en vrac -Quelques autres astuces plus ou moins utiles en vrac qui utilisent des concepts -présentés précédemment: +Quelques autres astuces plus ou moins utiles en vrac qui utilisent ou non des +concepts présentés précédemment: -* `%r)r(`: en se plaçant sur le premier élément d'une paire (par exemple +* `%r)r(`: en se plaçant sur le premier élément d’une paire (par exemple des crochets), permet de les remplacer par des parenthèses. La commande va à la paire associée avec `%`, remplace par une parenthèse fermante avec `r)`, revient en arrière avec `` (donc au crochet ouvrant) et remplace par une parenthèse ouvrante via `r(`. -* `@:`/`@@`: je n'ai rien dit sur les macros parce que si c'est puissant, c'est +* `@:`/`@@`: je n’ai rien dit sur les macros parce que si c’est puissant, c’est aussi un moyen simple de faire des erreurs, mais une utilisation un peu détourné des macros est de remarquer que `@:` permet de relancer la commande précédente (par exemple un `make`), et ainsi `@@` qui relance la macro précédente, permet de réeffectuer cette commande à moindre coût. * ``: complète un nom de fichier. Je voulais en dire plus sur la complétion, mais pour le moment, ma configuration est un peu chaotique à ce - niveau et j'ai trois plugins qui se battent pour la même fonctionnalité, je + niveau et j’ai trois plugins qui se battent pour la même fonctionnalité, je me suis donc passé de cette section pour le moment. * `:r !`: par exemple `:r !date` permet d’écrire la date actuelle sur la ligne suivante. De façon plus générale, cela permet d’écrire