Emacs Lisp 函数通常这样开始:
(lambda () (interactive) ...
“(交互式)”有什么作用?
只是为了澄清(查理引用的引用文档中)(interactive)
不仅适用于键绑定功能,而且适用于任何功能。没有(interactive)
,它只能以编程方式调用,不能从M-x
(或通过键绑定)调用。
编辑:请注意,仅将“(交互式)”添加到函数中也不一定会使其以这种方式工作 - 函数不是交互式的可能有很多原因。范围,依赖关系,参数等。
我的意思是您包含一些代码,用于在绑定到键时使函数可调用 - 例如从 CTRL-u 获取参数。
看看CTRL-h f interactive
详情:
交互式是“C 源代码”中的一种特殊形式。 (交互式参数) 指定解析参数以交互使用函数的方式。 例如,写 (defun foo (arg) "Doc string" (interactive "p") ...使用 arg...) 当 `foo' 作为命令调用时,使 ARG 成为前缀参数。 对“interactive”的“调用”实际上是一个声明而不是一个函数; 它告诉“交互式调用”如何读取参数 传递给函数。 当实际调用时,`interactive' 只返回 nil。 `interactive' 的参数通常是一个包含代码字母的字符串 接着是提示。(有些代码字母不使用 I/O 来获取 参数,不需要提示。)提示多个参数, 给出一个代码字母、它的提示符、换行符和另一个代码字母等。 提示被传递给格式,并且可以使用 % 转义来打印 已经读过的论据。
此外值得一提的是,它interactive
的主要目的是在交互式上下文中(例如,当用户使用键绑定调用函数时),让用户指定函数参数,否则只能以编程方式给出。
例如,考虑函数sum
返回两个数字的总和。
(defun sum (a b)
(+ a b))
你可以调用它,(sum 1 2)
但你只能在 Lisp 程序(或 REPL)中调用它。如果您interactive
在函数中使用特殊形式,则可以向用户询问参数。
(defun sum (a b)
(interactive
(list
(read-number "First num: ")
(read-number "Second num: ")))
(+ a b))
现在M-x sum
将让您在 minibuffer 中键入两个数字,您仍然可以这样做(sum 1 2)
。
interactive
如果函数以交互方式调用,则应返回一个列表,该列表将用作参数列表。
(interactive) 用于与用户交互的功能,无论是通过 Mx 还是通过键绑定。
Mx describe-function RET 交互式 RET 获取有关如何使用它的详细信息,包括捕获字符串、整数、缓冲区名称等的参数。
这澄清的一个“陷阱”是,参数interactive
实际上是一种小型格式化语言(如 for )printf
,它指定以下内容(用于周围函数的输入):
例如,
'r'
点和标记,作为两个数字参数,最小的在前。
意味着interactive
-annotated 函数恰好需要两个参数。例如,这将起作用
(defun show-mark (start stop)
(interactive "r")
(print start)
(print stop))
这将打破:
(defun show-mark (start)
(interactive "r")
(print start))
Wrong number of arguments: ((t) (start) (interactive "r") (print start)), 2