3.4 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 传递前缀参数的值(如果有的话)和字符。

在这种情况下,函数定义如下,其中 argchar 是由 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 参考手册, 提供有关这一技术的更完整解释。