我有这个快捷键映射来刷新空行,如下所示:
(global-set-key (kbd "M-T") (lambda () (interactive) (flush-lines "^[[:space:]]*$")))
但这在一个地区不起作用。区域外的不相关行正在被合并。但是,当我选择一个区域并手动尝试M-x flush-lines ^[:space:]*$ RET时,它可以按预期工作。我做错了什么?
发布于 2019-03-07 17:57:45
函数可以交互调用,也可以非交互调用(这实际上有点复杂,但这是一个足够好的近似值)。交互式调用模式用于绑定来自当前环境的一些函数参数,或通过与用户交互。非交互模式是在Emacs Lisp中编写代码时的正常调用模式。
通常,交互行为是在文档字符串之后使用(interactive ...)
表单声明的,但在flush-lines
的特定情况下,该行为部分由interactive
规范自动执行,部分由(区域部分)硬编码。您可以通过调用called-interactively-p
来询问Emacs当前代码是否以交互方式执行,但正如文档所说,鼓励使用另一个可选参数来指示调用是否是交互的。
函数签名为:
(flush-lines REGEXP &optional RSTART REND INTERACTIVE)
RSTART
和REND
是当前区域的开始和结束位置,均为整数。它们也可以是nil
。最后一个参数表示呼叫是否是交互式的。
当您从匿名函数调用flush-lines
时,您将以非交互方式调用它,这意味着您需要显式地将参数传递给函数。
对于此函数,您可以简单地调用它,如下所示:
(flush-lines "^[[:space:]]*$" nil nil t)
这使得函数的行为如同-if以交互方式调用,在这种情况下,由于start和end参数为空,因此会自动计算区域。
在一般情况下,您需要做的是拥有自己的(interactive "r")
声明,并向匿名函数添加两个参数。例如,在*scratch*
缓冲区中,可以对此表达式求值:
(call-interactively
(lambda (beg end)
(interactive "r")
(list beg end)))
然后,结果是一个光标位置列表,表示您所在的区域。例如,在您的示例中,您可以调用(flush-lines "^[[:space:]]*$" beg end)
。
https://stackoverflow.com/questions/55037495
复制相似问题