Глобальные второстепенные режимы, созданные с помощью макроса define-globalized-minor-mode
1 , немного сложны.Причина, по которой ваш код ничего не делает, заключается в том, что глобализированные режимы используют after-change-major-mode-hook
для активации вспомогательного локального режима буфера, которым они управляют;и этот хук запускается сразу после собственных хуков основного режима 4 .
В отдельных режимах могут быть реализованы пользовательские способы указания какого-либо черного списка или другой метод предотвращенияРежим включается при определенных обстоятельствах, поэтому в общем случае стоит посмотреть соответствующие опции M-x customize-group
для пакета, чтобы увидеть, существуют ли такие возможности.Тем не менее, хороший чистый общий способ достижения этого для ЛЮБОГО глобализированного второстепенного режима на данный момент ускользает от меня.
Обидно, что функция MODE-enable-in-buffers
, определенная этим макросом, не делает то же самое (with-current-buffer buf (if ,global-mode ...))
проверка, которая выполняется функцией глобального режима.Если это так, вы могли бы просто использовать slime-repl-mode-hook, чтобы сделать глобальную переменную режима buffer локальным и равным nil.
Быстрый взлом - проверить 2 Что такое аргумент turn-on
для определения глобализированного второстепенного режима (в данном случае это само по себе centered-cursor-mode
3 ), и напишите несколько советов, чтобы это не оценивалось для рассматриваемых режимов.
(defadvice centered-cursor-mode (around my-centered-cursor-mode-turn-on-maybe)
(unless (memq major-mode
(list 'slime-repl-mode 'shell-mode))
ad-do-it))
(ad-activate 'centered-cursor-mode)
То, что мы можем сделать (с простым шаблоном многократного использования), это немедленно отключить вспомогательный локальный режим буфера снова после его включения.Функция after-change-major-mode-hook
, добавленная с аргументом APPEND
к add-hook
, будет надежно работать после того, как действует глобальный второстепенный режим, и поэтому мы можем делать такие вещи:
(add-hook 'term-mode-hook 'my-inhibit-global-linum-mode)
(defun my-inhibit-global-linum-mode ()
"Counter-act `global-linum-mode'."
(add-hook 'after-change-major-mode-hook
(lambda () (linum-mode 0))
:append :local))
1 или его псевдоним define-global-minor-mode
, который, по моему мнению, следует избегать из-за возможной путаницы с «глобальными» второстепенными режимами, созданными с помощью define-minor-mode
.«Глобализированные» второстепенные режимы, хотя они все еще включают глобальный второстепенный режим, на практике работают совсем иначе, поэтому лучше называть их «глобализированными», а не «глобальными».
2 Ch f define-globalized-minor-mode
RET показывает, что turn-on
является третьим аргументом, и мы проверяем это в определении режима с помощью Mx find-function
RET global-centered-cursor-mode
RET .
3 при таком подходе этот факт не позволит вам когда-либо включить этотвторостепенный режим с буферами slime-repl-mode или shell-mode, тогда как глобальный второстепенный режим с отдельной функцией включения может по-прежнему вызываться в его неглобальном виде, если вы того пожелаете.
4 https://stackoverflow.com/a/19295380/324105