Recording Macros for Super Efficiency Thu, 01 May 2014
Macros in Vim can be a great time saver, especially for complex and repetitive line-editing tasks. A macro is a way of recording a series of actions as a single command. I find this especially useful when I need to make some formatting changes to a set of lines. This is perhaps best illustrated by an example, but prior to that let us quickly look at the syntax for recording and using macros in Vim.
Recording a macro is split into three steps:
qfollowed by a letter to start recording. The letter can be any valid register of your choice, e.g.
m. If successful you will see recording in the bottom left of the screen.
- Carry out whichever actions you require. This isn’t constrained to just one line of actions, though often this is practical.
qagain to stop recording.
Using a macro is simply a case of typing
@ followed by the register
m in the previous example.
A brief example
An example may make the benefits of macros clearer. Let’s say that we have the following data in a file and we want to transform this into a CSV file. This chunk of data is from a wireless sensor network log file that really did need converting to CSV.
StandDev (ToF): 2260ps, Mean (ToF): 64037ps, Errors: 0 StandDev (ToF): 2265ps, Mean (ToF): 66037ps, Errors: 0 StandDev (ToF): 2184ps, Mean (ToF): 82858ps, Errors: 1 StandDev (ToF): 3184ps, Mean (ToF): 82860ps, Errors: 1 StandDev (ToF): 1439ps, Mean (ToF): 55893ps, Errors: 0 StandDev (ToF): 2439ps, Mean (ToF): 75893ps, Errors: 3
We can change this to form part of a CSV file with a quick macro:
- Move to the first line we wish to edit (remember, the macro will capture all commands, so if you execute a move command in your macro it will happen on each run).
- Start recording,
Execute our edit steps. This can be done in many ways. The example command sequence below prepares a single line by: moving to the start of the line, systematically removing the words and units, adding a trailing comma.
^2df fpxxf 2df fpxxf df A,^[j
^[is the ESCAPE key
- Note the move down to a new line at then end,
j. We don’t have to use this approach, alternatives include starting our macro with a search, or using the
normalcommand to run the macro on a selection of lines.
- Stop recording,
With our macro recorded we can now easily run this on the remaining lines, in
our case five times, starting from the first unedited line using
5@m. As with
many efficient uses of Vim, the power in macros really becomes apparent for
cases where the task is very repetitive.
Macros are a good way of making you think about the commands you are using. This becomes more apparent when working on files that are varied. The example above was originally taken from a log file that had many other lines of different data, some already in the correct format. To get to a relevant line for the macro to operate on I included a search for ‘StandDev’ at the start of the recorded command sequence.
treats the proceeding register as a list of commands. This means a register used for a
macro can be viewed and edited in the normal ways. This provides a
convenient way to fix any mistakes made during the recording of a macro, by
editing the register. The Macros page at
wikia has a good explanation of this, notably including a section on
saving macros — really useful if you know you will need your
finely-crafted macro for future files.
Hopefully this post has shown the advantages macros offer in Vim, especially for those that do a lot of one-time text transformations.
Guest post by Martin Falkus (@mfalkus).