DEV Community

Cover image for Save Vim Macro
Waylon Walker
Waylon Walker

Posted on • Originally published at waylonwalker.com on

Save Vim Macro

If you are like me, you have created a macro or two that is pure glory, and you forget how you made it after a day or so, or you immediately want to store it away as a custom keybinding. As with most things with vim, it's easy to do once you understand it.

Creating a Macro

One of the earliest things we all learn to do in vim is to create macros, custom sets of functionality stored in a register that can be replayed later.

To create a macro, get into normal mode, then type q followed by a letter that you want to store the macro under.

qq
Enter fullscreen mode Exit fullscreen mode

Note: a common throw-away macro register is q because it's easy to hit qq from normal mode to start recording.

Replaying a Macro

Macros can be replayed using @ followed by the letter that you stored the macro under.

@q
Enter fullscreen mode Exit fullscreen mode

Registers

Registers are nothing more than a single character key mapping to a value of some text. As you yank, delete, or create macros in vim, it automatically stores text into these registers.

When you hit p paste it's simply pasting in the default register. You can also paste in any other register by hitting "qp where q is the register that you want to paste in.

Listing Registers

To see what you have stored in each register, use the :reg command. This is a powerful tool that I have underutilized for a long time. It is really great to see what you have in each register.

:reg
Enter fullscreen mode Exit fullscreen mode

making a macro into a shortcut

a little magic

The magical shortcut that makes it easy is that control + r <C-R> followed by a register will paste that register wherever you currently are, including the command mode.

:nnoremap {binding} <C-R>{register}
Enter fullscreen mode Exit fullscreen mode

Editing a Macro

relieve some of that Macro Pressure

Now that we understand that macros are simply strings of text placed into a register, it becomes a bit more intuitive to edit them after being created.

First, paste the contents of the register into your current working buffer.

<C-R>q
Enter fullscreen mode Exit fullscreen mode

Then edit the macro and add it back to that buffer and delete it.

"qdd
Enter fullscreen mode Exit fullscreen mode

If your macro had multiple lines in it, you might need to.

"qdj
"qd2j
Enter fullscreen mode Exit fullscreen mode

Make it recursive

One use case of editing a macro may be making it recursive after trying it out a few times. Macros can become recursive by simply calling themselves after running.

Paste in the macro.

<C-R>q
Enter fullscreen mode Exit fullscreen mode

Go to the end of the line and add @q to get called again.

A @q
Enter fullscreen mode Exit fullscreen mode

Replace the q register with the updated macro.

"qd
Enter fullscreen mode Exit fullscreen mode

Note: don't use this in a shortcut as the macro may change. If you want to call the keybinding again, you will have to use noremap instead of nnoremap, but be careful as recursive remaps can be dangerous.

Recap

" record a macro
q{register}

" play a macro
@{register}

" list registers
:reg

" map a macro to a keyboard shortcut
:nnoremap {binding} <C-R>{register}

" edit a macro
<C-R>{register}
"{register}dd

" make a macro recursive
<C-R>{register}A@q<esc>"{register}dd
Enter fullscreen mode Exit fullscreen mode

Top comments (0)