Почти глобальный второстепенный режим 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)