2012-08-11 49 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