我一直在使用诸如kmacro-name-last-macro
之类的kmacro命令来保存键盘宏。问题是,在我保存了一个宏甚至将其添加到我的.emacs文件后,我遇到了一个错误,想要使用kmacro-step-edit-macro
编辑宏。如果我的命名宏不再位于宏环中(默认kmacro-ring-max
为8),则无法在该宏上使用任何编辑或宏环命令。在得知name-last-kbd-macro
将保存更容易编辑的符号表单后,我后悔使用kmacro-name-last-macro
并想知道它为什么是新的默认值。
是否有办法将以前定义的宏添加到宏环中,以便我可以使用kmacro-step-edit-macro
进行编辑?
答案 0 :(得分:3)
是的,有一种方法可以将以前定义的宏添加到宏环中,以便您可以使用kmacro-step-edit-macro编辑它:
想象一下,您已使用name-last-kbd-macro
命名了一个键盘宏tata,并为tata完成了insert-kbd-macro
。例如:
(fset 'tata
[return return ?f ?o ?o return])
您可以将此宏定义存储到.emacs中以供日后使用。在新的emacs会话中,您可以使用以下lisp代码将宏放回到您的kmacro-ring中:
(kmacro-push-ring (list 'tata 0 "%d"))
(kmacro-pop-ring)
之后,您可以对其进行kmacro-step-edit-macro
。
如果您使用kmacro-name-last-macro
而非name-last-kbd-macro
命名宏,则对insert-kbd-macro
的调用将为您的宏插入不同的定义,使用lambda函数而不是vector或a string(能够存储当前计数器),例如:
(fset 'tata
(lambda (&optional arg) "Keyboard macro." (interactive "p")
(kmacro-exec-ring-item
(quote ([return return 102 111 111 return] 0 "%d")) arg)))
在这种情况下,kmacro-step-edit-macro
会引发错误,因为它不是矢量或字符串。要解决此问题,您可以:
将lambda函数转换为经典的向量宏定义(例如,上面tata的顶级定义)。通常总是可以进行这种转变。
或定义一个调用lambda函数宏的宏,例如:(fset 'foo [?\M-x ?t ?a ?t ?a return])
然后你可以将这个foo宏放入kmacro环中,如前所述。但在这种情况下,您可能会在宏执行结束时产生一些副作用。