emacs:手动切换模式时绕过模式挂钩
Posted
技术标签:
【中文标题】emacs:手动切换模式时绕过模式挂钩【英文标题】:emacs: mode hook is bypassed when mode is switched by hand 【发布时间】:2020-04-01 14:33:17 【问题描述】:在我的.emacs
中有以下模式挂钩:
(defun my-html-mode-hook ()
(interactive)
(setq tab-width 4
;; this will make sure TABs are used instead of spaces
indent-tabs-mode t)
)
(defun my-javascript-mode-hook ()
(interactive)
(setq tab-width 4
;; this will make sure TABs are used instead of spaces
indent-tabs-mode t)
)
(add-hook 'javascript-mode-hook 'my-javascript-mode-hook)
(add-hook 'html-mode-hook 'my-html-mode-hook)
现在,当我打开 .html
时,它会按预期工作,打开 .js
时也是如此。
但是,当打开.html
,然后手动通过M-x javascript-mode
切换到JavaScript 时,my-javascript-mode-hook
是不运行的(至少标签宽度切换到8)。当我手动切换模式时如何使该钩子运行?
【问题讨论】:
【参考方案1】:恐怕没有javascript-mode-hook
。当然不是默认的。
javascript-mode
是js-mode
的别名,这意味着只定义了js-mode-hook
。然而,变量别名也是一回事——我建议你M-x report-emacs-bug
并询问javascript-mode-hook
是否可以定义为js-mode-hook
的变量别名。只要defvaralias
是自动加载的(连同模式的别名,因此在您使用它之前),我相信它会按预期工作。
因此,正如我所料,在打开.js
文件的情况下,我无法重现/确认您关于javascript-mode-hook
“按预期工作”的断言。您的代码在 Emacs 26.3 或 27.0.90 中都不是这样。
【讨论】:
【参考方案2】:命名似乎存在可怕的歧义,即 javascript-mode-hook
和 js-mode-hook
在打开 JavaScript 文件时被识别并在启动时运行。
但是,手动切换到 JavaScript 时,仅运行 js-mode-hook
。 js-mode
和 javascript-mode
模式都触发 JavaScript
模式(至少它们在状态行中显示为 (JavaScript)
),所以有人厌倦了输入“avacript”字母并将它们踢出“javascript”但是忘记收拾烂摊子了……
【讨论】:
以上是关于emacs:手动切换模式时绕过模式挂钩的主要内容,如果未能解决你的问题,请参考以下文章