300 votes

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. Existe-t-il un moyen rapide de le faire ?

J'ai essayé Ctrl+Q, j'ai mis en surbrillance un ensemble de lignes et j'ai appuyé sur @@, mais cela n'a pas semblé faire l'affaire.

0 votes

Question hors sujet : Je n'étais pas au courant de l'existence des macros VIM (ou je ne voulais pas l'être :P). Avez-vous un lien sympa orienté "lecteur paresseux" sur les macros VIM ?

0 votes

Bien sûr, ça : oreillynet.com/mac/blog/2006/07/ résume assez bien la situation.

0 votes

Vous pouvez également vérifier :he complex-repeat depuis l'intérieur de vim

498voto

Judge Maygarden Points 14964

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

Exécuter la macro stockée dans le registre a aux lignes 5 à 10.

:5,10norm! @a

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

:5,$norm! @a

Exécuter la macro stockée dans le registre a sur toutes les lignes.

:%norm! @a

Exécuter la macro stocker dans le registre a sur toutes les lignes correspondant à motif .

:g/pattern/norm! @a

Pour exécuter la macro sur les lignes visuellement sélectionnées, appuyez sur V et le j o k jusqu'à ce que la région souhaitée soit sélectionnée. Puis tapez :norm! @a et observez que la ligne d'entrée suivante est affichée.

:'<,'>norm! @a

Entrez :aide normale dans vim pour en savoir plus.

0 votes

Ajouter un : d'abord ne me permet pas d'utiliser @

0 votes

Oui, c'est le cas. Vous tapez tout ce que vous voulez sur la ligne, puis vous appuyez sur la touche Entrée.

0 votes

Ah, c'est la partie "norm !" qui me manquait.

67voto

user2571881 Points 1787

Utilisez mondial pour exécuter la macro 'a' sur toutes les lignes qui contiennent 'pattern'.

:g/pattern/normal! @a

Pour vous aider, vérifiez : :help global .

4 votes

À titre de précision pour les futurs utilisateurs, il s'agit d'une commande globale Ex.

56voto

mheiber Points 290

Vous pouvez également le faire :

En mode normal :

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

Par exemple :

1000@q

Appliquer la macro dans le registre q aux 1000 lignes suivantes.

Mise à jour : le réponse acceptée est beaucoup mieux

Mise à jour : comme @kevinliu l'a fait remarquer, vous voudrez probablement terminer la macro par un j pour passer à la ligne suivante.

6 votes

Cela s'arrête sur la dernière ligne, et n'exécute pas plusieurs fois sur la dernière ligne, ce que je craignais.

0 votes

@Hubro, ces réponses d'autres utilisateurs ont fonctionné pour moi : :%norm! @a y vGG :norm! @a

2 votes

Pour une raison quelconque, cela a fonctionné à merveille, et la réponse acceptée ne l'a pas fait. Ma macro consistait à insérer une nouvelle ligne, à faire des choses, puis à passer à la ligne suivante.

2voto

phux Points 116

Il y a aussi un plugin appelé RangeMacro, qui 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 gamme donnée, peu importe si par sélection visuelle ou par un :40,50 / :+10

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X