Parfois, jutilise :s avec une expression rationnelle compliquée qui peut être correcte ou non, ou je « m pas sûr si je veux remplacer toutes les correspondances.
Est-il possible de dire à Vim de confirmer chaque correspondance trouvée avant quelle ne remplace réellement le texte?
Réponse
Oui! Utilisez lindicateur c pour :substitute. De :help substitute:
[c] Confirm each substitution. Vim highlights the matching string (with hl-IncSearch). You can type: :s_c "y" to substitute this match "l" to substitute this match and then quit ("last") "n" to skip this match <Esc> to quit substituting "a" to substitute this and all remaining matches {not in Vi} "q" to quit substituting {not in Vi} CTRL-E to scroll the screen up {not in Vi, not available when compiled without the +insert_expand feature} CTRL-Y to scroll the screen down {not in Vi, not available when compiled without the +insert_expand feature}
Lexemple dutilisation est simple comme bonjour:
%s/old/new/gc
Ceci est très utile, mais je ne savais pas à ce sujet jusquà il y a 2 semaines 🙂 Et il est même disponible en ol « vi 🙂
Astuce bonus: vous pouvez également utiliser :set nowrapscan; cela empêche Vim de senrouler vers le haut lorsquil touche le bas. « Jai trouvé cela particulièrement utile lors de lutilisation de lindicateur c.
Commentaires
- Jajouterais également que si vous souhaitez remplacer toutes les instances de
olddans la même ligne (pas seulement la première occurrence), vous devez ajoutergà la fin de la commande donc au total vous aurez%s/old/new/gc - Oh, ouais; jai
set gdefaultjai donc tendance à oublier de lajouter dans les exemples @ e271p314 😅
Réponse
En plus de ce que Carpetsmoker a dit:
Le paramètre &incsearch (set incsearch) dans Vim est vraiment utile. Vous pouvez utilisez-le avec une astuce utile et peu connue.
Lastuce consiste à essayer votre regex complexe en utilisant simplement / ou ?. Vim utilisera le paramètre &incsearch pour afficher les correspondances de manière interactive. Onc e vous « êtes satisfait de lexpression régulière, vous pouvez utiliser :%s//replacement pour que vim utilise la recherche précédente.
Remarquez comment la partie de // est vide (cest là que vous mettez le texte à rechercher). Si vous laissez ce champ vide, vous dites à Vim dutiliser lexpression régulière de recherche précédente. Avec cela, vous pouvez taper une expression régulière complexe avec / et bénéficier de tous les avantages de set incsearch, puis utiliser %s//replacement pour exécuter réellement la recherche et le remplacement.
Si vous voulez quelque chose de similaire à incsearch pour les commandes :s, consultez vim-over , mais je préfère simplement utiliser la méthode native de Vim.
Commentaires
Réponse
Ma substitution interactive préférée est de rechercher en utilisant / et de parcourir les correspondances en utilisant n .
Puis sélectionnez correspondance en utilisant g n puis s à remplacer le texte par ce que je veux .
Et répétez en passant à la correspondance suivante et en appuyant sur .
Commentaires
- Cest une très belle astuce, car elle est: (1) interactive, (2) vous pouvez aller à la correspondance précédente si vous avez sauté accidentellement (quelque chose que vous ne pouvez pas faire avec
:s/old/new/gc).
Réponse
qui vous permet de prévisualiser le résultat de la commande :s pendant que vous le saisissez.
Réponse
Pour le bénéfice de tout le monde, incsearch a été mis à jour dans la vim8 pour afficher également laperçu lorsque vous tapez le modèle
:%s/pattern/replace/puis appuyez surupour annuler, vous pouvez voir les parties que Vim a modifiées si vous avez activéhlsearch. Et vous pouvez à nouveau remplacer ce texte par^R.