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èren: occurrence suivante, dans le sens de la rechercheN: occurrence précédente*/#: cherche le mot sous le curseur, vers l’avant / l’arrièreg*/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 :
: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 | Portée |
|---|---|
| (vide) | la ligne courante |
% | tout le fichier |
5,10 | les lignes 5 à 10 |
.,+3 | la ligne courante et les trois suivantes |
'<,'> | la sélection visuelle — inséré automatiquement par : en visuel |
| Drapeau | Effet |
|---|---|
g | toutes les occurrences de la ligne, pas seulement la première |
c | demande confirmation pour chaque occurrence |
i / I | force l’insensibilité / la sensibilité à la casse |
Dans le remplacement, & reprend l’ensemble du texte trouvé et \1, \2… les
groupes capturés.
& 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 fichierm{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.
: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 :
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 queCtrl + l.ignorecase,smartcaseetinccommand = 'split'sont actifs.<leader>/lance un grep interactif sur le projet, avec filtrage flou et aperçu —fzf-luadélègue le filtrage au binairefzf, ce qui le rend rapide sur un gros dépôt.grepprgn’est du coup pas configuré ::grepreste sur legrepdu système, et l’usage courant passe par<leader>/.<leader>sdliste les diagnostics de l’espace de travail et<leader>ssles symboles du document, tous deux en recherche floue.
Détails dans Ma configuration.