Puis-je faire un substitut interactif (rechercher et remplacer)?

17

Parfois, j'utilise :savec une expression rationnelle compliquée qui peut être correcte ou non, ou je ne sais pas si je veux remplacer toutes les correspondances.

Existe-t-il un moyen de dire à Vim de confirmer chaque correspondance trouvée avant de remplacer le texte?

Martin Tournoij
la source

Réponses:

20

Oui! Utilisez le cdrapeau 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}

L'exemple d'utilisation est simple comme bonjour:

%s/old/new/c

C'est très utile, mais je ne le savais pas avant il y a 2 semaines :-) Et il est même disponible dans ol 'vi :-)

Astuce bonus: vous pouvez également utiliser :set nowrapscan; cela empêche Vim de s'enrouler vers le haut lorsqu'il touche le bas. J'ai trouvé cela particulièrement utile lors de l'utilisation du cdrapeau.

Martin Tournoij
la source
19

En plus de ce que Carpetsmoker a dit:

Le paramètre &incsearch( set incsearch) dans Vim est vraiment utile. Vous pouvez l'utiliser avec une astuce utile et peu connue.

L'astuce consiste à essayer votre expression rationnelle complexe en utilisant simplement la commande /ou ?. Vim utilisera le &incsearchparamètre pour afficher les matchs de manière interactive. Une fois que vous êtes satisfait de l'expression régulière, vous pouvez utiliser :%s//replacementpour que vim utilise la recherche précédente.

Remarquez comment la pièce //est vide (c'est là que vous mettez le texte à rechercher). Si vous laissez ce champ vide, vous dites à Vim d'utiliser l'ancienne expression rationnelle de recherche. Avec cela, vous pouvez taper une expression rationnelle complexe avec /et avoir tous les avantages de set incsearch, puis utiliser la %s//replacementcommande pour réellement exécuter la recherche et le remplacement.

Si vous voulez quelque chose de similaire à incsearch pour les :scommandes, consultez vim-over , mais je préfère simplement utiliser la méthode native de Vim.

akshay
la source
J'avais l'habitude d'utiliser une variante de ceci: utilisez simplement :%s/pattern/replace/et appuyez sur upour annuler, vous pouvez voir les parties que Vim a modifiées si vous les avez hlsearchactivées. Et vous pouvez à nouveau remplacer ce texte par ^R.
Martin Tournoij
7

Ma substitution interactive préférée est de rechercher en utilisant /et de parcourir les correspondances en utilisant n.

Ensuite , sélectionnez correspondance à l' aide gn, puis sde remplacer le texte avec ce que je veux.

Et répétez en passant au match suivant et en appuyant sur.

Neaţu Ovidiu Gabriel
la source
C'est une très bonne astuce, car elle est: (1) interactive, (2) vous pouvez aller au match précédent si vous l'avez accidentellement sauté (quelque chose que vous ne pouvez pas faire en utilisant :s/old/new/gc).
Ayrat
3

Dans Neovim, il existe également une 'inccommand'option qui vous permet de prévisualiser le résultat de la :scommande pendant que vous la tapez.

Lucas
la source
1

Pour le bénéfice de tous, a incsearchété mis à jour dans vim8 pour afficher également l'aperçu lorsque vous tapez le motif

Dhruva Sagar
la source