Puis-je faire un: substitute (recherche & remplacer)?

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 old dans la même ligne (pas seulement la première occurrence), vous devez ajouter g à la fin de la commande donc au total vous aurez %s/old/new/gc
  • Oh, ouais; jai set gdefault jai 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

  • Jutilisais une variante de ceci: utilisez simplement :%s/pattern/replace/ puis appuyez sur u pour 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.

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

Dans Neovim, il y a aussi le

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *