的第二个参数global-set-key
必须是命令定义,通常是命名交互函数的符号。交互式函数是一个以(interactive)
表单开头的函数。例如:
(defun delete-to-end ()
"Delete text from point to the end of buffer."
(interactive)
(delete-region (point) (point-max)))
这定义了一个交互函数并将其分配给符号delete-to-end
。之后,delete-to-end
是一个可以传递给的有效命令global-set-key
:
(global-set-key [f12] 'delete-to-end)
如果没有该(interactive)
行,delete-to-end
仍然会命名一个可从 Lisp 程序调用的函数,但它不会是“命令”。由于它被标记为交互式,因此(commandp 'delete-to-end)
返回 true,并且M-x delete-to-end可以正常工作。
交互函数不需要绑定到符号,它们可以是匿名的。与任何其他匿名函数一样,它们是使用lambda
表单创建的,除了命令还必须包含(interactive)
. 匿名命令可以作为第二个参数传递给 ,global-set-key
而无需将它们分配给符号,因此以下定义等效于上述定义:
(global-set-key [f12]
(lambda ()
"Delete text from point to the end of buffer."
(interactive)
(delete-region (point) (point-max))))
...除了它的可读性稍差,用C-h c
or检查时看起来更丑C-h k。
在您的情况下,第一次调用global-set-key
被赋予了一个有效的命令(引用的lambda
形式本身就是一个有效的函数),但第二个不是,它被赋予了一个既不能被调用也不能满足要求的双元素列表被标记为“交互式”。