Recherche et remplacement

Palier3 Chercher, dans un fichier puis dans un projet. Agir sur tous les résultats d’un coup relève du palier suivant : voir Automatisation.

Chercher

  • /motif : cherche vers l’avant
  • ?motif : cherche vers l’arrière
  • n : occurrence suivante, dans le sens de la recherche
  • N : occurrence précédente
  • * / # : cherche le mot sous le curseur, vers l’avant / l’arrière
  • g* / g# : idem, mais sans exiger un mot entier

Une recherche est une motion comme une autre : d/foo supprime jusqu’à la prochaine occurrence de foo.

* est la porte d’entrée la plus rapide vers un symbole : curseur sur le nom, *, et on parcourt ses occurrences avec n. Combiné à ., c’est déjà un renommage manuel efficace.

Les options qui rendent la recherche confortable :

vim.opt.ignorecase = true  -- ignore la casse…
vim.opt.smartcase = true   -- …sauf si le motif contient une majuscule
vim.opt.incsearch = true   -- surligne au fur et à mesure de la frappe
vim.opt.hlsearch = true    -- garde les occurrences surlignées

:noh éteint le surlignage jusqu’à la recherche suivante. Neovim le fait déjà sur Ctrl + l par défaut.

Dans le motif, \< et \> marquent les limites d’un mot, \v (very magic) passe à une syntaxe d’expression régulière proche de PCRE, où +, ( et | n’ont plus besoin d’être échappés. Prendre l’habitude de commencer ses motifs par \v évite l’essentiel des surprises.

Remplacer

:{plage}s/motif/remplacement/{drapeaux}
PlagePortée
(vide)la ligne courante
%tout le fichier
5,10les lignes 5 à 10
.,+3la ligne courante et les trois suivantes
'<,'>la sélection visuelle — inséré automatiquement par : en visuel
DrapeauEffet
gtoutes les occurrences de la ligne, pas seulement la première
cdemande confirmation pour chaque occurrence
i / Iforce l’insensibilité / la sensibilité à la casse

Dans le remplacement, & reprend l’ensemble du texte trouvé et \1, \2… les groupes capturés.

:%s/\vlet (\w+)/const \1/g

& en mode normal rejoue la dernière substitution sur la ligne courante, et :%&& la rejoue sur tout le fichier en conservant les drapeaux.

Voir avant de valider

vim.opt.inccommand = 'split' affiche l’effet de la substitution en cours de frappe, et ouvre un aperçu de toutes les lignes touchées dans un partage. C’est la meilleure protection contre un :%s trop large — on voit le dégât avant d’appuyer sur Entrée, pas après.

Marques

Une marque mémorise une position pour y revenir plus tard.

  • m{a-z} : pose une marque locale au fichier
  • m{A-Z} : pose une marque globale, qui pointe aussi vers son fichier
  • `{a-z} : revient à la position exacte de la marque
  • '{a-z} : revient au premier caractère non-blanc de sa ligne
  • `. : dernière modification
  • `^ : dernier endroit quitté en mode insertion
  • :marks : liste les marques posées
  • :delmarks a b : en supprime

Les marques s’utilisent aussi comme plage : :'a,'bs/foo/bar/g ne substitue qu’entre les marques a et b. C’est souvent plus simple que de compter des numéros de ligne.

Chercher dans le projet

:vimgrep remplit la quickfix list, une liste de résultats partagée par beaucoup de plugins et par les diagnostics LSP.

:vimgrep /motif/ **/*.ts
:copen                     ouvre la liste
:cnext / :cprev            résultat suivant / précédent
:cclose                    la referme

:grep fait la même chose en déléguant à l’outil configuré dans grepprg — bien plus rapide sur un gros dépôt si on y met ripgrep :

vim.opt.grepprg = "rg --vimgrep --smart-case"
vim.opt.grepformat = "%f:%l:%c:%m"

La quickfix n’est pas qu’une liste de lecture : :cdo applique une commande à chacune de ses entrées, à travers tous les fichiers concernés. C’est l’objet d’Automatisation.

Dans ma config
  • <Esc> éteint le surlignage de recherche en mode normal, plutôt que Ctrl + l.
  • ignorecase, smartcase et inccommand = 'split' sont actifs.
  • <leader>/ lance un grep interactif sur le projet, avec filtrage flou et aperçu — fzf-lua délègue le filtrage au binaire fzf, ce qui le rend rapide sur un gros dépôt. grepprg n’est du coup pas configuré : :grep reste sur le grep du système, et l’usage courant passe par <leader>/.
  • <leader>sd liste les diagnostics de l’espace de travail et <leader>ss les symboles du document, tous deux en recherche floue.

Détails dans Ma configuration.