3

我一直在使用 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

4

1 回答 1

3

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

想象一下,您使用 命名了一个键盘宏 tata name-last-kbd-macro,并insert-kbd-macro为 tata 做了一个。例如 :

(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 函数而不是向量或字符串(以便能够存储当前计数器),例如:

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

于 2010-09-04T12:19:58.227 回答