32

Emacs Lisp 函数通常这样开始:

(lambda () (interactive) ...

“(交互式)”有什么作用?

4

5 回答 5

28

只是为了澄清(查理引用的引用文档中(interactive)不仅适用于键绑定功能,而且适用于任何功能。没有(interactive),它只能以编程方式调用,不能从M-x(或通过键绑定)调用。

编辑:请注意,仅将“(交互式)”添加到函数中也不一定会使其以这种方式工作 - 函数不是交互式的可能有很多原因。范围,依赖关系,参数等。

于 2008-12-18T20:38:51.947 回答
19

我的意思是您包含一些代码,用于在绑定到键时使函数可调用 - 例如从 CTRL-u 获取参数。

看看CTRL-h f interactive详情:

    交互式是“C 源代码”中的一种特殊形式。
    (交互式参数)

    指定解析参数以交互使用函数的方式。
    例如,写
      (defun foo (arg) "Doc string" (interactive "p") ...使用 arg...)
    当 `foo' 作为命令调用时,使 ARG 成为前缀参数。
    对“interactive”的“调用”实际上是一个声明而不是一个函数;
     它告诉“交互式调用”如何读取参数
     传递给函数。
    当实际调用时,`interactive' 只返回 nil。

    `interactive' 的参数通常是一个包含代码字母的字符串
     接着是提示。(有些代码字母不使用 I/O 来获取
     参数,不需要提示。)提示多个参数,
     给出一个代码字母、它的提示符、换行符和另一个代码字母等。
     提示被传递给格式,并且可以使用 % 转义来打印
     已经读过的论据。
于 2008-12-18T19:40:10.070 回答
14

此外值得一提的是,它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如果函数以交互方式调用,则应返回一个列表,该列表将用作参数列表。

于 2009-04-17T14:53:24.493 回答
4

(interactive) 用于与用户交互的功能,无论是通过 Mx 还是通过键绑定。

Mx describe-function RET 交互式 RET 获取有关如何使用它的详细信息,包括捕获字符串、整数、缓冲区名称等的参数。

于 2012-03-17T15:42:58.090 回答
1

澄清的一个“陷阱”是,参数interactive实际上是一种小型格式化语言(如 for )printf,它指定以下内容(用于周围函数的输入):

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

例如,

'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
于 2021-04-09T20:55:30.303 回答