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