2

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

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

4

1 回答 1

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)
于 2013-02-16T12:58:34.600 回答