web-dev-qa-db-fra.com

Dans Vim, comment appliquer une macro à un ensemble de lignes?

J'ai un fichier avec un tas de lignes. J'ai enregistré une macro qui effectue une opération sur une seule ligne. Je veux répéter cette macro sur toutes les lignes restantes du fichier. Y a-t-il un moyen rapide de faire cela?

J'ai essayé Ctrl + Q, mis en évidence un ensemble de lignes et appuyé sur @@, mais cela ne semblait pas suffire.

201
Jordan Parmer

Utilisez la commande normal en mode Ex pour exécuter la macro sur plusieurs/toutes les lignes:

Exécutez la macro stockée dans le registre a sur les lignes 5 à 10.

:5,10norm! @a

Exécutez la macro stockée dans le registre a sur les lignes 5 à la fin du fichier.

:5,$norm! @a

Exécutez la macro enregistrée dans le registre a sur toutes les lignes.

:%norm! @a

Exécutez le magasin de macros dans le registre a sur toutes les lignes pattern.

:g/pattern/norm! @a

Pour exécuter la macro sur des lignes sélectionnées visuellement, appuyez sur [~ # ~] v [~ # ~] et sur . j ou k jusqu'à ce que la région souhaitée soit sélectionnée. Puis tapez :norm! @a et observez que la ligne de saisie suivante est affichée.

:'<,'>norm! @a

Entrez : help normal dans vim pour en savoir plus.

320
Judge Maygarden

Utilisez global pour exécuter la macro 'a' sur toutes les lignes contenant 'pattern'

:g/pattern/normal! @a

Pour obtenir de l'aide, vérifiez: :help global.

58
SergioAraujo

Vous pouvez aussi faire ceci:

En mode normal:

[number of times to apply the macro] @ [register]

Par exemple:

1000@q

Met la macro du registre q aux 1000 prochaines lignes.

Mise à jour: le réponse acceptée est bien meilleur

Mise à jour: comme l'a souligné @kevinliu, vous souhaiterez probablement mettre fin à la macro avec un j pour accéder à la ligne suivante.

33
Max Heiber

Il y a aussi un plugin appelé RangeMacro, fait exactement ce que vous voulez! Pour tout le monde qui ne peut deviner par son nom, ce qu’il fait: il répète une macro enregistrée pour chaque ligne d’une plage donnée, que ce soit par sélection visuelle ou par: 40,50 /: +10

Voir http://www.vim.org/scripts/script.php?script_id=3271

2
phux