我使用此命令启动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
为什么它会运行两次或出错。
答案 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
语句只发生一次。
关于钩子的一般建议是不依赖于它们运行的顺序 - 不依赖于它们运行的次数似乎是那里的自然延伸。