在Emacs Lisp中将函数作为参数传递

3

我不确定 Emacs Lisp 如何处理函数对象,在这里是否存在一个隐藏的参数,当我执行 C-c p 后出现以下错误:Wrong type argument: commandp, load-cenet-files

我完全不了解 Lisp。

(defun load-cenet-files ()
  (load-file "~/.emacs.d/cedet/common/cedet.elc")
  (require 'semantic-gcc)
)

(global-set-key (kbd "C-c p") '(load-cenet-files)) 
2个回答

5
Emacs区分函数命令——后者是一种特殊类型的函数,即可以由用户交互调用的函数。错误消息Wrong type argument: commandp, load-cenet-files告诉您代码中某个地方期望一个命令,但得到了其他内容。 commandp是一个谓词函数,检查其参数是否为命令;在此处,它测试了load-cenet-files并发现它不是一个命令,因此出错了。
您可以通过声明为交互式将函数转换为命令。您可以在(defun function-name (args)之后添加(interactive)声明作为第一行来实现这一点。请注意,(interactive)是一种特殊的构造,它不是真正的函数调用,而是一个声明。
(defun load-cenet-files ()
  (interactive)
  (load-file "~/.emacs.d/cedet/common/cedet.elc")
  (require 'semantic-gcc)
)

一旦将函数转换为命令,您就可以通过M-x function-name调用它。此外,如果要将函数绑定到键盘快捷方式,则必须是命令。后者正是您看到该错误消息的原因:您已将load-cenet-files函数绑定到C-c p,但它是一个函数,而不是一个命令。一旦插入(interactive),就应该没问题了。
最后,似乎您试图将此功能绑定到键盘快捷方式有些不寻常。您不能只将load-filerequire放入您的“.emacs”文件中吗?或者,如果您不希望文件在全局范围内加载,请将其附加到特定于模式的钩子

非常感谢,如果我有声望的话,我一定会给你点赞,因为这是一个深思熟虑且信息详尽的答案。我想将其绑定到键盘快捷键的原因是,cedet需要很长时间才能加载,而我喜欢 Emacs 的一件事情就是可以在短时间内打开它来查看和编辑文件,不像大型图形化 IDE。我可以添加一个 hook,我之前用过这个方法,但我不希望在仅查看文件时加载它。我希望将其保留以供进行严肃编码时使用。 - vanjoe

3

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