如何将参数传递给 Elisp 函数?
How to pass arguments to Elisp function?
我有这个键盘映射来像这样刷新空行:
(global-set-key (kbd "M-T") (lambda () (interactive) (flush-lines "^[[:space:]]*$")))
但这不适用于一个地区。区域外的不相关线路正在合并。但是当我 select 一个区域并手动尝试 M-x flush-lines RET ^[[:space:]]*$ RET 时,它按预期工作。
我做错了什么?
可以交互式或非交互式地调用一个函数(这实际上有点复杂,但这是一个足够好的近似值)。交互式调用模式用于从当前环境绑定一些函数参数,或者通过与用户交互。非交互模式是你在 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)
这使得该函数的行为就像以交互方式调用一样,在这种情况下,由于开始和结束参数为零,因此会自动计算区域。
在一般情况下,您要做的是拥有自己的 (interactive "r")
声明,并向匿名函数添加两个参数。例如,在 *scratch*
缓冲区中,您可以评估此表达式:
(call-interactively
(lambda (beg end)
(interactive "r")
(list beg end)))
然后,结果是代表您所在地区的光标位置列表。
例如,在您的情况下,您会调用 (flush-lines "^[[:space:]]*$" beg end)
。
我有这个键盘映射来像这样刷新空行:
(global-set-key (kbd "M-T") (lambda () (interactive) (flush-lines "^[[:space:]]*$")))
但这不适用于一个地区。区域外的不相关线路正在合并。但是当我 select 一个区域并手动尝试 M-x flush-lines RET ^[[:space:]]*$ RET 时,它按预期工作。 我做错了什么?
可以交互式或非交互式地调用一个函数(这实际上有点复杂,但这是一个足够好的近似值)。交互式调用模式用于从当前环境绑定一些函数参数,或者通过与用户交互。非交互模式是你在 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)
这使得该函数的行为就像以交互方式调用一样,在这种情况下,由于开始和结束参数为零,因此会自动计算区域。
在一般情况下,您要做的是拥有自己的 (interactive "r")
声明,并向匿名函数添加两个参数。例如,在 *scratch*
缓冲区中,您可以评估此表达式:
(call-interactively
(lambda (beg end)
(interactive "r")
(list beg end)))
然后,结果是代表您所在地区的光标位置列表。
例如,在您的情况下,您会调用 (flush-lines "^[[:space:]]*$" beg end)
。