頭に浮かぶ解決策の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)