3.4 interactive 的不同选项

在示例中,multiply-by-seven 使用 "p" 作为 interactive 的参数。该参数告知 Emacs 将你输入的 C-u 后接数字,或是 META 后接数字,解析为将该数字 作为参数传递给函数的指令。Emacs 内置了二十多个可用于 interactive 的字符。几乎在所有场景下,这些选项中的某一个 都能让你以交互方式向函数传递正确的信息。(See Code Characters for interactive in The GNU Emacs Lisp Reference Manual.)

以函数 zap-to-char 为例。其交互表达式为

(interactive "p\ncZap to char: ")

interactive 参数的第一部分是你已经熟悉的 ‘p’。 该参数告知 Emacs 将前缀参数解析为数字并传递给函数。 你可以通过输入 C-u 后接数字,或是输入 META 后接数字 来指定前缀参数。该前缀参数代表指定字符的个数。因此,若前缀参数为 3, 指定字符为 ‘x’,则会删除从当前位置到下第三个 ‘x’(含) 之间的所有文本。若未设置前缀参数,则删除从当前位置到指定字符(含) 之间的文本,不再多删。

c’ 用于告知函数需要删除到哪个字符。

更规范地说,带有两个及以上参数的函数,可以通过在 interactive 后的字符串中追加片段,为每个参数传递信息。这样做时,信息会按照 interactive 列表中的顺序依次传递给各个参数。在字符串中, 每个片段使用 ‘\n’(换行符)分隔。例如,你可以在 ‘p’ 后接 ‘\n’ 和 ‘cZap to char: ’。这会让 Emacs 传递前缀参数 (若存在)和指定字符。

在这种情况下,函数定义形如下面的示例,其中 argcharinteractive 用于绑定前缀参数和指定字符的符号:

(defun name-of-function (arg char)
  "documentation..."
  (interactive "p\ncZap to char: ")
  body-of-function...)

(提示符中冒号后的空格会让提示显示更美观。 See The Definition of copy-to-buffer,可查看示例。)

当函数不需要参数时,interactive 也无需参数。 这类函数只需要简单的表达式 (interactive)mark-whole-buffer 就是这样的函数。

另外,如果专用字符码不适合你的使用场景,你也可以以列表形式 为 interactive 传递自定义参数。

See The Definition of append-to-buffer, 可查看示例。See Using Interactive in The GNU Emacs Lisp Reference Manual,可获取该用法的更完整说明。