在emacs lisp中传递函数作为参数

时间:2012-03-06 16:56:16

标签: elisp

我不确定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 个答案:

答案 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-filerequire放入“.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)