emacs里面hook的问题

我在init.el里面写了一句:

(add-hook 'latex-mode-hook
               (lambda ()
                 (require 'setup-latex)))

然后setup-latex.el里面写了一些设置:

(add-hook 'LaTeX-mode-hook 'auto-fill-mode)
(add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)
(add-hook 'LaTeX-mode-hook 'flyspell-mode)
(add-hook 'LaTeX-mode-hook 'turn-on-reftex)
...

问题就是:第一次打开.tex文件的时候setup-latex.el里面那些配置没有生效,要关闭文件再重新打开文件(即第二次及以后打开文件)才会生效。我的理解就是,add-hook的时候如果对应的mode应该打开了的话这些hook就不会生效了?要下次打开这个mode才有效?

当然,如果把setup-latex.el里面的配置直接复制到init.el代替里面的lambda当然是没有问题的。但我不想emacs启动的时候就eval这些配置。

另外,我想问一下latex-modeLaTeX-modelatex-mode-hookLaTeX-mode-hook是什么关系。Emacs新手,求帮助!

阅读 8.2k
4 个回答

不要用你那个

在.emacs里面用

(load "setup-latex")

setup-latex.el 的末尾加上:

(provide 'setup-latex)

因为你想 require 的东西先要 provide。欲取先予嘛。

另外, LaTex-mode 是 latex-mode 的别名。
C-h f RET LaTex-modeLaTex-mode 的帮助,
可以看到

LaTeX-mode is an alias for `latex-mode' in `tex-mode.el'.

进入Latex-mode后之所以会执行latex-mode-hook里的函数,是由于latex-mode这个命令中有类似于(run-mode-hooks 'latex-mode-hook)这样一行代码. 这行代码的作用就是依次调用latex-mode-hook中所定义的函数. 当第一次执行latex-mode命令的时候,latex-mode-hook的值还只是'((lambda ()(require 'setup-latex)))而已,只有当run-mode-hooks函数执行完后,latex-mode-hook的值才会变成'((lambda ()(require 'setup-latex)) auto-fill-mode LaTeX-math-mode flyspell-mode turn-on-reftex).

但是可惜在latex-mode后面的代码中没有地方再调用run-mode-hooks这个函数,因此也就不会再调用新加入latex-mode-hook中的函数了.

当你第二次打开文件时,会再一次执行latex-mode这个命令,也就再一次调用了run-mode-hooks这个函数.这一次latex-mode-hook的值已经变为了'((lambda ()(require 'setup-latex)) auto-fill-mode LaTeX-math-mode flyspell-mode turn-on-reftex),因此后面的那些mode也就被启用了.

你可以看一下info::elisp#Mode Hooks这一章的内容,也许对你有帮组

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进