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

How to call an elisp command to edit the current buffer from within a custom command

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

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

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

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

但是,当我 select 一个区域并执行 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 功能,用于重复通过迷你缓冲区读取至少一个参数的命令,因为它会告诉你 确切地那些互动的争论最终是如何被对待的。

  • M-x flush-lines RET ^\s-*$ RET
  • C-xM-:C-xESCESC

然后使用 elisp 代码提示您:

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

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

M-x align-regexp RET foo RET

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