繁体   English   中英

如何将参数传递给Elisp函数?

[英]How to pass arguments to Elisp function?

我有这个键盘映射来刷新像这样的空行:

(global-set-key (kbd "M-T") (lambda () (interactive) (flush-lines "^[[:space:]]*$")))

但这在某个地区不起作用。 区域之外无关的行将被合并。 但是,当我选择一个区域并手动尝试使用Mx刷新线RET ^ [[:space:]] * $ RET时,它可以按预期工作。 我究竟做错了什么 ?

可以交互式或非交互式地调用一个函数(实际上稍微复杂一点,但这足够好了)。 交互式调用模式用于绑定当前环境中的某些函数自变量或与用户进行交互。 当您使用Emacs Lisp编写时,非交互模式是正常的调用模式。

通常,交互式行为是在文档字符串之后使用(interactive ...)形式声明的,但是在flush-lines的特定情况下,该行为部分由interactive规范自动实现,并且部分由硬编码(对于区域部分)组成。 您可以通过调用call called-interactively-p来询问Emacs当前代码是否以交互方式执行,但是正如文档所说,鼓励使用另一个可选参数来指示调用是否是交互式的。

函数签名为:

(flush-lines REGEXP &optional RSTART REND INTERACTIVE)

RSTARTREND是当前区域的开始和结束位置,以整数表示。 他们也可以是nil 最后一个参数指示呼叫是否是交互式的。

当您从匿名函数调用flush-lines ,您是在非交互方式下调用它,这意味着您需要将参数显式传递给函数。

对于此功能,您可以简单地按如下方式调用它:

(flush-lines "^[[:space:]]*$" nil nil t)

这使得该函数的行为就像是被交互调用一样,在这种情况下,由于start和end参数为nil,因此会自动计算区域。

在一般情况下,您要做的是拥有自己的(interactive "r")声明,并向匿名函数添加两个参数。 例如,在*scratch*缓冲区中,您可以对以下表达式求值:

(call-interactively
  (lambda (beg end)
    (interactive "r")
    (list beg end)))

然后,结果是代表您所在地区的光标位置列表。 例如,在您的情况下,您将调用(flush-lines "^[[:space:]]*$" beg end)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM