This commit is contained in:
Fabrice Mouhartem 2023-05-14 14:03:34 +02:00
parent 1562432804
commit 5153ea8772
1 changed files with 199 additions and 33 deletions

View File

@ -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 jaurais bien aimé connaître plus tôt dans (neo)vim.
Summary: Des informations que jaurais 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 savère que jutilise vim/neovim comme éditeur de texte au
Trolls mis à part, il savère que jutilise 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 linformation que lon cherche… notamment si on ignore quelle e
À ce sujet, je ne peux que recommander les rencontres avec dautres usagers,
comme par exemple aux [tuppervim](https://tuppervim.org).
Ces rencontres sont loccasion 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 nest pas forcément des plus pratiques pour
tous: les rencontres ont lieues à Paris/Lyon/Grenoble, ce qui les rendent
difficile daccè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 jaurais 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):
nessayez pas de tout intégrer dun coup: cest un coup à se décourager.
Dautant plus que vim est avant tout un couteau-suisse, ainsi on ne va pas
Dautant 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 cest
pas très pratique.
Toutes les commandes et techniques ne se valent donc pas suivant lusage de ViM
Toutes les commandes et techniques ne se valent donc pas suivant lusage de Vim
que lon a.
Ce billet nest 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 nest 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 dailleurs 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 jai découvert vim, comme indiqué dans la première phrase de ce billet,
Lorsque jai découvert Vim, comme indiqué dans la première phrase de ce billet,
ce qui ma marqué est le mot « **modal** ».
Je pensais quil sagissait de la partie importante dans la description de vim,
Je pensais quil sagissait de la partie importante dans la description de Vim,
et que cétait ce qui le différenciait demacs ou autre.
En effet, lors de lapprentissage de vim, la première réaction naturelle est de
En effet, lors de lapprentissage de Vim, la première réaction naturelle est de
se dire que pouvoir passer dun mode à lautre 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 nest pas seulement cette
Cependant, selon moi, ce qui fait la force de Vim, ce nest 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ù lon souhaite
aller en trois entrées clavier, mais cest la _langue_ de vim.
aller en trois entrées clavier, mais cest la _langue_ de Vim.
Ainsi, lors de lapprentissage, il est important de comprendre ce quil se
passe.
De la même manière quil ne faut pas copier/coller des lignes de commandes quon
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 quon est en
apprendre des séquences de commandes dans Vim sans comprendre ce quon est en
train de communiquer à son éditeur.
Pour citer une erreur de jeunesse, lorsque jai appris à utiliser vim, jai lu
Pour citer une erreur de jeunesse, lorsque jai appris à utiliser Vim, jai 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 jaurais bien aimé quon 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), cest quune commande vim est en
cétait pas très facile pour moi à lépoque), cest quune commande Vim est en
fait… une phrase.
On demande une action (par exemple `=` qui signifie «indenter»), on donne un
champ daction (`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 davoir 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 quon 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 dune simple
pression sur la touche `o`.
Par exemple, sur un bloc de trois paragraphes, on peut sélectionner le deuxième
(`vap`) parce que cest 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 `}`.
Lexemple précédent illustre également lintérêt du mode visuel pour se rendre
compte de ce quil se passe.
Intuitivement, je pensais que `{` au début du paragraphe allait reprendre le
paragraphe précédent directement, et cela ma 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`
nen prend que deux pour ces raisons de mouvements inclusifs ou exclusifs.
## Incrémenter une colonne de nombres
Si lon 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é dune ligne vide ou dun début de fichier): `ip`, et incrémenter de
manière globale `g<Ctrl+a>`.
Pour comprendre [ce quil se
passe](https://vimdoc.sourceforge.net/htmldoc/change.html#CTRL-A), `<Ctrl-a>`
permet dincrémenter le nombre sous lequel se trouve le curseur (et sa
contrepartie `<Ctrl-x>` permet de le décrémenter).
Si on sélectionne visuellement une colonne et quon applique simplement
`<Ctrl-a>`, la colonne va être incrémentée (et donc donner une colonne de «1»
dans le cas précédent).
Ici, le modificateur `g` sinterprète comme «effectue `<Ctrl-a>` 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 quon fait.
Lorsquon se met en mode ligne de commande sous vim pour effectuer un
Lorsquon 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 laction 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 loption
[`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 lextension `vim-pandoc` ne seront pas
appliquées.
### Modeline
De manière ponctuelle, il est possible de le définir fichier par fichier à
laide du `modeline`.
Il sagit de cette ligne commentée étrange que lon 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 lutilisation de tabulations plutôt que
despaces.
Mais cela peut aussi être utile pour indiquer que lon souhaite lutilisation
dun 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 sagit dune entrée externe exécutée à l'ouverture du fichier, il peut
créer des risques de sécurité au moment douvrir des fichiers issus dune 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 dexé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 davoir 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 quil
semblerait de prime abord, dautant plus que la configuration de Neovim par
défaut va au delà de la politique de Vim initiale qui est dessayer 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 à laide de la m
Pour aller directement à au fichier `filename.tex`, il suffit de placer le
curseur au dessus et dutiliser la commande `gf` (_go file_ pour le mnémonique,
même si en terme de langue vim cest pas exactement ça, cest une approximation
même si en terme de langue Vim cest pas exactement ça, cest une approximation
suffisante).
Bien entendu cette commande peut sétendre :
[`<ctrl-w>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
cest parfois les <em>plugin</em>s 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`/`<Ctrl-r>`) 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`/`<Ctrl-r>`)
[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
sadapter à beaucoup de cas dusages.
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 lutilisation de vim de plus en plus
modifient un peu mon usage et rendent lutilisation de Vim de plus en plus
confortable.
De manière similaire à lutilisation de dispositions de claviers dites
ergonomiques, ce qui rend vim agréable à utiliser ce nest pas la course
ergonomiques, ce qui rend Vim agréable à utiliser ce nest pas la course
permanente à la productivité, mais le gain de confort.
Lamélioration de la vitesse nest quun 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 sapproprier ses outils, et pour un
éditeur de texte aussi configurable que Neovim, cest dautant plus important de
ladapter à son utilisation.
Une règle dor étant: «Si quelque chose vous dérange, cest quil y a moyen
daméliorer ça».
D'autant plus que dautres 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 nai bien entendu pas parlé dénormément de choses: le découpage de lespace
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 nest pas dêtre
@ -339,7 +505,7 @@ manque des choses, nhé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`.
Cest tout pour moi, en espérant que vous avez apprécié ce petit pavé. À
bientôt!