2

我希望能够在 emacs 中保存键盘宏,并以批处理模式将其重复应用于文件。举一个简单的例子,我制作了以下文件 paren-delete.el 应该删除所有括号及其内容。当我运行 emacs --batch target.txt --load paren-delete.el 时,似乎没有任何改变。似乎只有第一个 kbd 函数完成了它应该做的事情,所以很明显我不明白该命令是如何工作的。

我知道最好避免使用键盘宏并用适当的 elisp 编写我的函数,但我更喜欢快速而肮脏的解决方案,而且我觉得我已经接近了。

(kbd "M-x load-library kmacro")

(fset 'delete-paren
   (lambda (&optional arg) "Keyboard macro." (interactive "p") 
(kmacro-exec-ring-item (quote ("^S(^M^B^@^[^N^W" 0 "%d")) arg)))

(start-kbd-macro nil)

(kbd "M-x delete-paren")

(end-kbd-macro)

(kbd "C-u 0 C-x e")

(save-buffer) 
4

1 回答 1

1

一个答案:

  1. 定义一个运行宏的函数:将其写入 Emacs-Lisp 缓冲区,将光标留在末尾: (defun foo ()

  2. M-x insert-kbd-macro RET

    现在你有了这个文本,但是用你的键盘宏的定义代替XXXXX

    (defun foo () (setq last-kbd-macro XXXXX)

  3. 替换setq last-kbd-macroexecute-kbd-macro,并添加一个 final )

    (defun foo () (execute-kbd-macro XXXXX)

  4. 然后C-x C-e在定义之后或其中的C-M-x任何地方使用。

    这定义了 function foo,它完成了你的键盘宏所做的事情(在相同的上下文中,例如,相同的模式,所以相同的键绑定)。

  5. 将定义保存到您的初始化文件中。您可以在批处理模式下将它与 Emacs 一起使用。您还可以添加(interactive)after()使其成为命令,因此您可以将其与M-x.

另一个答案:

使用Bookmark+,用于C-u M-x bmkp-make-function-bookmark从最后一个键盘宏创建书签。系统会提示您输入书签名称。

书签是持久的。要在批处理模式下使用书签,请将其作为 的参数调用,如下所示bookmark-jump(bookmark-jump THE-BOOKMARK-NAME)

于 2013-10-18T23:33:01.513 回答