Emacs Lisp函数通常以这样的方式开始:
(lambda () (interactive) ...
“(互动)”做什么?
答案 0 :(得分:24)
只是为了澄清(它在引用的文档that Charlie cites中)(interactive)
不仅适用于键绑定函数,而且适用于任何函数。没有(interactive)
,它只能以编程方式调用,而不能从M-x
(或通过键绑定)调用。
编辑:请注意,只是将“(interactive)”添加到函数中并不一定会使它以这种方式工作 - 可能有很多原因,函数不是交互式的。范围,依赖关系,参数等。
答案 1 :(得分:19)
我的意思是你包含一些代码,用于在绑定到键时使函数可调用所需的东西 - 比如从CTRL-u获取参数。
详情请查看CTRL-h f interactive
:
interactive is a special form in `C source code'. (interactive args) Specify a way of parsing arguments for interactive use of a function. For example, write (defun foo (arg) "Doc string" (interactive "p") ...use arg...) to make ARG be the prefix argument when `foo' is called as a command. The "call" to `interactive' is actually a declaration rather than a function; it tells `call-interactively' how to read arguments to pass to the function. When actually called, `interactive' just returns nil. The argument of `interactive' is usually a string containing a code letter followed by a prompt. (Some code letters do not use I/O to get the argument and do not need prompts.) To prompt for multiple arguments, give a code letter, its prompt, a newline, and another code letter, etc. Prompts are passed to format, and may use % escapes to print the arguments that have already been read.
答案 2 :(得分:12)
值得一提的是,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
应该返回一个列表,该列表将用作参数列表。
答案 3 :(得分:3)
(交互式)用于与用户交互的功能,无论是通过M-x还是通过键绑定。
M-x describe-function RET interactive RET有关如何使用它的详细信息,包括用于捕获字符串,整数,缓冲区名称等的参数。
答案 4 :(得分:1)
this 澄清的其中一个“问题”是,interactive
的参数实际上是一种小型格式化语言(例如 printf
) 指定以下内容(对于周围函数的输入):
例如
<块引用>'r'
点和标记,作为两个数字参数,最小的在前。
表示 interactive
注释的函数正好需要两个参数。
例如这会起作用
(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