I'm using evil-mode, after moving over from Vim about a year ago. I've made a number of customisations, but not yet worked out how to save vim-style keyboard macros.
I can define and run them in evil-mode, using the exact same keys as in Vim.
I'd like to save some of these to my init.el
file to use between sessions, but I've not been able to find any reference to this online, and haven't found the right syntax.
How can I save these evil-mode keyboard macros to file? Is there some reason I should be using native Emacs keyboard macros instead, and is there a way I can run these via @a key?
Evil-mode macros are not special, they are just ordinary Emacs macros and you save them the same way, but you'll need to do some special work to get them into the evil registers.
Let's walk through an example:
In a buffer, do qfifoobar
ESCq. This will save a macro into the f
register that inserts foobar into the buffer.
Now run M-xname-last-kbd-macro
RETmymacro
RET.
Go to your init.el
file and do M-xinsert-kbd-macro
RETmymacro
RET.
This will dump your macro out into an fset
call.
(fset 'mymacro [?i ?f ?o ?o ?b ?a ?r escape])
If you place this in your init.el you will have access to the command mymacro
from M-x.
But, we saved this into register f
and we want it to be there at each startup. You need to extract the macro vector from the code above and save that to a register in your init.el
like this:
;; make sure this is done after evil-mode has been loaded
(evil-set-register ?f [?i ?f ?o ?o ?b ?a ?r escape])
Now you will have access to it from @!
See the docs about naming and inserting macros as text
I faced this problem and write a advice for evil-paste-after
command in another question :
(defun evil-paste-kbd-macro-advice (&rest argv)
"make evil paste kbd-macro if register content is a macro.
this function check whether content is a macro by:
1. equal to `last-kbd-macro'
2. is a vector but not string
3. contain unprintable character"
(if (and (>= (length argv) 2)
(second argv))
(let* ((register (second argv))
(register-pair (assoc register register-alist))
(content (if register-pair (cdr register-pair))))
(if (and content
(or (eq last-kbd-macro content)
(vectorp content)
(string-match "[^\t[:print:]\n\r]" content)))
(let ((last-kbd-macro content))
(forward-line)
(beginning-of-line)
(insert-kbd-macro '##)
(forward-line -2)
(search-forward "setq last-kbd-macro")
(replace-match "execute-kbd-macro")
t)))))
(advice-add 'evil-paste-after :before-until
'evil-paste-kbd-macro-advice)
This advice make evil p
command be able to paste macro in register,
even if macro contain 'return
or 'backspace
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With