将lambda绑定到键时出现“错误类型参数:commandp”错误

100
我在这里收到一个"Wrong type argument: commandp, (lambda nil (forward-line 5))"的错误提示。
(global-set-key [?\M-n] (lambda () (forward-line 5)))

错误是什么?我相当确定它很简单,但我可能错过了一些明显的东西。


你缺少一个右括号。可能不是在你的代码中,而是在问题中。 - agentofuser
顺便提一下:当您像那样引用匿名函数时,它不会被编译。虽然在您的情况下这可能并不重要。 - Phil Jackson
3个回答

146

global-set-key 期望一个交互式命令。(lambda () (interactive) (forward-line 5)) 应该可以工作。

顺便说一下,C-h f commandp 是解决这类错误的很好的起点。


我认为没有任何缺点。从文档中可以看出:
对‘交互’进行的“调用”实际上是一个声明而不是函数;它告诉‘call-interactively’如何读取传递给函数的参数。当实际调用时,‘interactive’只返回nil。
- Dangelov
2
根据(commandp)文档,具有顶层调用(interactive)的lambda函数可以工作,但我如何定义一个使用(defun)的函数呢? - peterhil

41

正确的形式应该是这样的 -

(global-set-key (kbd "M-n") (lambda () (interactive) (forward-line 5)))
问题在于你忘记加上 (interactive) (就像 brendan 提到的那样)。
顺便说一下,你会注意到我使用了 (kbd) 函数来指定按键绑定。该函数非常有用,因为你几乎可以将按键绑定文字直接复制进去。

2

我也在一台新机器上遇到过这个错误,我使用了我的通常的 .emacs 文件但尚未安装我的包,并且要执行的命令在其中一个包中。(因为不能执行的命令肯定不是交互式的!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接