interactive
的不同选项在例子中,multiply-by-seven
使用 "p"
作为interactive
的参数。这个参数告诉 Emacs 解释你的输入,无论是 C-u 后跟一个数字还是 META 后跟一个数字,都是将该数字作为参数传递给函数。Emacs 预定义了超过二十个字符,可以用于 interactive
。在几乎所有情况下,这些选项之一将使你能够以交互方式向函数传递正确的信息。(See interactive
代码章节 in GNU Emacs Lisp 参考手册.)
考虑函数 zap-to-char
。它的交互表达式为
(interactive "p\ncZap to char: ")
interactive
的参数的第一部分是 ‘p’,这是你已经熟悉的。这个参数告诉 Emacs 解释一个前缀,作为传递给函数的数字。你可以通过键入 C-u 后跟一个数字或者键入 META 后跟一个数字来指定前缀。前缀是指定的字符数。因此,如果你的前缀是三,指定的字符是‘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 函数 copy-to-buffer
的定义, 提供一个例子。)
当函数不接受参数时,interactive
不需要任何参数。这样的函数包含简单的表达式 (interactive)
。mark-whole-buffer
函数就是这样的一个例子。
或者,如果特殊的字母代码不适合你的应用程序,你可以将自己的参数作为列表传递给 interactive
。
See 函数 append-to-buffer
的定义, 提供一个例子。See 使用 Interactive
in GNU Emacs Lisp 参考手册, 提供有关这一技术的更完整解释。