我在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-mode
和LaTeX-mode
,latex-mode-hook
和LaTeX-mode-hook
是什么关系。Emacs新手,求帮助!
不要用你那个
在.emacs里面用
(load "setup-latex")
在 setup-latex.el
的末尾加上:
(provide 'setup-latex)
因为你想 require 的东西先要 provide。欲取先予嘛。
另外, LaTex-mode 是 latex-mode 的别名。C-h f RET LaTex-mode
看 LaTex-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这一章的内容,也许对你有帮组
解释的真清楚.