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

222

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. Existe-t-il un moyen rapide de procéder?

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

Jordan Parmer
la source
Question hors sujet: je n'étais pas au courant des macros VIM (ou je ne voulais pas être au courant: P) Avez-vous un joli lien orienté "lecteur paresseux" sur les macros VIM?
OscarRyz
Bien sûr, ceci: oreillynet.com/mac/blog/2006/07/… résume assez bien.
Jordan Parmer
Vous pouvez également vérifier: il complexe-répéter de l'intérieur de vim
Sam

Réponses:

354

Utilisez la commande normale 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 jusqu'à la fin du fichier.

:5,$norm! @a

Exécutez la macro stocké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 correspondant au modèle .

: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. Tapez ensuite :norm! @aet observez que la ligne de saisie suivante est affichée.

:'<,'>norm! @a

Entrez : aidez normal dans vim pour en savoir plus.

Le juge Maygarden
la source
1
Oui,: aidez normal dans vim ou le lien que je viens d'ajouter.
Juge Maygarden
1
Tout pour aider un autre utilisateur non emacs!
Juge Maygarden
48
Agréable!! Astuce pour débutant: utilisez V puis j / k pour mettre en surbrillance les lignes que vous voulez, puis tapez juste:norm! @a
Kevin Bourrillion
7
Pour ajouter à l'astuce très utile de @KevinBourrillion, lorsque vous appuyez sur :après avoir mis en surbrillance les lignes, la ligne d'entrée Ex sera lue :'<,'>à laquelle vous ajouterez ensuite le reste de ce que Kevin a suggéré. Cela rendra la commande finale lire: :'<,'>norm! @a.
Deiwin
3
@GabeMoothart Evite !le remappage des clés par l'utilisateur. Vous n'en avez peut-être pas besoin, mais une réponse qui fonctionne pour tout le monde l'exige.
Juge Maygarden
60

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

:g/pattern/normal! @a

Pour de l' aide, consultez: :help global.

SergioAraujo
la source
4
Juste pour des éclaircissements pour les futurs utilisateurs: c'est une commande globale Ex.
atp
39

Vous pouvez également le faire:

En mode normal:

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

Par exemple:

1000@q

Pomme la macro du registre q aux 1 000 lignes suivantes.

Mise à jour: la réponse acceptée est bien meilleure

Mise à jour: comme l'a souligné @kevinliu, vous souhaiterez probablement terminer la macro avec un jpour passer à la ligne suivante.

Max Heiber
la source
4
Cela s'arrête sur la dernière ligne et ne s'exécute pas plusieurs fois sur la dernière ligne, ce dont j'avais peur.
Hubro
@Hubro, ces réponses d'autres utilisateurs ont fonctionné pour moi: :%norm! @aetvGG :norm! @a
Max Heiber
2
Pour une raison quelconque, cela a très bien fonctionné, et la réponse acceptée n'a pas fonctionné. Ma macro consistait à insérer une nouvelle ligne, à faire des choses et à passer à la ligne suivante.
jasonszhao
@jasonszhao oui même ici. mais y a-t-il de toute façon pour ne pas dire 1000 mais toutes les lignes jusqu'à la fin .. et toujours prendre soin de la nouvelle ligne, faire des trucs, etc.
ihightower
2
Je pense qu'il convient de souligner que votre macro doit se terminer par une jcommande pour descendre à la ligne suivante, sinon elle essaiera de l'appliquer à la même ligne.
Kevin Liu
2

Il y a aussi un plugin appelé RangeMacro, fait exactement ce que vous voulez! Pour tous ceux qui ne peuvent pas deviner par le nom, ce qu'il fait: il répète une macro enregistrée pour chaque ligne dans 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

phux
la source