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

将以前定义的宏添加到Emacs中的宏环,emacs,emacs23,Emacs,Emacs23,我一直在使用kmacro命令,例如kmacro name last macro来保存键盘宏。问题是,在保存宏甚至将其添加到.emacs文件后,我遇到一个错误,希望使用kmacro step edit macro编辑宏。如果我的命名宏不再位于宏环中(默认的kmacro-ring max为8),我将无法在该宏上使用任何编辑或宏环命令。了解到name last kbd macro将保存易于编辑的符号形式后,我后悔使用kmacro name last macro,并想知道为什么它是新的默认值 是否有方法

我一直在使用kmacro命令,例如
kmacro name last macro
来保存键盘宏。问题是,在保存宏甚至将其添加到.emacs文件后,我遇到一个错误,希望使用
kmacro step edit macro
编辑宏。如果我的命名宏不再位于宏环中(默认的
kmacro-ring max
为8),我将无法在该宏上使用任何编辑或宏环命令。了解到
name last kbd macro
将保存易于编辑的符号形式后,我后悔使用
kmacro name last macro
,并想知道为什么它是新的默认值


是否有方法将先前定义的宏添加到宏环中,以便我可以使用
kmacro step edit macro
对其进行编辑?

是的,有方法将先前定义的宏添加到宏环中,以便您可以使用kmacro step edit macro对其进行编辑:

假设您使用
name last kbd macro
命名了一个键盘宏tata,并为tata执行了
insert kbd macro
。例如:

(fset 'tata
   [return return ?f ?o ?o return])
(fset 'tata
   (lambda (&optional arg) "Keyboard macro." (interactive "p")
   (kmacro-exec-ring-item
      (quote ([return return 102 111 111 return] 0 "%d")) arg)))
您可以将此宏定义存储到.emacs中供以后使用。在新的emacs会话中,可以使用以下lisp代码将宏放回kmacro环中:

(kmacro-push-ring (list 'tata 0 "%d"))
(kmacro-pop-ring)
之后,您可以对其执行
kmacro步骤编辑宏

如果使用
kmacro name last macro
而不是
name last kbd macro
命名宏,则调用
insert kbd macro
将为宏插入不同的定义,使用lambda函数而不是向量或字符串(以便能够存储当前计数器),例如:

(fset 'tata
   [return return ?f ?o ?o return])
(fset 'tata
   (lambda (&optional arg) "Keyboard macro." (interactive "p")
   (kmacro-exec-ring-item
      (quote ([return return 102 111 111 return] 0 "%d")) arg)))
在这种情况下,
kmaro step edit macro
会引发错误,因为这不是向量或字符串。要解决此问题,您可以:

  • 或者将lambda函数转换为经典向量宏定义(例如,上面塔塔的顶级定义)。通常,进行这种转换总是可能的

  • 或者定义一个调用lambda函数宏的宏,例如:
    (fset'foo[?\M-x?t?a?t?a return])
    ,然后可以像前面所说的那样将这个foo宏放入kmacro环中。但在这种情况下,宏执行结束时可能会产生一些副作用


我得到一个错误:
键盘宏必须是字符串或向量。
这可能适用于由
name last kbd macro
定义的宏,但它似乎不适用于
kmacro name last macro
。我在.emacs文件中存储了一个宏,但它的格式是:(fset'macroname(lambda(&optional arg)“键盘宏”。(interactive“p”)(kmacro exec ring item(quote([134217788…25 return]0“%d”))arg),我不知道这是否适用于您的情况,但是您可以通过删除所有命令语句并只留下[1342…25 return]来将宏定义macroname修改为向量。另一种解决方案是定义调用宏的向量,例如:(fset'foo[?\M-x?M?a?c?r?o?n?a?M?e return])请注意,您可以使用
M-x edit named kbd macro