将以前定义的宏添加到Emacs中的宏环

时间:2010-09-03 21:53:10

标签: emacs emacs23

我一直在使用诸如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进行编辑?

1 个答案:

答案 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环中,如前所述。但在这种情况下,您可能会在宏执行结束时产生一些副作用。