0

我想将customize-option某个变量绑定到一个键,因为我需要经常更改它。我有两个选择:

(global-set-key (kbd "<f12>") '(lambda() (interactive) (customize-option 'my-variable) ) )
(global-set-key (kbd "<f12>") '(customize-option 'my-variable )

第一个有效,第二个无效,因为commandp抱怨这customize-option不是命令。为什么?据我所知,customize-option是一个交互功能,所以commandp应该是t

custom-option 是一个交互式编译的 Lisp 函数。

它是必然的。

(自定义选项符号)

自定义 SYMBOL,它必须是用户选项变量。

4

2 回答 2

3

的第二个参数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形式本身就是一个有效的函数),但第二个不是,它被赋予了一个既不能被调用也不能满足要求的双元素列表被标记为“交互式”。

于 2012-09-17T16:15:25.140 回答
3

(customize-option 'my-variable)是不是命令的形式。您不能绑定到任意引用的形式,就像您不能绑定到文字字符串或未绑定的符号一样。其中一些对绑定很有用,但解决这些限制并不难。如果您觉得难以忍受,请编写一个宏。(俗话说,现在你有两个问题。)

于 2012-09-17T13:39:05.007 回答