2

私はEmacsマイナーモードに取り組んでいますが、メジャーモードが特定のモード(つまり)の場合にのみ適用したいと思いますjs-mode。言い換えると、my-super-modeをアクティブ化するときに、それが定義するキーマップをすべてのJSバッファー(グローバルであるように)で使用できるようにしたいのですが、js以外のバッファーには影響しません。

私はそれがフックを介して可能であることを知っていますが、私はこの解決策を避けたいと思います。理想的には、私のマイナーモードは、Mxを介して必要な場合にのみアクティブ化されます(アクティブ化されると、すべてのJSバッファーで有効になります)。可能?

4

1 に答える 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 に答える