289

I have a file with a bunch of lines. I have recorded a macro that performs an operation on a single line. I want to repeat that macro on all of the remaining lines in the file. Is there a quick way to do this?

I tried Ctrl+Q, highlighted a set of lines, and pressed @@, but that didn't seem to do the trick.

Matthias Braun
  • 32,039
  • 22
  • 142
  • 171
Jordan Parmer
  • 36,042
  • 30
  • 97
  • 119
  • Offtopic question: I wasn't aware of VIM macros ( or didn't wanted to be aware :P ) Do you have some nice "lazy reader" oriented link on VIM macros? – OscarRyz Dec 23 '08 at 22:02
  • Sure, this: http://www.oreillynet.com/mac/blog/2006/07/more_vim_save_time_with_macros_1.html sums it up pretty well. – Jordan Parmer Dec 23 '08 at 22:02
  • You can also check :he complex-repeat from inside vim – Sam Nov 17 '10 at 14:58

4 Answers4

482

Use the normal command in Ex mode to execute the macro on multiple/all lines:

Execute the macro stored in register a on lines 5 through 10.

:5,10norm! @a

Execute the macro stored in register a on lines 5 through the end of the file.

:5,$norm! @a

Execute the macro stored in register a on all lines.

:%norm! @a

Execute the macro store in register a on all lines matching pattern.

:g/pattern/norm! @a

To execute the macro on visually selected lines, press V and the j or k until the desired region is selected. Then type :norm! @a and observe the that following input line is shown.

:'<,'>norm! @a

Enter :help normal in vim to read more.

Judge Maygarden
  • 26,961
  • 9
  • 82
  • 99
64

Use global to run the macro 'a' on all lines that contain 'pattern'

:g/pattern/normal! @a

For help, check: :help global.

kenorb
  • 155,785
  • 88
  • 678
  • 743
SergioAraujo
  • 11,069
  • 3
  • 50
  • 40
54

You can also do this:

In normal mode:

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

For example:

1000@q

Apply the macro in register q to the next 1000 lines.

Update: the accepted answer is a lot better

Update: as @kevinliu pointed out, you likely want to end the macro with a j to go to the next line.

Ginhing
  • 1,369
  • 1
  • 9
  • 13
Max Heiber
  • 14,346
  • 12
  • 59
  • 97
  • 6
    This stops on the last line, and doesn't execute multiple time on the last line, which I was afraid of. – Hubro Aug 02 '15 at 04:13
  • @Hubro, these answers from other users worked for me: `:%norm! @a` and `vGG :norm! @a` – Max Heiber Aug 03 '15 at 17:22
  • 2
    For some reason, this worked awesomely, and the accepted answer didn't. My macro involved inserting a new line, doing stuff, and moving to the next line. –  Dec 13 '15 at 03:13
  • @jasonszhao yes same here. but is there anyway to not say 1000 but all lines till end.. and still take care of the new line, doing stuff, etc. – ihightower Jan 19 '19 at 15:42
  • 5
    I think it should be pointed out that your macro must end with a `j` command to go down to the next line otherwise it will try to apply it to the same line. – Kevin Liu Jun 04 '19 at 12:40
  • @KevinLiu that is the important part, the author failed to point out in the first place. – jdhao Oct 26 '20 at 16:46
2

There's also a plugin called RangeMacro, does exactly what you want! For everyone that can't guess by the name, what it does: it repeats a recorded macro for each line in a given range, no matter if by visual selection or by a :40,50 / :+10

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

phux
  • 151
  • 6