22.2.1 使用 interactive

本节介绍如何编写 interactive 形式,使 Lisp 函数成为可交互式调用的命令, 以及如何检查命令的 interactive 形式。

Special Form: interactive &optional arg-descriptor &rest modes

该特殊形式声明一个函数是命令,因此可以被交互式调用(通过 M-x 或输入绑定到它的按键序列)。 参数 arg-descriptor 声明命令在交互式调用时如何计算参数。

命令可以像其他函数一样从 Lisp 程序中调用, 但此时由调用者提供参数,arg-descriptor 不起作用。

interactive 形式必须位于函数体的顶层, 或在函数符号的 interactive-form 属性中(see 符号属性)。 它之所以有效,是因为命令循环在调用函数之前会查找它(see 交互式调用)。 一旦函数被调用,其所有体形式都会被执行; 此时,如果 interactive 形式出现在函数体内, 该形式仅返回 nil,甚至不计算其参数。

modes 列表用于指定命令适用于哪些模式。 关于指定 modes 的效果及使用时机,详见 为命令指定适用模式

按照惯例,应将 interactive 形式放在函数体中,作为第一个顶层形式。 如果符号的 interactive-form 属性和函数体中同时存在 interactive 形式, 前者优先级更高。 interactive-form 符号属性可用于为已有函数添加交互式形式, 或在不重新定义函数的情况下修改其交互式参数处理方式。

参数 arg-descriptor 有三种可能:

Function: interactive-form function

该函数返回 functioninteractive 形式。 如果 function 是可交互式调用的函数(see 交互式调用), 返回值是命令的 interactive 形式 (interactive spec), 它指定如何计算参数。否则返回 nil。 如果 function 是符号,则使用其函数定义。

当作用于 OClosure 时,工作会委托给泛型函数 oclosure-interactive-form

Function: oclosure-interactive-form function

interactive-form 类似,该函数接收命令并返回其交互式形式。 区别在于它是泛型函数,且仅在 function 是 OClosure 时被调用(see 开放式闭包)。 其目的是让某些 OClosure 类型可以动态计算它们的交互式形式, 而不是在某个槽位中保存它。

例如,该函数用于 kmacro 函数以减少内存占用, 因为它们共享同一个交互式形式。 它也用于 advice 函数,其中交互式形式从其组件的交互式形式计算而来, 从而使计算更惰性,并在某个组件被重新定义时正确调整交互式形式。


Footnotes

(17)

有些元素实际提供两个参数。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike