How to cancel recording a macro in Vim?
Imagine I had recorded a macro and then I've occasionally started recording a macro into the same register. Can I interrupt the recording so that the original macro is preserved in the register?
I know that I can do :let @b=@a
to copy the macro from register a to register b and thus preserve it but maybe there is a more straightforward way?
Solution 1:
When you record a macro, the register is emptied first and filled as you go so it's very unlikely that there exists a built-in way to save your previous macro while you are halfway through another recording. A way that doesn't involve writing a wrapper around q
, that is.
I and a lot of people use a temporary register (@q
, for example) for all our one-off recordings. Maybe you should, too.
Solution 2:
As noted by @Trendfischer in his comment, the current behavior of vim is not (anymore?) to empty the register on the first press of q
.
Now, if you picked the wrong register, here is what you can do:
- do not quit the recording mode (for now),
- create an empty line,
- paste the register you are overwriting (if you're recording in the
q
register, it's"qp
), - now quit the recording mode (
q
) - select the line you pasted above (without end of line mark:
0v$h
; don't useV
) - yank it in the register you have overwritten (
"qy
if you're using theq
register; again: don't use the line wise copyY
). - now you have your old macro back in the register and you can restart the recording of your new macro in the correct register.
Of course, with a bit of effort, you can rescue both the old and the new macro (but you have to start the process before pressing the second time the q
): just paste what you have recorded and yank in the "new"/"right" register.