我希望能够在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)
答案 0 :(得分:1)
一个答案:
定义一个运行宏的函数:将其写入Emacs-Lisp缓冲区,将光标留在末尾::
(defun foo ()
M-x insert-kbd-macro RET
现在您有了这个文字,但是键盘宏的定义代替XXXXX
:
(defun foo()(setq last-kbd-macro XXXXX)
将setq last-kbd-macro
替换为execute-kbd-macro
,并添加最终)
:
(defun foo()(execute-kbd-macro XXXXX)
然后在定义后使用C-x C-e
或在其中的任何位置使用C-M-x
。
它定义了函数foo
,它完成了键盘宏所做的事情(在相同的上下文中,例如,相同的模式,所以相同的键绑定)。
将定义保存到init文件中。您可以在批处理模式下将其与Emacs一起使用。您也可以在(interactive)
之后添加()
以使其成为命令,因此您可以将其与M-x
一起使用。
另一个答案:
使用Bookmark+,使用C-u M-x bmkp-make-function-bookmark
从最后一个键盘宏创建书签。系统会提示您输入书签名称。
书签是持久的。要在批处理模式下使用书签,请将其称为bookmark-jump
的参数,如下所示:(bookmark-jump THE-BOOKMARK-NAME)
。