【发布时间】:2014-01-05 17:20:45
【问题描述】:
我为emacs-lisp-mode 开发了一些自定义扩展。这些扩展的入口点是通过函数my-elisp-mode-setup。这些扩展应该只在使用 Lisp 代码访问缓冲区时可用。我尝试了以下方法:
(add-hook 'emacs-lisp-mode-hook 'my-elisp-mode-setup)
然而事实证明,这个模式挂钩对任何文件类型都执行,这会导致与其他文件挂钩中的变量混淆..
为了调试这个案例,我将~/.emacs 缩减为以下内容:
(defun my-elisp-mode-setup ()
(message "kkkkk"))
(add-hook 'emacs-lisp-mode-hook 'my-elisp-mode-setup)
然后,我从命令行使用emacs t.txt 运行emacs(其中t.txt 是任何虚拟文件)。因此,对于这个特定文件 (t.txt),我不希望挂钩运行,因为 t.txt 不是 Lisp 文件。但是,在 *Messages* 缓冲区中,我得到:
kkkkk
For information about GNU Emacs and the GNU system, type C-h C-a.
表示钩子已经运行(由于kkkkk 文本)..
【问题讨论】:
-
这看起来很奇怪。我以这种方式设置了一些
elisp自定义设置,并且效果很好。如果您运行emacs -Q,然后在*scratch*中评估您的钩子,然后打开t.txt,会怎样?也许还可以检查您通过C-h m打开的t.txt启用了哪些模式。你运行的是什么版本的 Emacs? -
等等,
kkkkk是在您打开t.txt之前还是之后添加到*Messages*中的?您的*scratch*缓冲区将触发emacs-lisp-mode-hook,所以也许这就是它的来源? -
@Chris 我不确定.. 为什么
*scratch*触发emacs-lisp-mode-hook? -
默认情况下,
*scratch*使用lisp-interaction-mode,它派生自emacs-lisp-mode。