From 5153ea877234ad42bc6826600c017e293ba1ac75 Mon Sep 17 00:00:00 2001 From: Fabrice Mouhartem Date: Sun, 14 May 2023 14:03:34 +0200 Subject: [PATCH] Update --- content/software/nvim-fr.md | 232 +++++++++++++++++++++++++++++++----- 1 file changed, 199 insertions(+), 33 deletions(-) diff --git a/content/software/nvim-fr.md b/content/software/nvim-fr.md index b4ce54c..7fce378 100644 --- a/content/software/nvim-fr.md +++ b/content/software/nvim-fr.md @@ -1,5 +1,5 @@ --- -Title: Quelques pointeurs pour ViM +Title: Quelques pointeurs pour Vim Date: 2023-05-13 11:00 Modified: 2023-05-13 18:00 Lang: fr @@ -7,18 +7,19 @@ Author: Fabrice Category: programmes Tags: vim, neovim Slug: nvim +table-of-contents: true 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 -[vim](https://www.vim.org) lui-même issu de +[Neovim](https://neovim.org/) est un éditeur de texte modal, héritier direct de +[Vim](https://www.vim.org) lui-même issu de [vi](https://ex-vi.sourceforge.net/). Cette famille d’éditeurs est assez répandue, et au moment de rechercher un éditeur de texte, on peut se retrouver face à des choix comme -[ViM vs Emacs](https://fr.wikipedia.org/wiki/Guerre_d%27%C3%A9diteurs). +[Vim vs Emacs](https://fr.wikipedia.org/wiki/Guerre_d%27%C3%A9diteurs). -Trolls mis à part, il s’avère que j’utilise vim/neovim comme éditeur de texte au +Trolls mis à part, il s’avère que j’utilise Vim/Neovim comme éditeur de texte au quotidien pour éditer du code, [écrire certains e-mails]({filename}../tips/emails-md-fr.md), prendre des notes, écrire ce blog… @@ -30,12 +31,12 @@ trouver l’information que l’on cherche… notamment si on ignore qu’elle e À 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 -autour de ViM afin de les intégrer __progressivement__ à son flot de travail. +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 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 dehors de la France métropolitaine. -Ainsi, même si comme la [documentation ViM](https://www.vim.org/docs.php) qui +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. @@ -47,15 +48,15 @@ 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. -D’autant plus que vim est avant tout un couteau-suisse, ainsi on ne va pas +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 peut fonctionner mais c’est pas très pratique. -Toutes les commandes et techniques ne se valent donc pas suivant l’usage de ViM +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 -quelques astuces pour des personnes qui utilisent vim régulièrement sans pour -autant vouloir devenir des _vim-wizards_ et qui pourraient ignorer certains +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. @@ -66,28 +67,28 @@ irc, autre). # Parler à son éditeur -Lorsque j’ai découvert vim, comme indiqué dans la première phrase de ce billet, +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, +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 +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 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. +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 passe. 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 @@ -105,7 +106,7 @@ Pour cela il existe pas mal de tutoriels : 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 +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 @@ -141,18 +142,48 @@ que la vitesse : on perd beaucoup plus de temps et d’énergie à corriger un faute que d’avoir pris quelques instants de plus pour garantir le résultat… sans parler de la frustration induite. +Avant de passer à la suite, voici deux liens qui présentent la même chose, mais le +premier est plus visuel (il y a des vidéos démonstratives) que le second, je +vous laisse choisir selon vos préférences. + +* [learnbyexample: Vim Reference Guide -- Visual mode](https://learnbyexample.github.io/vim_reference/Visual-mode.html) +* [Mastering Visual Mode in Vim](https://dev.to/iggredible/mastering-visual-mode-in-vim-15pl) + ## Changer la position du curseur visuel -Il peut arriver de sélectionner un paragraphe, avec `vip` par exemple, et de se +Il peut arriver de sélectionner un paragraphe, avec `vap` par exemple, et de se rendre compte qu’on aurait bien aussi pris la ligne précédente, qui peut-être un titre par exemple. -Or, `vip` va placer le curseur permettant d’éditer la zone de sélection +Or, `vap` va placer le curseur permettant d’éditer la zone de sélection visuelle (par exemple avec `}` pour sélectionner en plus le paragraphe suivant) à la fin de la sélection. Pour alterner la position du curseur du début à la fin, il suffit d’une simple pression sur la touche `o`. +Par exemple, sur un bloc de trois paragraphes, on peut sélectionner le deuxième +(`vap`) parce que c’est celui qui nous intéresse (pour le copier par exemple), +puis se rendre compte que le premier introduit le deuxième et avoir envie de le +rajouter à la sélection. +On peut donc presser `o` pour replacer le curseur au début, et sélectionner le +paragraphe précédent avec `{{` (oui, pour, me semble-t-il, de sombres raisons +d'[inclusion/exclusion](https://vimdoc.sourceforge.net/htmldoc/motion.html#exclusive), +le paragraphe précédent est… une ligne vide). +On se rend ensuite compte que les deux paragraphes sélectionnés ne sont pas +complets si on ne rajoute par le dernier paragraphe, et pour cela, on peut +revenir à la fin par une seconde pression sur `o` et le sélectionner avec `}`. + +L’exemple précédent illustre également l’intérêt du mode visuel pour se rendre +compte de ce qu’il se passe. +Intuitivement, je pensais que `{` au début du paragraphe allait reprendre le +paragraphe précédent directement, et cela m’a amené à regarder la doc des +[`object-motions`](https://vimdoc.sourceforge.net/htmldoc/motion.html#object-motions), +et me rendre compte que cela ne fonctionne pas exactement comme je me le +représentais. +Durant mes tests pour écrire ce billet, je me suis aussi rendu compte que `v3ap` +sélectionne bien le paragraphe en cours et les trois qui suivent, là où `v3ip` +n’en prend que deux pour ces raisons de mouvements inclusifs ou exclusifs. + ## Incrémenter une colonne de nombres Si l’on souhaite créer une colonne de nombres (par exemple pour une énumération) @@ -175,11 +206,21 @@ ligne surnuméraire `dd`, rentrer en mode visuel `v`, sélectionner le bloc (s est précédé d’une ligne vide ou d’un début de fichier): `ip`, et incrémenter de manière globale `g`. +Pour comprendre [ce qu’il se +passe](https://vimdoc.sourceforge.net/htmldoc/change.html#CTRL-A), `` +permet d’incrémenter le nombre sous lequel se trouve le curseur (et sa +contrepartie `` permet de le décrémenter). +Si on sélectionne visuellement une colonne et qu’on applique simplement +``, la colonne va être incrémentée (et donc donner une colonne de « 1 » +dans le cas précédent). +Ici, le modificateur `g` s’interprète comme « effectue `` de manière +_intelligente_ ». + ## Utiliser le mode visuel pour limiter certaines actions 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 +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 @@ -227,6 +268,109 @@ des différentes lignes grâce au système de fichier. 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/). +## Type du fichier + +### Détection automatique + +Comme indiqué précédemment, les fichiers dans `ftplugin` sont chargés en +fonction du type de fichier. +Celui-ci est défini via l’option +[`filetype`](https://vimdoc.sourceforge.net/htmldoc/filetype.html) ou `ft` pour +faire court. +Cette abstraction permet de faire partager à une classe de fichier des +configurations (par exemple la coloration syntaxique ou l'indentation) +malgré des extensions différentes (`html`/`htm`, `py`/`sage`, `c`/`h`). +On peut de plus noter que la reconnaissance automatisée de type de fichier +(`:filetype on`) est activée par défaut dans Neovim. + +Celui-ci peut aussi être défini à la main via `:set ft=<…>`, par exemple pour que le +fichier de syntaxe de pandoc soit chargé, il faut que ce fichier soit de type +`pandoc`. +Or, par défaut un `*.md` est reconnu comme `filetype=markdown`, et les +personnalisations spécifiques de l’extension `vim-pandoc` ne seront pas +appliquées. + +### Modeline + +De manière ponctuelle, il est possible de le définir fichier par fichier à +l’aide du `modeline`. +Il s’agit de cette ligne commentée étrange que l’on retrouve parfois au début ou +à la fin d'un fichier qui ressemble à +[ça](https://github.com/dunst-project/dunst/blob/master/dunstctl#L164): +```sh +# vim: noexpandtab +``` + +Le `modeline` permet de préciser certains paramètres à propos d'un fichier, +comme précédemment pour indiquer l’utilisation de tabulations plutôt que +d’espaces. +Mais cela peut aussi être utile pour indiquer que l’on souhaite l’utilisation +d’un vérificateur orthographique (`spell`), la langue de ce vérificateur +(`spelllang`/`spl`), le type de fichier (`ft`), et autres. + +Il est à noter que le `modeline` est là pour une utilisation ponctuelle. +Comme il s’agit d’une entrée externe exécutée à l'ouverture du fichier, il peut +créer des risques de sécurité au moment d’ouvrir des fichiers issus d’une source +externe, comme ça a pu être le cas avec les vulnérabilités +[CVE-2019-12735](https://www.cvedetails.com/cve/CVE-2019-12735/) et +[CVE-2016-1248](https://www.cvedetails.com/cve/CVE-2016-1248/) par exemple. + +### Autocommands + +Autrement il est aussi possible d’exécuter des commandes pour des fichiers +particuliers à l'aide des +[`autocommands`](https://vimdoc.sourceforge.net/htmldoc/autocmd.html). + +Je souhaite, par la suite faire un billet spécifiquement sur la configuration de +Vim, mais il est difficile de parler d’`autocommands` sans l’évoquer. + +Par exemple, pour spécifier le type de fichier pour les documents de ce blog, +détecter la langue à partir de ma convention de nommage ainsi que des options de +mise en forme il est possible de définir dans `$VIMHOME/plugin/blog.lua`: + +```lua +local blog_group = vim.api.nvim_create_augroup('blog', { clear = true }) + +vim.api.nvim_create_autocmd({"BufEnter", "BufWinEnter"}, { + pattern = {vim.fn.expand("~") .. "/dev/blog/**/*.md"}, + group = blog_group, + callback = function() + vim.o.filetype = 'pandoc' + vim.o.tw = 80 + vim.o.spell = true + vim.o.spl = 'en' + end +}) + +vim.api.nvim_create_autocmd({"BufEnter", "BufWinEnter"}, { + pattern = {vim.fn.expand("~") .. "/dev/blog/**/*-fr.md"}, + group = blog_group, + callback = function() + vim.o.spl = "fr" + end +}) +``` + +La compréhension du bloc de code non commenté ci-dessus est laissée en exercice +au lecteur attentif. + +Blague à part, on remarque aussi que le fait d’avoir rangé ses fichiers de +manière sémantique dans sa configuration Neovim/Vim permet de s'y retrouver +facilement mais surtout de pouvoir tester et revenir en arrière aisément. +Ainsi, « configurer son éditeur » devient moins effrayant que ce qu’il +semblerait de prime abord, d’autant plus que la configuration de Neovim par +défaut va au delà de la politique de Vim initiale qui est d’essayer d’être +compatible avec vi. +Conséquence de quoi, la configuration de Neovim, étant plus orientée +« utilisable » par défaut est moins verbeuse que celle de Vim. + +Je vous conseille ces deux vidéos pour en savoir plus sur les `autocommands` en +Lua pour Neovim: + +* [[Demo] Lua Augroups - Why And How To Use?](https://www.youtube.com/watch?v=F6GNPOXpfwU) +* [[Demo] Lua Autocmds in Neovim (by the author of Lua Autocmds)](https://www.youtube.com/watch?v=ekMIIAqTZ34) + + # La navigation Un autre point important, est la navigation dans vos projets. @@ -248,7 +392,7 @@ séparés en plusieurs fichiers, on inclut les sous-fichiers à l’aide de la m Pour aller directement à au fichier `filename.tex`, il suffit de placer le 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 +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) @@ -273,7 +417,7 @@ exemple une recherche avec `/`). ## Repliements -Je ne vais pas rentrer dans les détails des repliements sous vim, surtout que +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 est potentiellement utile alors je pose ça là: @@ -311,10 +455,13 @@ concepts présentés précédemment: * Activer [`undodir`](https://vimdoc.sourceforge.net/htmldoc/options.html#'undodir') et [`undofile`](https://vimdoc.sourceforge.net/htmldoc/options.html#'undofile') - pour avoir un historique de modification (`u`/``) par fichier et non - par session. Cela peut être pratique pour pouvoir annuler une modification - sur un fichier de configuration quand on se rend compte trois jours après que - cela ne nous convient pas par exemple. + pour avoir un historique de modification (`u`/``) + [persistant](https://neovim.io/doc/user/undo.html#undo-persistence) par + fichier et non par session. Cela peut être pratique pour pouvoir annuler une + modification sur un fichier + de configuration quand on se rend compte trois jours après que cela ne nous + convient pas par exemple. +* `]p`: pour avoir une indentation cohérente lors d'un copier/coller. # Le mot de la fin @@ -322,14 +469,33 @@ Pour conclure, on peut voir que Vim est un éditeur assez puissant et qui peut s’adapter à beaucoup de cas d’usages. On a juste effleuré ce qui était possibles, et à chaque fois que je vais à un [tuppervim](https://tuppervim.org), je découvre toujours des petits trucs qui -modifient un peu mon usage et rendent l’utilisation de vim de plus en plus +modifient un peu mon usage et rendent l’utilisation de Vim de plus en plus confortable. De manière similaire à l’utilisation de dispositions de claviers dites -ergonomiques, ce qui rend vim agréable à utiliser ce n’est pas la course +ergonomiques, ce qui rend Vim agréable à utiliser ce n’est pas la course permanente à la productivité, mais le gain de confort. L’amélioration de la vitesse n’est qu’un effet de bord des facilités accordées par l’éditeur pour effectuer certaines actions autrement plus rébarbatives. +De plus, en rangeant son `$VIMHOME`, il est possible de pouvoir tester +différentes choses rapidement et sans conséquences. +Vous avez essayé une commande étrange trouvée sur internet dans +`$VIMHOME/plugin/test.lua` et ça affiche 30 lignes d'erreurs ? Pas de problèmes, +il suffit de supprimer le fichier de test. +Si celui-ci fonctionne comme attendu, il ne reste plus qu'à le renommer de +manière plus compréhensible. +Je pense qu'il est assez fondamental de s’approprier ses outils, et pour un +éditeur de texte aussi configurable que Neovim, c’est d’autant plus important de +l’adapter à son utilisation. +Une règle d’or étant : « Si quelque chose vous dérange, c’est qu’il y a moyen +d’améliorer ça ». +D'autant plus que d’autres personnes ont sans doute rencontré le même problème +avant vous (sauf cas de niche bien entendu). +Ainsi, je vous encourage fortement à essayer de nouvelles choses dans Vim, +d'autant plus que les usages ne sont pas figés dans le temps, et que ce qui nous +convient à un moment, ne sera pas forcément toujours d'actualité trois ans plus +tard. + Je n’ai bien entendu pas parlé d’énormément de choses : le découpage de l’espace de travail à la `tmux`, les onglets et la navigation, la complétion automatique, les marques, les tags, les déplacements… Et le but de ce billet n’est pas d’être @@ -339,7 +505,7 @@ manque des choses, n’hésitez pas à me contacter à ce sujet, ce billet peut Enfin, ça a été rapidement évoqué à la fin des points en vrac, mais je pense aussi faire un billet, dans un futur plus ou moins proche, un billet à propos de -la configuration de vim en `lua`. +la configuration de Vim en `lua`. C’est tout pour moi, en espérant que vous avez apprécié ce petit pavé. À bientôt !