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?


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.


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.


2

Il semble que vous recherchiez :global.

:g/WORD/d_

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.