2010-10-21 17 views
8

Lorsque je fais une recherche interactive pour un motif, chaque fois que je tape n, j'obtiens le résultat suivant. Comment puis-je supprimer/modifier chaque résultat auquel je viens?Suppression/modification du texte recherché dans Vim

Idéalement, ce que je suis à la recherche fonctionnerait comme ceci: Je frappé n pour obtenir le résultat de la recherche, puis magic command pour mettre en évidence ce résultat en mode visuel, puis je peux faire d ou c pour supprimer ou modifier le texte en surbrillance.

Exemple:

J'entrez la commande

/hello . 

et il correspond hello, un espace et un caractère après. Donc, disons que le premier résultat atteint est "bonjour w".

Maintenant, je veux supprimer tous hello w, recherchez le prochain match (disons qu'il est hello a), changer le prochain match à hello there, et continuer à faire des choses différentes à chaque match.

Je ne cherche pas seulement la recherche et de remplacement, parce que je veux être en mesure d'effectuer toute action sur chaque résultat de manière interactive, par exemple supprimer le premier résultat, remplacer le deuxième résultat avec bye, et remplacer le troisième résultat avec later.

+0

:% s/bonjour/bonjour w/g – shoebox639

+0

@ shoebox639: Cela remplacerait tout 'bonjour' avec' bonjour w', ce qui n'est pas ce que je cherchais:/ – Chetan

Répondre

12

Pour sélectionner tout le match du match en cours (si vous êtes au début du match) vous pouvez tapez

v//e 

pour supprimer à la fin du match

d//e 

Pour changer le match

c//e 

Le seul point négatif est que vous ne pouvez pas utiliser n (comme cela refaire //e) et ont plutôt utiliser //

flux de travail typique ressemblerait à ceci

/hello ./ : Jump to the start of the next "hello ." 
d//e   : Delete the item 
//   : repeat the search to get to the begining of the next "hello ." 
c//e   : change it 
//   : next one. 
etc. 
+0

Ah, c'est exactement ce que je cherchais! Impressionnant! Juste pour clarifier, que cherche exactement '// e'? La fin du match? Comment ça marche? – Chetan

+0

En fait, une question plus générale est de savoir ce que '//' recherche? – Chetan

+0

En fait, j'ai posé la question séparément, s'il vous plaît répondez ici: http://stackoverflow.com/questions/3984622/how-does-the-command-work-in-vim – Chetan

1

Modifier le premier, en utilisant cwfooesc ou autre, puis utilisez la commande . pour répéter modifier pour chaque occurrence plus que vous voulez changer.

+0

Cela change le * mot * , OP veut supprimer/remplacer * text *. – codaddict

+0

Ok, utilisez donc la commande d'édition * text * dont vous avez besoin pour changer ce que vous devez changer. Il est impossible de recommander quelque chose de spécifique sans un exemple spécifique. –

+0

J'ai ajouté un exemple. – Chetan

0

Appuyez sur la touche x.

ou recherche utilisateur et remplacer: [esc] :%s/[search-regex]/[replace-regex]/g

Si replace-regex est vide, vous supprimez tout ce que vous venez de la recherche.

+0

Et si vous voulez remplacer du texte, faites juste [r] et tapez, puis [esc] [n] [r] puis tapez un peu plus. Mais une recherche et un remplacement sont probablement les meilleurs pour vous. – shoebox639

+0

Est-ce que 'x' ne supprime pas un seul caractère? Et 'r' remplacer un seul personnage? Je cherche à supprimer ou remplacer tout le texte correspondant. – Chetan

+0

Merde à droite. Eh bien avez-vous essayé la recherche et le remplacer? – shoebox639

2

Je ferais ce qu'une affiche précédente a suggéré: Construire une seule commande de suppression avec d cible et frapper. après avoir utilisé n pour trouver chaque occurrence. Dans ce cas 7x supprimerait n'importe quoi correspondant hello . C'est un raccourci de d7l ou d7[space] puisque d prend n'importe quelle commande de mouvement. Cependant, si vous voulez une solution vraiment générale à la recherche et à la suppression d'une expression rationnelle, vous pouvez exécuter une seule commande de substitution (même si elle échoue), puis exécuter votre recherche et utiliser & pour réappliquer la dernière substitution à la ligne en cours:

:s/hello .// 
/hello . 
& 
n 
& 

La première ligne (la substitution) peut échouer. Vous pouvez toujours l'appliquer à nouveau avec & plus tard. Je suis un peu surpris que la première commande de substitution ne mette pas le motif par défaut, mais peut-être que c'est dans vi autre que vim.

+0

Merci pour votre réponse! Y a-t-il un moyen de faire en sorte que Vim mette en surbrillance chaque match quand j'arrive en mode visuel, pour que je puisse travailler sur le texte sélectionné visuellement? Ce serait la solution optimale. – Chetan

+0

Vous pouvez hiliter le motif de recherche actuel à tout moment en activant hlsearch (': set hlsearch') –

+0

Je voulais dire le mettre en évidence en mode visuel, donc je peux effectuer une action dessus. – Chetan

1

que vous recherchez « confirmer »

:%s/hello .//gc 

: pour passer en mode ex,% à appliquer à l'ensemble tampon, est de remplacer,/bonjour ./ pour rechercher ce regex, // à le remplacer par rien, g rechercher tous les matchs sur une ligne, et c confirmer si oui ou non supprimer avant chaque match.

Cela suppose que vous êtes à la recherche de confirmation. Si vous voulez simplement tout faire à la fois, il a déjà été mentionné un certain nombre de fois

:%s/hello .//g 

: pour passer en mode ex,% à appliquer à l'ensemble tampon, est de remplacer,/bonjour ./ pour rechercher cette regex, // pour le remplacer par rien, et g pour rechercher tous les matchs sur une ligne

+0

Je sais confirmer, mais je cherchais quelque chose d'un peu différent. Veuillez consulter le nouveau texte en caractères gras dans la question pour plus de précisions. – Chetan

+0

ce que vous décrivez est confirmer. Vous tapez dans la commande supérieure, il vous amène au premier résultat et vous demande si vous souhaitez remplacer. vous dites "y" ou "n", qui le fait ou non, et passe à l'instance suivante, posant la même question –

0

Comment faire cela avec des enregistrements.

qa/textsearch ENTER v9lvq

HIT

9 est la (longueur de textsearch - 1) soit 10 - 1 = 9

Maintenant, une fois que vous avez préparé l'enregistrement dans le registre 'a', faire @agv (@a: enregistrement du nom exécute « a » et gv sélectionne le texte de votre recherche.)

maintenant, vous pouvez faire tout votre texte sélectionné, une fois que vous avez terminé, vous pouvez passer à la suivante un avec @@

espoir que à aide ..

3

Je pense que vous voulez gn: (Aller au prochain match et) le sélectionner en mode visuel. Vous pouvez préfixer ceci avec une commande, par ex. cgn modifie le match, dgn supprime etc. J'ai trouvé que si déjà sur un match, ce match est utilisé, de sorte que cela devrait le faire.

+0

Cela devrait être la réponse, il est beaucoup plus pratique! –

+0

Cela semble génial. Quelle version de vim supporte cela? Je ne peux pas le trouver dans l'aide de ma version, et la commande ne fonctionne pas pour moi (je suis sur 7.2). –

+0

Sur une autre machine, j'ai vérifié qu'elle fonctionne sur vim 8.0 - donc les nouveaux vims semblent être OK. –