Comment appliquer un ensemble de touches à chaque occurrence d'un mot?

13

Si je veux supprimer chaque mot, c'est facile, car je ferais quelque chose comme ceci:

:s%/WORD//g

Mais que faire si je veux faire xyzà chaque occurrence de "WORD"? Par exemple, supposons que je souhaite supprimer toutes les lignes contenant "WORD". Je peux penser à quelques façons de le faire, mais aucune ne semble idéale.

1)

/WORD

puis appuyez manuellement ddnddnddnddn...jusqu'à ce qu'il n'y ait plus d'occurrences. Mais cela prend du temps s'il y a beaucoup de lignes pour le faire.

2)

qd/WORD<enter>ddq

puis devinez combien de fois WORD se produit, puis, par exemple:

500@d 

Mais cela va soit A) manquer un tas de lignes ou B) supprimer un tas de lignes supplémentaires.

Y a-t-il une meilleure manière de faire cela?

James
la source
3
Juste pour que vous le sachiez, 500@dcomme vous le décrivez est en fait sûr. La lecture de la macro s'arrêtera une fois le terme de recherche introuvable. Ainsi, vous verrez juste une erreur "Motif introuvable: WORD" après que toutes les lignes le contenant ont été supprimées.
Wildcard
@Wildcard Merci, c'est vraiment bon à savoir!
James

Réponses:

17

Vous pouvez utiliser les commandes :globalet :normalpour cela. La :globalcommande a la syntaxe suivante:

:global/{pattern}/{command}

Cela exécutera la "commande" à chaque occurrence de "motif". Vous pouvez ensuite utiliser la :normalcommande pour exécuter une série de frappes sur chaque occurrence d'un mot à l'aide :global. Ainsi:

:g/WORD/normal {keystrokes}

Si ces frappes impliquent des touches spéciales comme <Ctrl>, vous pouvez les combiner avec la :executecommande comme ceci:

:g/WORD/exe "normal {keystrokes}"

Notez que vous devez mettre une barre oblique inverse avant chaque occurrence d'une clé spéciale.

Pour plus d'informations sur ces commandes, voir :help :normalet :help :global.

Arbre à feuilles persistantes
la source
Battez-moi à elle; Je suppose que je tapais trop lentement. :)
Wildcard
3

Juste pour être complet, vous pouvez utiliser :substitute, si vous faites correspondre - dans votre exemple (supprimez la ligne entière qui a WORD) - la ligne entière contenant WORD, par exemple:

:%s/^.*\<WORD\>.*\n

Ceci a un "remplacement de correspondance par rien" implicite, c'est-à-dire que c'est la forme la plus courte de:

:%s/^.*\<WORD\>.*\n//

Combiné avec \zs, \ze, \(- \)(regroupement), et \=(dans la pièce de rechange) avec submatch(), :substitutepeut être très puissant.

VanLaser
la source
2

Il semble que vous recherchiez :global.

:g/WORD/d_
Luc Hermitte
la source
Que fait le trait de soulignement?
Wildcard
Cela fonctionne, mais aucune des commandes que je connais ne fonctionne. Je reçois toujours "pas une commande d'éditeur".
James
1
@Wildcard: le trait de soulignement élimine ce qui est coupé. La commande exécutée est en fait :deleteet non le fonctionnement en mode normal d.
Luc Hermitte
@DJMcMayhem: pour d'autres opérations normales, vous en aurez besoin :normal. Et si vous avez besoin de clés spéciales, vous aurez peut-être même besoin :exe-> `exe" normal aFooFar \ <esc> "
Luc Hermitte