我有一个这样刷新空行的键映射:
(global-set-key (kbd "M-T") (lambda () (interactive) (flush-lines "^[[:space:]]*$")))
但是这不适用于一片区域。超出该区域的无关行也会被合并。但是当我选择一个区域并手动尝试 M-x flush-lines RET ^[[:space:]]*$ RET 时,它按预期工作。
我做错了什么?
我有一个这样刷新空行的键映射:
(global-set-key (kbd "M-T") (lambda () (interactive) (flush-lines "^[[:space:]]*$")))
但是这不适用于一片区域。超出该区域的无关行也会被合并。但是当我选择一个区域并手动尝试 M-x flush-lines RET ^[[:space:]]*$ RET 时,它按预期工作。
我做错了什么?
(interactive ...)
形式在docstring之后声明交互行为,但在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)
(interactive "r")
声明,并向匿名函数添加两个参数。例如,在*scratch*
缓冲区中,您可以评估这个表达式:(call-interactively
(lambda (beg end)
(interactive "r")
(list beg end)))
(flush-lines "^[[:space:]]*$" beg end)
。
rstart
和rend
的部分在下面的if
中完成。我可能表达得不好,在写作时我关注的是 region 部分。 - coredumpRSTART
和REND
的nil
值意味着/做什么。你可能想要更新你的答案,以便更像你在评论中所说的那样。 (评论可以随时删除。问题和答案应足以让读者学习。) - Drew