Emacs执行两次' c-mode-hook '



这是我的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]

这是一个特性还是一个bug ?没有其他钩子被执行多次。另外,现在我似乎无法切换钩子中的功能。

我观察变量c-mode-hook它的值是(ffy-c-mode-hook)

Emacs和CC-mode的版本为

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

Stacktrace on ffy-c-mode-hook

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()

根据我对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

最新更新