Emacs执行两次“c-mode-hook”

时间:2015-08-31 18:31:29

标签: c emacs

这是我的emacs配置

(require 'cc-mode)

(defun ffy-c-mode-hook ()
  "This is settings for the C/C++ mode"
  (message "ffy-c-mode-hook executed")
  (electric-pair-mode +1)
  (electric-indent-local-mode +1)
  (if electric-indent-mode
      (let ((binding (key-binding (kbd "RET"))))
        (local-set-key (kbd "RET") (key-binding (kbd "C-j")))
        (local-set-key (kbd "C-j") binding)))
  (c-toggle-hungry-state +1)
  (c-set-style "gnu")
  (setq c-basic-offset 4))

(add-hook 'c-mode-hook #'ffy-c-mode-hook)

显然c-mode-hook执行了两次,因为当我打开一个C文件时,我看到:

user-error: Beginning of history; no preceding item
ffy-c-mode-hook executed [2 times]

是功能还是错误?没有其他钩子被多次执行AFAIK。而且似乎现在我无法在钩子中切换功能。

我查看了变量c-mode-hook,其值为(ffy-c-mode-hook)

Emacs和CC模式的版本是

GNU Emacs 24.5.1 (i686-pc-mingw32) of 2015-04-11 on LEG570
Using CC Mode version 5.32.5

ffy-c-mode-hook上的Stacktrace

ffy-c-mode-hook()
run-hooks(change-major-mode-after-body-hook prog-mode-hook c-mode-common-hook c-mode-hook c-mode-hook)
apply(run-hooks (change-major-mode-after-body-hook prog-mode-hook c-mode-common-hook c-mode-hook c-mode-hook))
run-mode-hooks(c-mode-hook)
c-mode()
set-auto-mode-0(c-mode nil)
set-auto-mode()

1 个答案:

答案 0 :(得分:2)

根据我对错误报告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