【问题标题】:How to load emacs-lisp-mode-hook only when visiting files with .el suffix仅在访问带有 .el 后缀的文件时如何加载 emacs-lisp-mode-hook
【发布时间】: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

标签: emacs elisp


【解决方案1】:

如果您只想为*.el 文件执行您的emacs-lisp-mode 东西,那么只需让您的东西测试buffer-file-name 以获得*.el 匹配。 IOW,my-elisp-mode-setup(可能更恰当地称为my-.el-file-setup)将是一个无操作,除非访问的文件的名称与您想要的任何模式(例如*.el)匹配。

【讨论】:

  • 谢谢!我会试试这个。顺便说一句,哪些文件首先触发了钩子emacs-lisp-mode-hook? (似乎emacs-lisp-mode 是为扩展名为.el 的文件运行的,但初始化文件~/.emacs 似乎也触发了该模式..)
  • 例如,对于某些模式,Emacs 似乎也会查看文件的内容,而不仅仅是文件扩展名。例如在sh-mode 用于编辑shell 脚本,即使文件名没有扩展名.sh,如果文件的第一行是#! /bin/sh,它仍然会输入sh-mode..
  • @HåkonHægland,是的,Emacs 支持按文件名或按内容启用模式。看看,例如,C-h v magic-mode-alist
  • 如果您以emacs -Q 开头,那么magic-mode-alist 就是()。您访问的任何位于emacs-lisp-mode 中的缓冲区都会调用emacs-lisp-mode-hook。您始终可以将debug 添加到该钩子中,以查看调用它的位置:(add-hook 'emacs-lisp-mode-hook 'debug)。或者您可以检查您如何启动 Emacs 以及您访问了哪些文件等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多