2023-05-13 12:48:47 +00:00
|
|
|
|
---
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Title: Quelques pointeurs pour Vim
|
2023-05-13 12:48:47 +00:00
|
|
|
|
Date: 2023-05-13 11:00
|
2023-05-14 12:12:05 +00:00
|
|
|
|
Modified: 2023-05-14 14:00
|
2023-05-13 12:48:47 +00:00
|
|
|
|
Lang: fr
|
|
|
|
|
Author: Fabrice
|
|
|
|
|
Category: programmes
|
|
|
|
|
Tags: vim, neovim
|
|
|
|
|
Slug: nvim
|
2023-05-14 12:03:34 +00:00
|
|
|
|
table-of-contents: true
|
2023-05-13 12:48:47 +00:00
|
|
|
|
Header_Cover: ../images/covers/hand-fan.jpg
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Summary: Des informations que j’aurais bien aimé connaître plus tôt dans (Neo)Vim.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
---
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
[Neovim](https://neovim.org/) est un éditeur de texte modal, héritier direct de
|
|
|
|
|
[Vim](https://www.vim.org) lui-même issu de
|
2023-05-13 12:48:47 +00:00
|
|
|
|
[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
|
2023-05-14 12:03:34 +00:00
|
|
|
|
[Vim vs Emacs](https://fr.wikipedia.org/wiki/Guerre_d%27%C3%A9diteurs).
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Trolls mis à part, il s’avère que j’utilise Vim/Neovim comme éditeur de texte au
|
2023-05-13 12:48:47 +00:00
|
|
|
|
quotidien pour éditer du code, [écrire certains
|
|
|
|
|
e-mails]({filename}../tips/emails-md-fr.md), prendre des notes, écrire ce blog…
|
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Cependant, si vous êtes un vimiste convaincu ou simplement intéressés par la
|
2023-05-13 12:48:47 +00:00
|
|
|
|
question et avez essayé, vous vous serez sans doute rendu compte que la courbe
|
2023-05-14 17:42:21 +00:00
|
|
|
|
d’apprentissage n’est pas des plus douces, et qu’il est parfois compliqué de
|
2023-05-13 15:59:37 +00:00
|
|
|
|
trouver l’information que l’on cherche… notamment si on ignore qu’elle existe.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
À ce sujet, je ne peux que recommander les rencontres avec d’autres usagers,
|
2023-05-13 12:48:47 +00:00
|
|
|
|
comme par exemple aux [tuppervim](https://tuppervim.org).
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Ces rencontres sont l’occasion de partager et de découvrir des informations
|
2023-05-14 12:03:34 +00:00
|
|
|
|
autour de Vim afin de les intégrer __progressivement__ à son flot de travail.
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Malheureusement, cette solution n’est pas forcément des plus pratiques pour
|
2023-05-14 17:42:21 +00:00
|
|
|
|
tous : les rencontres ont lieu à Paris/Lyon/Grenoble, ce qui les rend difficiles
|
|
|
|
|
d’accès pour le sud-ouest de la France… voire pour les personnes en dehors de la
|
|
|
|
|
France métropolitaine.
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Ainsi, même si comme la [documentation Vim](https://www.vim.org/docs.php) qui
|
2023-05-13 15:59:37 +00:00
|
|
|
|
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.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
|
|
|
|
Ainsi je vais essayer de compiler quelques astuces et conseils que je pense être
|
2023-05-14 17:42:21 +00:00
|
|
|
|
intéressant et que j’aurais bien aimé découvrir plus tôt par moments…
|
2023-05-13 12:48:47 +00:00
|
|
|
|
Pour rappeler quelques principes de base du [cheminement vers la
|
2023-05-13 15:59:37 +00:00
|
|
|
|
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.
|
2023-05-14 12:03:34 +00:00
|
|
|
|
D’autant plus que Vim est avant tout un couteau-suisse, ainsi on ne va pas
|
2023-05-13 15:59:37 +00:00
|
|
|
|
utiliser la lime à ongle pour couper du fromage : ça peut fonctionner mais c’est
|
|
|
|
|
pas très pratique.
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Toutes les commandes et techniques ne se valent donc pas suivant l’usage de Vim
|
2023-05-13 12:48:47 +00:00
|
|
|
|
que l’on a.
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
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
|
2023-05-13 16:16:57 +00:00
|
|
|
|
conseils qui améliorent la qualité de vie sans relever de l’ésotérisme.
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Je ne vais d’ailleurs pas aborder le point des modules en détails et essayer de
|
|
|
|
|
rester le plus agnostique possible.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
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,
|
2023-05-13 15:59:37 +00:00
|
|
|
|
irc, autre).
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
|
|
|
|
# Parler à son éditeur
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Lorsque j’ai découvert Vim, comme indiqué dans la première phrase de ce billet,
|
2023-05-13 15:59:37 +00:00
|
|
|
|
ce qui m’a marqué est le mot « **modal** ».
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Je pensais qu’il s’agissait de la partie importante dans la description de Vim,
|
2023-05-13 16:16:57 +00:00
|
|
|
|
et que c’était ce qui le différenciait d’emacs ou autre.
|
2023-05-14 12:03:34 +00:00
|
|
|
|
En effet, lors de l’apprentissage de Vim, la première réaction naturelle est de
|
2023-05-13 15:59:37 +00:00
|
|
|
|
se dire que pouvoir passer d’un mode à l’autre en une seule touche permet
|
2023-05-13 16:16:57 +00:00
|
|
|
|
d’éviter des acrobaties digitales pour appuyer sur trois touches à la fois, qui
|
2023-05-13 12:48:47 +00:00
|
|
|
|
ne sont pas toujours bien placées.
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Cependant, selon moi, ce qui fait la force de Vim, ce n’est pas seulement cette
|
2023-05-13 12:48:47 +00:00
|
|
|
|
distinction entre modes qui permet de faire de la sélection visuelle, ou de
|
2023-05-13 15:59:37 +00:00
|
|
|
|
naviguer entre ses différents fichiers pour aller exactement où l’on souhaite
|
2023-05-14 12:03:34 +00:00
|
|
|
|
aller en trois entrées clavier, mais c’est la _langue_ de Vim.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Ainsi, lors de l’apprentissage, il est important de comprendre ce qu’il se
|
2023-05-13 12:48:47 +00:00
|
|
|
|
passe.
|
2023-05-14 17:42:21 +00:00
|
|
|
|
De la même manière qu’il ne faut pas copier-coller des lignes de commandes qu’on
|
2023-05-14 12:11:16 +00:00
|
|
|
|
ne comprend pas dans son terminal, il est impératif de ne pas simplement
|
2023-05-14 12:03:34 +00:00
|
|
|
|
apprendre des séquences de commandes dans Vim sans comprendre ce qu’on est en
|
2023-05-13 12:48:47 +00:00
|
|
|
|
train de communiquer à son éditeur.
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Pour citer une erreur de jeunesse, lorsque j’ai appris à utiliser Vim, j’ai lu
|
2023-05-13 12:48:47 +00:00
|
|
|
|
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.
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Cependant, ce défaut d’abstraction fait d’une part que j’ai appris plus de
|
2023-05-13 12:48:47 +00:00
|
|
|
|
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é.
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Mais pour faire simple, et ce que j’aurais bien aimé qu’on me dise à mes débuts
|
2023-05-13 12:48:47 +00:00
|
|
|
|
(mais bon, après faut lire de la documentation rébarbative en anglais, et
|
2023-05-14 12:03:34 +00:00
|
|
|
|
c’était pas très facile pour moi à l’époque), c’est qu’une commande Vim est en
|
2023-05-13 12:48:47 +00:00
|
|
|
|
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).
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Et là encore ce champ d’action peut être modifié, ainsi le `a` de `ap` signifie
|
2023-05-13 12:48:47 +00:00
|
|
|
|
_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.
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Ainsi `ri(` permet de réécrire le contenu d’une parenthèse, ce qui peut être
|
2023-05-14 17:42:21 +00:00
|
|
|
|
utile pour remplacer les arguments d’une fonction, là où `ra(` va aussi effacer
|
2023-05-13 12:48:47 +00:00
|
|
|
|
les parenthèses lors de la réécriture.
|
|
|
|
|
|
2023-05-13 16:16:57 +00:00
|
|
|
|
Si vous n’êtes pas certain de ce que vous faites, il peut être intéressant de se
|
2023-05-13 15:59:37 +00:00
|
|
|
|
placer en mode visuel (`v`) pour voir et assimiler ce qu’il se passe.
|
2023-05-13 16:16:57 +00:00
|
|
|
|
C’est un peu comme mettre des sous-titres pour être sûr de comprendre ce qu’il
|
2023-05-13 15:59:37 +00:00
|
|
|
|
se dit.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
|
|
|
|
# Le mode visuel
|
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Parlons de ce mode visuel d’ailleurs.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
Comme beaucoup d’utilisateur Linux, j’ai été formaté pour trouver que tout ce
|
2023-05-13 15:59:37 +00:00
|
|
|
|
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.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
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
|
2023-05-13 15:59:37 +00:00
|
|
|
|
qu’il permet de faire les choses avec un retour visuel qui permet de limiter les
|
2023-05-13 12:48:47 +00:00
|
|
|
|
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
|
2023-05-13 15:59:37 +00:00
|
|
|
|
faute que d’avoir pris quelques instants de plus pour garantir le résultat… sans
|
2023-05-13 12:48:47 +00:00
|
|
|
|
parler de la frustration induite.
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
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)
|
|
|
|
|
|
2023-05-13 12:48:47 +00:00
|
|
|
|
## Changer la position du curseur visuel
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Il peut arriver de sélectionner un paragraphe, avec `vap` par exemple, et de se
|
2023-05-13 12:48:47 +00:00
|
|
|
|
rendre compte qu’on aurait bien aussi pris la ligne précédente, qui peut-être un
|
|
|
|
|
titre par exemple.
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Or, `vap` va placer le curseur permettant d’éditer la zone de sélection
|
2023-05-13 12:48:47 +00:00
|
|
|
|
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`.
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
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.
|
|
|
|
|
|
2023-05-13 12:48:47 +00:00
|
|
|
|
## Incrémenter une colonne de nombres
|
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Si l’on souhaite créer une colonne de nombres (par exemple pour une énumération)
|
|
|
|
|
comme ceci:
|
2023-05-13 12:48:47 +00:00
|
|
|
|
```
|
|
|
|
|
1
|
|
|
|
|
2
|
|
|
|
|
3
|
|
|
|
|
4
|
|
|
|
|
5
|
|
|
|
|
6
|
|
|
|
|
7
|
|
|
|
|
8
|
|
|
|
|
9
|
|
|
|
|
10
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Une technique consiste à insérer 10 fois 0: `10i0<Enter><Esc>`, supprimer la
|
|
|
|
|
ligne surnuméraire `dd`, rentrer en mode visuel `v`, sélectionner le bloc (s’il
|
2023-05-13 15:59:37 +00:00
|
|
|
|
est précédé d’une ligne vide ou d’un début de fichier): `ip`, et incrémenter de
|
2023-05-13 12:48:47 +00:00
|
|
|
|
manière globale `g<Ctrl+a>`.
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Pour comprendre [ce qu’il se
|
|
|
|
|
passe](https://vimdoc.sourceforge.net/htmldoc/change.html#CTRL-A), `<Ctrl-a>`
|
|
|
|
|
permet d’incré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 qu’on 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` s’interprète comme « effectue `<Ctrl-a>` de manière
|
|
|
|
|
_intelligente_ ».
|
|
|
|
|
|
2023-05-13 12:48:47 +00:00
|
|
|
|
## Utiliser le mode visuel pour limiter certaines actions
|
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
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.
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Lorsqu’on se met en mode ligne de commande sous Vim pour effectuer un
|
2023-05-13 12:48:47 +00:00
|
|
|
|
[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.
|
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
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 à
|
2023-05-13 16:16:57 +00:00
|
|
|
|
l’échelle.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
|
|
|
|
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.
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Par exemple, une des raisons qui peut pousser à cela, est le renommage d’une
|
2023-05-13 12:48:47 +00:00
|
|
|
|
variable dans un programme.
|
|
|
|
|
Désormais, il est possible de faire appel au « _language-server protocol_ » (LSP) pour
|
|
|
|
|
faire cela:
|
|
|
|
|
|
|
|
|
|
* [<tt>vim.lsp.buf.rename()</tt>](https://neovim.io/doc/user/lsp.html#vim.lsp.buf.rename())
|
|
|
|
|
|
|
|
|
|
# Ranger sa configuration
|
|
|
|
|
|
|
|
|
|
Un autre point que je trouve important et que j’ai découvert un peu tard est la
|
2023-05-14 17:42:21 +00:00
|
|
|
|
structure des dossiers `.config/{n,}vim/`.
|
2023-05-13 15:59:37 +00:00
|
|
|
|
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.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
N’utilisant pas toute la structure, je vais me concentrer ici sur mon usage :
|
2023-05-13 12:48:47 +00:00
|
|
|
|
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é
|
|
|
|
|
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
|
2023-05-13 15:59:37 +00:00
|
|
|
|
[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.
|
2023-05-13 16:16:57 +00:00
|
|
|
|
Par la suite, il est plus facile de l’éditer et de retrouver la signification
|
2023-05-13 15:59:37 +00:00
|
|
|
|
des différentes lignes grâce au système de fichier.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
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/).
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
## 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.
|
|
|
|
|
|
2023-05-14 12:51:10 +00:00
|
|
|
|
### Indication manuelle
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
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
|
|
|
|
|
|
2023-05-14 12:29:29 +00:00
|
|
|
|
Autrement, il est aussi possible d’exécuter des commandes pour des fichiers
|
2023-05-14 12:03:34 +00:00
|
|
|
|
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"}, {
|
2023-05-14 12:25:41 +00:00
|
|
|
|
pattern = {vim.fn.expand("~") .. "/chemin/vers/blog/**/*.md"},
|
2023-05-14 12:03:34 +00:00
|
|
|
|
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"}, {
|
2023-05-14 12:26:48 +00:00
|
|
|
|
pattern = {vim.fn.expand("~") .. "/chemin/vers/blog/**/*-fr.md"},
|
2023-05-14 12:03:34 +00:00
|
|
|
|
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
|
2023-05-14 17:42:21 +00:00
|
|
|
|
défaut va au-delà de la politique de Vim initiale qui est d’essayer d’être
|
2023-05-14 12:03:34 +00:00
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
2023-05-13 12:48:47 +00:00
|
|
|
|
# La navigation
|
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
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.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
2023-05-14 17:42:21 +00:00
|
|
|
|
Par souci de généralité, je vais, dans la suite, ignorer les actions de
|
2023-05-13 15:59:37 +00:00
|
|
|
|
navigations spécifiques à certains plugins comme LSP.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
|
|
|
|
## Sauter de fichier en fichier
|
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
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}`.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
2023-05-14 17:42:21 +00:00
|
|
|
|
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 termes de langue Vim c’est pas exactement ça, c’est une approximation
|
2023-05-13 12:48:47 +00:00
|
|
|
|
suffisante).
|
|
|
|
|
Bien entendu cette commande peut s’étendre :
|
|
|
|
|
[`<ctrl-w>gf`](https://vimdoc.sourceforge.net/htmldoc/windows.html#CTRL-W_gf)
|
2023-05-13 15:59:37 +00:00
|
|
|
|
permet de l’ouvrir dans un [nouvel
|
2023-05-13 12:48:47 +00:00
|
|
|
|
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
|
2023-05-14 17:42:21 +00:00
|
|
|
|
quelle situation où un chemin vers un fichier existe dans le fichier ouvert.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
|
|
|
|
## L’historique de navigation
|
|
|
|
|
|
|
|
|
|
Si vous avez effectué la commande précédente (`gf`), pour revenir sur vos pas,
|
|
|
|
|
il existe la commande `<Ctrl-o>` qui permet de revenir en arrière dans
|
2023-05-13 15:59:37 +00:00
|
|
|
|
l’[historique de
|
2023-05-13 12:48:47 +00:00
|
|
|
|
sauts](https://vimdoc.sourceforge.net/htmldoc/motion.html#jumplist), que vous
|
2023-05-13 16:51:20 +00:00
|
|
|
|
pouvez visualiser à l’aide de la commande `:jumps`.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Vous pouvez aussi revenir en avant à l’aide de la commande `<Ctrl-i>`.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
C’est aussi pratique pour revenir plus haut après un grand déplacement (par
|
2023-05-13 12:48:47 +00:00
|
|
|
|
exemple une recherche avec `/`).
|
|
|
|
|
|
|
|
|
|
## Repliements
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
Je ne vais pas rentrer dans les détails des repliements sous Vim, surtout que
|
2023-05-13 16:02:10 +00:00
|
|
|
|
c’est 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à:
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
* `zo`/`zc`: ouvrir/fermer d’un niveau le repli sous le curseur.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
* `zO`/`zC`: ouvrir/fermer complètement le repli sous le curseur.
|
2023-05-13 15:59:37 +00:00
|
|
|
|
* `zm`/`zr`: ouvrir/fermer d’un niveau tous les replis.
|
2023-05-13 12:48:47 +00:00
|
|
|
|
* `zM`/`zR`: ouvrir/fermer complètement tous les replis.
|
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Plus de ressources :
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
|
|
|
|
* [Learn Vim the smart way: Folds](https://github.com/iggredible/Learn-Vim/blob/master/ch17_fold.md)
|
|
|
|
|
|
|
|
|
|
# Le reste en vrac
|
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
Quelques autres astuces plus ou moins utiles en vrac qui utilisent ou non des
|
|
|
|
|
concepts présentés précédemment:
|
2023-05-13 12:48:47 +00:00
|
|
|
|
|
2023-05-13 15:59:37 +00:00
|
|
|
|
* `%r)<Ctrl-o>r(`: en se plaçant sur le premier élément d’une paire (par exemple
|
2023-05-13 12:48:47 +00:00
|
|
|
|
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 `<Ctrl-o>` (donc au crochet ouvrant) et remplace par
|
|
|
|
|
une parenthèse ouvrante via `r(`.
|
2023-05-13 15:59:37 +00:00
|
|
|
|
* `@:`/`@@`: je n’ai rien dit sur les macros parce que si c’est puissant, c’est
|
2023-05-13 12:48:47 +00:00
|
|
|
|
aussi un moyen simple de faire des erreurs, mais une utilisation un peu
|
2023-05-14 17:42:21 +00:00
|
|
|
|
détournée des macros est de remarquer que `@:` permet de relancer la commande
|
2023-05-13 12:48:47 +00:00
|
|
|
|
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.
|
|
|
|
|
* `<Ctrl-x><Ctrl-f>`: 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
|
2023-05-13 15:59:37 +00:00
|
|
|
|
niveau et j’ai trois plugins qui se battent pour la même fonctionnalité, je
|
2023-05-13 12:48:47 +00:00
|
|
|
|
me suis donc passé de cette section pour le moment.
|
|
|
|
|
* `:r !<commande système>`: 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
|
|
|
|
|
la sortie standard d’un programme installé sur votre système.
|
2023-05-13 13:00:55 +00:00
|
|
|
|
* Activer
|
2023-05-13 13:01:32 +00:00
|
|
|
|
[`undodir`](https://vimdoc.sourceforge.net/htmldoc/options.html#'undodir') et
|
2023-05-13 13:00:55 +00:00
|
|
|
|
[`undofile`](https://vimdoc.sourceforge.net/htmldoc/options.html#'undofile')
|
2023-05-14 12:03:34 +00:00
|
|
|
|
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.
|
2023-05-14 17:42:21 +00:00
|
|
|
|
* `]p`: pour avoir une indentation cohérente lors d'un copier-coller.
|
2023-05-14 12:09:14 +00:00
|
|
|
|
* `:cq`: pour quitter sans sauvegarder et en renvoyant un code d'erreur non nul.
|
|
|
|
|
Cela peut être utile pour annuler l’écriture d’un message de commit
|
|
|
|
|
[git]({filename}../cheat-sheets/git-fr.md) par exemple.
|
2023-05-14 17:42:21 +00:00
|
|
|
|
* `cursorline`/`cursorcolumn`: ces deux options permettent respectivement de
|
2023-05-14 12:24:03 +00:00
|
|
|
|
surligner la ligne et la colonne du curseur afin de le repérer plus
|
|
|
|
|
facilement dans la fenêtre. Ce n’est pas indispensable, mais je trouve ça
|
|
|
|
|
plutôt agréable.
|
2023-05-13 16:16:57 +00:00
|
|
|
|
|
|
|
|
|
# Le mot de la fin
|
|
|
|
|
|
|
|
|
|
Pour conclure, on peut voir que Vim est un éditeur assez puissant et qui peut
|
|
|
|
|
s’adapter à beaucoup de cas d’usages.
|
2023-05-14 17:42:21 +00:00
|
|
|
|
On a juste effleuré ce qui était possible, et à chaque fois que je vais à un
|
2023-05-13 16:16:57 +00:00
|
|
|
|
[tuppervim](https://tuppervim.org), je découvre toujours des petits trucs qui
|
2023-05-14 12:03:34 +00:00
|
|
|
|
modifient un peu mon usage et rendent l’utilisation de Vim de plus en plus
|
2023-05-13 16:16:57 +00:00
|
|
|
|
confortable.
|
|
|
|
|
De manière similaire à l’utilisation de dispositions de claviers dites
|
2023-05-14 12:03:34 +00:00
|
|
|
|
ergonomiques, ce qui rend Vim agréable à utiliser ce n’est pas la course
|
2023-05-13 16:16:57 +00:00
|
|
|
|
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.
|
|
|
|
|
|
2023-05-14 12:03:34 +00:00
|
|
|
|
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.
|
|
|
|
|
|
2023-05-13 16:16:57 +00:00
|
|
|
|
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
|
|
|
|
|
exhaustif mais d’être rapidement accessible. Cependant si vous pensez qu’il
|
|
|
|
|
manque des choses, n’hésitez pas à me contacter à ce sujet, ce billet peut
|
|
|
|
|
évoluer suivant ce que je découvre et en fonction de ma mémoire.
|
|
|
|
|
|
|
|
|
|
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
|
2023-05-14 12:03:34 +00:00
|
|
|
|
la configuration de Vim en `lua`.
|
2023-05-13 16:16:57 +00:00
|
|
|
|
|
|
|
|
|
C’est tout pour moi, en espérant que vous avez apprécié ce petit pavé. À
|
|
|
|
|
bientôt !
|
2023-05-14 12:32:34 +00:00
|
|
|
|
|
|
|
|
|
<small>
|
|
|
|
|
**Remerciements**: Merci à [Pablo Coves](https://pcoves.gitlab.io/blog/) pour
|
|
|
|
|
sa relecture et ses conseils pour améliorer le billet.
|
|
|
|
|
</small>
|