vimtricks.wiki Concise Vim tricks, one at a time.

How do I edit an existing macro by modifying its register text instead of rerecording it?

Answer

:let @q = substitute(@q, '\n$', 'A;<Esc>\n', '')

Explanation

Rerecording a long macro for one tiny change is slow and error-prone. Because macros are stored as plain text in registers, you can patch them directly with Vimscript. This lets you make surgical updates to an existing automation flow while preserving the rest of the sequence exactly as recorded.

How it works

  • @q accesses the contents of register q (your macro)
  • substitute(..., '\n$', 'A;<Esc>\n', '') replaces the final newline terminator with extra keystrokes before restoring the newline
  • :let @q = ... writes the modified result back into the macro register

Example

Assume register q already contains a macro that edits each line, but you now need it to append a semicolon at the end of every processed line.

:let @q = substitute(@q, '\n$', 'A;<Esc>\n', '')

Now running @q reuses the original macro plus the appended A;<Esc> step.

Before: alpha
After:  alpha;

Tips

  • Use :echo @q before and after to inspect exactly what changed
  • Keep a backup copy first, for example :let @z = @q, so you can roll back instantly

Next

How do I open another buffer in a split without changing the alternate-file register?