在批处理模式下运行emacs键盘宏

在批处理模式下运行emacs键盘宏,emacs,elisp,Emacs,Elisp,我希望能够在emacs中保存键盘宏,并在批处理模式下重复将其应用于文件。为了给出一个简单的例子,我创建了以下文件paren-delete.el,它应该删除所有括号及其内容。当我运行emacs--batch target.txt--load paren-delete.el时,似乎什么都没有改变。看起来只有第一个kbd函数完成了它应该做的事情,所以很明显我不理解这个命令是如何工作的 我知道最好避免使用键盘宏,并用适当的elisp编写函数,但我更喜欢一个快速而肮脏的解决方案,我觉得我已经接近了 (kb

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

一个答案:

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

  • M-x插入kbd宏RET

    现在您有了此文本,但键盘宏的定义取代了
    XXXXX

    (defun foo()(setq last kbd宏XXXXX)

  • setq last kbd macro
    替换为
    execute kbd macro
    ,并添加一个最终的

    (defun foo()(执行kbd宏XXXXX)

  • 然后在定义后使用
    C-x C-e
    ,或在定义内的任何位置使用
    C-M-x

    这定义了函数
    foo
    ,它与键盘宏所做的一样(在相同的上下文中,例如,相同的模式,所以相同的键绑定)

  • 将定义保存到您的init文件中。您可以在批处理模式下将其与Emacs一起使用。您还可以在
    ()
    之后添加
    (交互式)
    ,使其成为命令,以便将其与
    M-x
    一起使用

  • 另一个答案:

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

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