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-modejs-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-hookjs-mode-hook 在打开 JavaScript 文件时被识别并在启动时运行。

但是,手动切换到 JavaScript 时,仅运行 js-mode-hookjs-modejavascript-mode 模式都触发 JavaScript 模式(至少它们在状态行中显示为 (JavaScript)),所以有人厌倦了输入“avacript”字母并将它们踢出“javascript”但是忘记收拾烂摊子了……

【讨论】:

以上是关于emacs:手动切换模式时绕过模式挂钩的主要内容,如果未能解决你的问题,请参考以下文章

11.Emacs进阶之艺术家模式

如何在Emacs组织模式中插入包含日期和时间的计划

HA模式手动切换namenode状态

如何定义键绑定以在 emacs 中的次要模式之间切换?

ircut手动模式是

.emacs .txt 文件视觉线模式与缪斯模式同时