这是我的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()
答案 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