几乎全球的Emacs次要模式

时间:2013-02-16 09:57:43

标签: emacs minor-mode

我正在研究Emacs次要模式,我希望它仅在主要模式是特定模式时应用(即js-mode)。换句话说,当我激活my-super-mode时,我希望它定义的键映射在所有JS缓冲区中都可用(就像它是全局的)但不影响非js缓冲区。

我知道可以通过钩子但我想避免这个解决方案。理想情况下,我的次要模式仅在需要时通过M-x激活(并且在激活时它应该在所有JS缓冲区中生效)。可能的?

1 个答案:

答案 0 :(得分:1)

我们想到的一个解决方案是定义一个实现实际功能的缓冲区本地次要模式,但不是由用户直接调用,而是以内部前缀为前缀,以防止意外触发:

(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)