【问题标题】:What does (interactive) mean in an Emacs Lisp function?Emacs Lisp 函数中的(交互式)是什么意思?
【发布时间】:2010-09-27 14:16:52
【问题描述】:

Emacs Lisp 函数经常这样开始:

(lambda () (interactive) ...

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

【问题讨论】:

    标签: emacs lisp


    【解决方案1】:

    this 澄清的“陷阱”之一是 interactive 的 参数 实际上是一种小型格式化语言(如 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
    

    【讨论】:

      【解决方案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 应该返回一个列表,如果函数以交互方式调用,该列表将用作参数列表。

      【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          详情请查看CTRL-h f interactive:

          交互式是“C 源代码”中的一种特殊形式。 (交互式参数) 指定解析参数以交互使用函数的方式。 例如,写 (defun foo (arg) "Doc string" (interactive "p") ...使用 arg...) 当 `foo' 作为命令调用时,使 ARG 成为前缀参数。 对“interactive”的“调用”实际上是一个声明而不是一个函数; 它告诉“交互式调用”如何读取参数 传递给函数。 当实际调用时,`interactive' 只返回 nil。 `interactive' 的参数通常是一个包含代码字母的字符串 接着是提示。 (有些代码字母不使用 I/O 来获取 参数,不需要提示。)提示多个参数, 给出一个代码字母、它的提示符、换行符和另一个代码字母等。 提示被传递给格式,并且可以使用 % 转义来打印 已经读过的论据。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-08-12
            • 1970-01-01
            • 1970-01-01
            • 2020-05-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多