I’ve been using Vim for about three years now and I’ve only now started to understand how macros work. I’ve gotten by up until now without them. But today I encountered a case where I need them. In CoffeeScript, the only multi-line comments are supposed to be that should be preserved when minifying (for example, copyright notices). So, that means I need to be able to comment and uncomment out a bunch of lines at once.
This stack overflow answer by user Svante explained it succinctly.
Macros are like marks in that you have them from a-z and you create one by pressing the button for it followed by the letter you want to use. Marks are
m, macros are
q. So if you want to make a macro
a, you press
qa. You’ll then see that you’re in recording mode.
Now you can do pretty much any editing you want. In this example, I’ll remove all those
#’s to uncomment this code. I’ll press
xj to remove a character then go down a line, followed by
q to exit recording mode. Now I have a macro in the
a register that contains the actions
xj. To call a macro, you use
@ followed by the register. And since vim lets you repeat things by putting a number in front of it, you can say
8@a to output
xjxjxjxjxjxjxjxj, or “delete a character then go down a line” 8 times.
Sweet! One more tool taken from the Vim featureset on the toolbelt.
In the comments Alec asked about using visual mode to select lines on which to run a macro. I found a good Stack Overflow response to this question.
In my dead-simple contrived example, instead of moving down a line, the macro would just be
x. Then you would select the lines you want to delete the comment from and press
: to jump to the vim command prompt,with some auto-filled command that says “for everything I selected”. Then enter a catch-all regex
g/^/ followed by
norm for normal mode, then
@a to fire the macro. Thanks Dave Kirby for the explanation!