# Vim Power Macros ### Recording When recording macros, best practice is to start with a `0` motion and try to use absolute motions to the line like `A` not `w` Macros are a register, so they can be edited the same way as one. In fact `@` is just a shortcut for `:normal <paste-register-here>`. They can be viewed with `:reg` Modifying macros: - `"lp` paste register `l` - `<C-v><C-k>` literally inserts `<C-k>` as a key motion. Useful for pseudo-esc Saving macros: - `"lyy` copy line into register `l` - `:'<,'>y l` copy selected line into register `l` - `{Visual}"ly` copy selection into register `l`. Doesn't have `<C-j>` at the end On the line: - `<C-r>l` pastes the `l` register in insert mode - `:let @l = "<rec>"` sets the `l` register as `<rec>` - `:let @L = "<rec>"` appends `<rec>` to register `l` - `"i\<esc>"` in a string escapes to literal key strokes, like `<C-v>` inserts Escaping keystrokes, from the last example, only works with double quoted strings. You can check in `:reg` to see the literal expansion ### Replaying macros The older convention for batch macros was adding `j` at the end of the macro, and using absolute motions: - `4@l` replay the macro 4 times A newer solution is to execute registers over command line through `:normal`. Macros executed this way always starts in the left-most column, so prepend `0` to your macro for consistency Command style: - `:norm[al][!] @l` can be used to replay macros. Keep the `!` to not use maps - `:'<,'>norm! @l` replays the macro over every select line - `:g/re/norm! @l` replays the macro over lines with a matching regex Oddly, while `:norm! @l` doesn't see maps for `@l`, it will see mapping in the register internally. So ``` :nnoremap <C-k> <esc> :let @l = "Ihello\<C-k>" :norm! @l ``` will still read `<C-k>` as `<esc>` when executing