Почти глобальный второстепенный режим Emacs

Я работаю над второстепенным режимом Emacs, и я хотел бы, чтобы он применялся только тогда, когда основной режим является определенным режимом (т.е. js-mode). Другими словами, когда я активирую свой супер-режим, мне бы хотелось, чтобы определяемая им клавиатура была доступна во всех JS-буферах (как это было глобально), но не затрагивала не-js-буферы.

Я знаю, что это возможно с помощью хуков, но я бы хотел избежать этого решения. В идеале мой второстепенный режим должен быть активирован только при необходимости через Mx (и когда он активирован, он должен действовать во всех буферах JS). Возможный?

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)
Другие вопросы по тегам