以批处理模式运行emacs键盘宏

时间:2013-05-09 12:33:16

标签: emacs elisp

我希望能够在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) 

1 个答案:

答案 0 :(得分: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-macro替换为execute-kbd-macro,并添加最终)

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

  4. 然后在定义后使用C-x C-e或在其中的任何位置使用C-M-x

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

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

  6. 另一个答案:

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

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