(交互式)在Emacs Lisp函数中意味着什么?

时间:2008-12-18 19:34:54

标签: emacs lisp

Emacs Lisp函数通常以这样的方式开始:

(lambda () (interactive) ...

“(互动)”做什么?

5 个答案:

答案 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 ) 指定以下内容(对于周围函数的输入):

  1. 模式(参数的数量及其类型)
  2. 来源(例如,缓冲区中的标记区域和/或用户输入等)

例如

<块引用>

'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