Outils

Les plugins qui changent la façon de naviguer et de lire, par ordre d’impact réel sur le quotidien.

Recherche floue — fzf-lua

C’est le plugin qui change le plus de choses, et celui qui rend l’explorateur de fichiers presque superflu.

RaccourciRecherche
<leader>pun fichier du projet
<leader><space>parmi les buffers ouverts
<leader>/une chaîne dans tout le projet, avec aperçu
<leader>sdles diagnostics de l’espace de travail
<leader>ssles symboles du document

Le filtrage est délégué au binaire fzf plutôt que fait en Lua, ce qui explique sa rapidité sur un gros dépôt — et pourquoi fzf doit être installé par le gestionnaire de paquets du système, mason ne le fournissant pas.

Le détour par vim.ui.select

Le point le plus intéressant de cette configuration, et une bonne leçon sur le chargement différé.

vim.ui.select() est le sélecteur générique de Neovim : c’est lui qui présente les propositions de gra (actions de code), le choix entre plusieurs définitions, les invites de neo-tree. Son implémentation par défaut est vim.fn.inputlist() — une liste numérotée en bas de l’écran. fzf-lua sait la remplacer par sa fenêtre flottante, avec filtrage flou et aperçu : l’équivalent du « Quick Fix » de VSCode.

Le problème est que fzf-lua ne charge que sur une de ses cinq touches. Passer par son option ui_select ne marcherait pas : au moment où opts s’exécuterait, le premier gra serait déjà retombé sur inputlist. La solution est une doublure posée dans init, qui s’exécute au démarrage sans charger le plugin :

init = function()
  vim.ui.select = function(...)
    require('fzf-lua').register_ui_select()
    return vim.ui.select(...)
  end
end,

Au premier appel, la doublure charge fzf-lua — ce qui remplace vim.ui.select par la vraie implémentation — puis relaie l’appel vers elle. Les suivants vont directement à la bonne fonction.

Neovim n’a pas d’ampoule

Rien n’indique visuellement qu’une action de code est disponible. Le réflexe à prendre est ]d pour aller au diagnostic, puis gra dessus.

Déplacements — flash

flash étend f, F, t, T de deux façons : ils franchissent les lignes, et chacune de leurs correspondances reçoit une étiquette, de sorte qu’une seconde frappe atteint n’importe laquelle d’entre elles au lieu de la plus proche seulement. L’étiquetage n’est pas le défaut du plugin — jump_labels = true l’active explicitement.

Un seul mapping est ajouté : s, qui saute à une étiquette n’importe où à l’écran. Des cinq touches que propose le README (s, S, r, R, Ctrl + s), c’est la seule retenue — un saut étiqueté vaut une touche d’une lettre, les autres non.

Ce que ça coûte : s n’est plus substitute. Son équivalent cl reste disponible.

Deux garde-fous d’origine évitent les mauvaises surprises :

  • les étiquettes disparaissent dès qu’un compteur est donné, donc 3fx reste littéral ;
  • elles disparaissent aussi pendant l’enregistrement et le rejeu d’un registre, donc les macros ne sont pas affectées.

Les lettres de hjkliardc ne servent jamais d’étiquette, ce qui les garde utilisables immédiatement après le déplacement.

Enfin, modes.search.enabled reste à false : / se comporte exactement comme avant. C’est un choix — flash sait aussi étiqueter les résultats de recherche, mais / est déjà bien.

Objets texte sémantiques — treesitter

nvim-treesitter est utilisé en branche main, où son rôle est plus étroit qu’avant : c’est un installeur de parsers et un distributeur de requêtes. Ce n’est pas lui qui colore. Le highlighter est dans Neovim, appelé par une autocommande FileType :

vim.treesitter.start(event.buf, lang)
vim.bo[event.buf].indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"

L’indentation par treesitter est encore étiquetée expérimentale en amont. C’est aussi la raison pour laquelle smartindent est délibérément absent des options : les deux se battent.

nvim-treesitter-textobjects, en branche main également, ajoute dix mappings — écrits à la main, il n’y a plus de bloc textobjects = {} à passer à un setup().

MappingPortée
af / ifla fonction / son corps
ac / icla classe / son corps
aa / ial’argument, avec / sans sa virgule
]f / [ffonction suivante / précédente
]c / [cclasse suivante / précédente

Trois seulement — fonction, classe, argument — parce que ce sont les captures que tous les langages de la configuration définissent réellement, et que l’ensemble reste assez petit pour tenir en tête.

Deux réglages font la différence à l’usage : lookahead = true saute à l’objet suivant quand le curseur n’est pas dedans, donc dif fonctionne depuis la ligne vide au-dessus d’une fonction ; et set_jumps = true alimente la liste des sauts, ce qui rend Ctrl + o capable d’annuler un ]f.

Trois limites à connaître
  • ]c / [c masquent les déplacements de diff. Choix assumé : le mode diff est rare ici, et do / dp continuent d’y fonctionner.
  • Rien n’est mappé sur ]a / [a : c’est la liste d’arguments native, et aa couvre déjà la moitié utile.
  • ]f et ]c ne descendent pas dans les langages injectés, donc pas dans le <script> d’un .vue. Les objets texte, eux, y fonctionnent. Pour parcourir les symboles d’un .vue, utiliser gO ou <leader>ss.

Le module repeatable_move est laissé de côté volontairement : il s’emparerait de ; et , pour répéter le dernier déplacement, et flash possède déjà ces deux touches.

Git — gitsigns

Les modifications non commitées dans la colonne de signes, ]h / [h pour aller de bloc en bloc, <leader>hp pour un aperçu.

La convention ]x / [x est celle que Neovim utilise pour les diagnostics, la quickfix et les buffers — la reprendre pour les blocs git évite d’avoir à retenir une exception.

Le blame de la ligne courante est activé, ce qui n’est pas le défaut : l’auteur et le résumé du dernier commit qui a touché la ligne s’affichent en fin de ligne après 300 ms. L’amont attend 1000 ms, trop lent pour être utile ; 300 ms est réactif sans scintiller quand on parcourt un fichier. :Gitsigns toggle_current_line_blame coupe.

Explorateur — neo-tree

Ctrl + f en barre latérale, Ctrl + t en fenêtre flottante. Le plugin ne charge qu’à la première frappe de l’une des deux.

Les deux touches masquent un raccourci d’origine — Ctrl + f la page suivante, Ctrl + t la pile de tags. C’est assumé : ni l’un ni l’autre n’est utilisé ici, la pagination passant par Ctrl + d et Ctrl + u.

En pratique, l’explorateur sert moins qu’on ne l’imagine : <leader>p ouvre un fichier en trois lettres, ce qui est plus rapide que de dérouler une arborescence. Il reste utile pour se représenter la structure d’un projet inconnu, et pour les opérations sur les fichiers.

Interface

lualine pour la ligne de statut, sur VeryLazy — elle apparaît juste après le démarrage, hors du chemin critique.

indent-blankline pour les guides d’indentation, y compris sur les lignes vides.

render-markdown rend le markdown directement dans le buffer — titres, tableaux, cases à cocher — au lieu d’afficher la syntaxe brute. Chargé sur ft = markdown.

tokyonight, variante moon, en priority = 1000 pour s’appliquer avant tout ce qui définit des couleurs.

Les diagnostics sont configurés à part, dans lua/plugins/lsp.lua : tri par sévérité, soulignement, texte virtuel avec la source quand plusieurs serveurs répondent, et des signes en Nerd Font. C’est ce qui rend la police Nerd Font obligatoire dans les prérequis.