首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将参数传递给Elisp函数?

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

Stack Overflow用户
提问于 2019-03-07 14:36:43
回答 1查看 835关注 0票数 2

我有这个快捷键映射来刷新空行,如下所示:

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

但这在一个地区不起作用。区域外的不相关行正在被合并。但是,当我选择一个区域并手动尝试M-x flush-lines ^[:space:]*$ RET时,它可以按预期工作。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-07 17:57:45

函数可以交互调用,也可以非交互调用(这实际上有点复杂,但这是一个足够好的近似值)。交互式调用模式用于绑定来自当前环境的一些函数参数,或通过与用户交互。非交互模式是在Emacs Lisp中编写代码时的正常调用模式。

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

函数签名为:

(flush-lines REGEXP &optional RSTART REND INTERACTIVE)

RSTARTREND是当前区域的开始和结束位置,均为整数。它们也可以是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)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55037495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档