2012-08-11 54 views
1

我用這個命令啓動的emacsC++ - 模式鉤和c-模式掛機似乎運行兩次

$ emacs -Q c-mode-test.el 

然後我用C-XC-E給eval每一行

(require 'cc-mode) 

(add-hook 'c-mode-common-hook '(lambda() (print "hello"))) 

(add-hook 'c-mode-hook '(lambda() (print "hello c"))) 

(c-mode) 

在此之後,迷你緩衝區顯示

"hello" 

"hello c" 

"hello c" 
nil 

和C++ - 模式掛機運行一樣的

(add-hook 'c++-mode-hook '(lambda() (print "hello c++"))) 

(c++-mode) 

迷你緩衝區

"hello" 

"hello c++" 

"hello c++" 
nil 

爲什麼它運行兩次或有些不妥。

回答

0

看起來語言特定的鉤子不止一次運行。您可以通過運行(run-hooks c-mode-hook)(run-hooks c-mode-common-hook)來確認是這種情況,並且您會注意到您的print聲明只發生一次。

帶鉤子的一般建議是不依賴於它們運行的​​順序 - 而不取決於它們運行多少次似乎是自然延伸。

2

您正在爲「C」文件使用錯誤的掛鉤。正確的鉤子是「c-mode-hook」。

掛鉤「c-mode-common-hook」在每種c風格語言之前運行。也就是說,該鉤子運行於許多語言,如java,objective-c,awk和其他語言。你可以找到更多關於這些鉤子的信息here

1

有一個關於這個的錯誤報告http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16759我不認爲語言鉤子可以保證在多種語言模式下執行一次。我懷疑這個問題是由於使用define-derived-mode這是一個lisp宏來定義一個已經包含調用鉤子的模式,這意味着在模式中調用的鉤子將是一個額外的執行。

您可能想要嘗試初始化掛鉤。手冊上說:

變量:C-初始化鉤

鉤每運行Emacs會話中只有一次,當CC模式被初始化。這是在任何CC模式鍵盤映射中更改 鍵綁定(或添加新鍵盤)的好地方。請參閱 示例初始化文件。

它給人的樣品是在這裏:https://www.gnu.org/software/emacs/manual/html_node/ccmode/Sample-Init-File.html#Sample-Init-File