2012-03-06 64 views
3

我不確定究竟是如何的Emacs Lisp對待函數對象,就是那裏,我沒有看到一個隱藏的說法,當我有這個,然後我打C-c p它給人的錯誤 Wrong type argument: commandp, load-cenet-files傳遞函數爲在Emacs參數口齒不清

我根本不知道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)) 

回答

4

的Emacs 功能命令區別 - 後者是一種特殊類型的函數,即那些可以通過調用交互用戶。錯誤消息Wrong type argument: commandp, load-cenet-files告訴你,代碼中的某些點需要一個命令,但有其他的東西。 commandp是一個謂詞函數,用於檢查它的參數是否是一個命令;在這裏,它測試了load-cenet-files,發現它不是一個命令,因此barfed。

您可以通過聲明交互來將函數轉換爲命令。您可以通過將(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

+0

非常感謝,如果我有代表,我肯定會爲您提供深思熟慮和翔實的答案。我想將它綁定到鍵盤快捷方式的原因是cedet需要很長時間才能加載,而我喜歡emacs的其中一個功能是能夠立即打開它來查看和編輯文件,這與大圖形IDE的。我可以添加一個鉤子,我正在使用這個,但是當我只想查看一個文件時,我不想加載它。我想保留它,因爲當我要進行嚴肅的編碼時。 – vanjoe 2012-03-07 04:54:15