我不确定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))
答案 0 :(得分:4)
Emacs区分功能和命令 - 后者是一种特殊类型的功能,即可由用户以交互方式调用的功能。错误消息Wrong type argument: commandp, load-cenet-files
告诉您代码中的某些点是期望命令,但还有其他的东西。 commandp
是一个谓词函数,用于检查其参数是否为命令;在这里,它测试load-cenet-files
并发现它不是命令,因此被禁止。
您可以通过声明交互功能将某个功能转换为命令。您可以通过将(interactive)
声明添加为(defun function-name (args)
之后的第一行来完成此操作。请注意(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-file
和require
放入“.emacs”文件中?或者,如果您不希望全局加载文件,请将其附加到mode-specific hook?
答案 1 :(得分:3)
它需要一个交互式函数http://www.gnu.org/software/emacs/emacs-lisp-intro/html_node/Interactive.html#Interactive,它可能允许用户为您的函数输入参数。如果你不想要任何东西,这样的东西可能会起作用:
(defun load-cenet-files ()
(interactive)
(load-file "~/.emacs.d/cedet/common/cedet.elc")
(require 'semantic-gcc)
)
(global-set-key (kbd "C-c p") 'load-cenet-files)