我正在研究 Emacs 次要模式,并且我希望它仅在主要模式是某种模式(即js-mode
)时应用。换句话说,当我激活 my-super-mode 时,我希望它定义的键映射在所有 JS 缓冲区中都可用(就像它是全局的)但不影响非 js 缓冲区。
我知道可以通过钩子实现,但我想避免这种解决方案。理想情况下,我的次要模式仅在需要时通过 Mx 激活(激活后它应该在所有 JS 缓冲区中生效)。可能的?
我正在研究 Emacs 次要模式,并且我希望它仅在主要模式是某种模式(即js-mode
)时应用。换句话说,当我激活 my-super-mode 时,我希望它定义的键映射在所有 JS 缓冲区中都可用(就像它是全局的)但不影响非 js 缓冲区。
我知道可以通过钩子实现,但我想避免这种解决方案。理想情况下,我的次要模式仅在需要时通过 Mx 激活(激活后它应该在所有 JS 缓冲区中生效)。可能的?
想到的一种解决方案是定义实现实际功能的缓冲区本地次要模式,但不由用户直接调用,其名称以内部前缀为前缀,以防止意外触发:
(define-minor-mode my--mode
"Mode implementing blah, invoke it with M-x my-super-mode."
nil " Super" nil
;; mode definition goes here, including keymaps, etc.
)
用户调用的公共模式是全局的。当打开或关闭时,它会自动在所有现有和未来的 JS 缓冲区中切换内部模式:
(defun my--mode-set-maybe ()
(my--mode (if my-super-mode 1 0)))
(define-minor-mode my-super-mode
"Super mode, only in effect in JS buffers."
nil "" nil
:global t
(dolist (buf (buffer-list))
(with-current-buffer buf
(my--mode-set-maybe))))
(add-hook 'js-mode-hook 'my--mode-set-maybe)