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 传递前缀参数
(若存在)和指定字符。
在这种情况下,函数定义形如下面的示例,其中 arg 和 char
是 interactive 用于绑定前缀参数和指定字符的符号:
(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,可获取该用法的更完整说明。