【发布时间】:2010-09-27 14:16:52
【问题描述】:
Emacs Lisp 函数经常这样开始:
(lambda () (interactive) ...
“(交互式)”有什么作用?
【问题讨论】:
Emacs Lisp 函数经常这样开始:
(lambda () (interactive) ...
“(交互式)”有什么作用?
【问题讨论】:
this 澄清的“陷阱”之一是 interactive 的 参数 实际上是一种小型格式化语言(如 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
【讨论】:
此外,值得一提的是,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 可以让您在迷你缓冲区中输入两个数字,您仍然可以使用(sum 1 2)。
interactive 应该返回一个列表,如果函数以交互方式调用,该列表将用作参数列表。
【讨论】:
(interactive) 用于与用户交互的功能,无论是通过 M-x 还是通过键绑定。
M-x describe-function RET 交互式 RET 获取有关如何使用它的详细信息,包括捕获字符串、整数、缓冲区名称等的参数。
【讨论】:
只是为了澄清(它在引用的文档that Charlie cites 中)(interactive) 不仅适用于键绑定功能,还适用于任何功能。如果没有(interactive),它只能以编程方式调用,不能从M-x(或通过键绑定)调用。
编辑:请注意,仅将“(交互式)”添加到函数中也不一定会使其以这种方式工作 - 函数不具有交互性的原因可能有很多。范围、依赖关系、参数等。
【讨论】:
我的意思是您包含一些代码,用于在绑定到键时使函数可调用 - 例如从 CTRL-u 获取参数。
详情请查看CTRL-h f interactive:
【讨论】: