【问题标题】:Adding a previously defined macro to the macro ring in Emacs将之前定义的宏添加到 Emacs 中的宏环中
【发布时间】:2010-09-03 21:53:09
【问题描述】:

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

【问题讨论】:

  • 请注意,您可以使用M-x edit-named-kbd-macro编辑命名宏

标签: emacs emacs23


【解决方案1】:

是的,有一种方法可以将先前定义的宏添加到宏环中,以便您可以使用 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 函数而不是向量或字符串(以便能够存储当前计数器),例如:

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

【讨论】:

  • 我收到一个错误:Keyboard macros must be strings or vectors. 这可能适用于name-last-kbd-macro 定义的宏,但它似乎不适用于kmacro-name-last-macro。我的 .emacs 文件中存储了一个宏,但它的格式是: (fset 'macroname (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ([134217788 . .. 25 返回] 0 "%d")) arg)))
  • 我不知道您的情况是否可行,但是您可以通过删除所有命令语句并仅保留 [1342...25 return] 另一个来将宏定义宏名修改为向量解决方案是定义一个向量调用你的宏,例如: (fset 'foo [?\M-x ?m ?a ?c ?r ?o ?n ?a ?m ?e return])
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多