c ++ - mode-hook和c-mode-hook似乎运行了两次

时间:2012-08-11 01:58:51

标签: emacs elisp cc-mode

我使用此命令启动emacs

$ emacs -Q c-mode-test.el

然后我使用C-xC-e来评估每一行

(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 ++ - mode-hook运行相同的

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

(c++-mode)

迷你缓冲区

"hello"

"hello c++"

"hello c++"
nil

为什么它会运行两次或出错。

3 个答案:

答案 0 :(得分:2)

您正在使用错误的挂钩来处理“C”文件。正确使用的钩子是“c-mode-hook”。

钩子“c-mode-common-hook”在每种c风格的语言之前运行。也就是说,钩子可以运行多种语言,例如java,objective-c,awk等。您可以找到有关这些挂钩的更多信息here

答案 1 :(得分:1)

有关于此http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16759的错误报告我不认为语言挂钩可以保证在多种语言模式下执行一次。我怀疑这个问题是由于使用define-derived-mode这是一个lisp宏来定义已经包含对钩子的调用的模式,这意味着在模式中调用的钩子将是一个额外的执行。

您可能想尝试初始化挂钩。手册说:

  

变量:c-initialization-hook

     

当CC模式初始化时,每个Emacs会话只运行一次钩子。这是一个改变的好地方   任何CC模式键映射中的键绑定(或添加新键)。看到   样本初始化文件。

它提供的样本在这里:https://www.gnu.org/software/emacs/manual/html_node/ccmode/Sample-Init-File.html#Sample-Init-File

答案 2 :(得分:0)

似乎语言特定的钩子不止一次运行。您可以通过运行(run-hooks c-mode-hook)(run-hooks c-mode-common-hook)来确认是这种情况,并且您会注意到您的print语句只发生一次。

关于钩子的一般建议是不依赖于它们运行的​​顺序 - 不依赖于它们运行的​​次数似乎是那里的自然延伸。