如何调用 elisp 命令以从自定义命令中编辑当前缓冲区



我正在尝试创建自定义 emacs 命令以从区域中删除空白行。我使用以下命令在masteremacs找到了一种交互式方法来执行此操作:

M-x flush-lines RET ^s-*$ RET

由于我必须经常这样做,我想为它创建自己的命令,如下所示:

(defun flush-empty-lines (start end)                                                                                                
(interactive "*r")                                                                                                                
(flush-lines "^s-*$" start end))

但是,当我选择一个区域并执行M-x flush-empty-lines RET时,没有任何反应。我尝试以各种方式调整对flush-lines的调用,例如通过区域边界和设置(INTERACTIVE t),但没有任何效果。

通常,是否需要某种特殊语法才能将控件从一个交互函数传递到另一个交互函数?

编辑:我根据@Drew的评论修改了我的代码(谢谢),但它仍然不起作用。

必须支付反斜杠税(这是一个正则表达式语法错误,而不是交互错误):

(defun flush-empty-lines (start end)                                                                                                
(interactive "*r")                                                                                                                
(flush-lines "^\s-*$" start end))

@jpkotta的答案当然是正确的,但值得指出的是repeat-complex-command这是一个方便的Emacs功能,用于重复通过minibuffer读取至少一个参数的命令,因为它将准确地显示这些交互式参数最终是如何被处理的。

  • M-xflush-linesRET^s-*$RET
  • C-xM-: 或 C-x调电调

然后给你一个带有 elisp 代码的提示:

Redo: (flush-lines "^\s-*$" nil nil t)

您的问题只是语法问题之一,但是当交互式迷你缓冲区输入与等效的 elisp 参数不同时,此功能会变得更加有用。 例如:

M-xalign-regexpRETfooRET

Redo: (align-regexp 655 848 "\(\s-*\)foo" 1 1 nil)

最新更新