disabilita automaticamente una modalità minore globale per una modalità principale specifica

Ho attivato la modalità cursore centrato a livello globale, in questo modo:

(require 'centered-cursor-mode)
(global-centered-cursor-mode 1)

Funziona bene, ma ci sono alcune modalità principali in cui vorrei disabilitarlo automaticamente. Ad esempio slime-repl e shell.

C'è un'altra domanda che tratta lo stesso problema, ma un'altra modalità minore. Sfortunatamente le risposte offrono solo soluzioni alternative per questa specifica modalità minore (modalità global-smart-tab), che non funziona con la modalità cursore centrato.

Ho provato questo hook, ma non ha alcun effetto. La variabile non cambia.

(eval-after-load "slime"
  (progn
    (add-hook 'slime-repl-mode-hook (lambda ()
                                      (set (make-local-variable 'centered-cursor-mode) nil)))
    (slime-setup '(slime-repl slime-autodoc))))
24
задан chrm 26 July 2011 в 22:44
поделиться

2 ответа

Я сделал новый глобальный минорный режим, который не активируется в определенных режимах. Лямбда - это функция, которая вызывается в каждом новом буфере для активации второстепенного режима. Это правильное место, чтобы делать исключения.

(require 'centered-cursor-mode)

(define-global-minor-mode my-global-centered-cursor-mode centered-cursor-mode
  (lambda ()
    (when (not (memq major-mode
                     (list 'slime-repl-mode 'shell-mode)))
      (centered-cursor-mode))))

(my-global-centered-cursor-mode 1)

Это должно работать для любого другого глобального второстепенного режима. Просто скопируйте определение global-xxx-mode и сделайте правильные исключения.

13
ответ дан 29 November 2019 в 00:04
поделиться

Глобальные второстепенные режимы, созданные с помощью макроса 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, тогда как глобальный минорный режим с отдельным поворотом Функция on по-прежнему может вызываться в ее неглобальной форме, если вы того пожелаете.

4 https://stackoverflow.com/a/19295380/324105

17
ответ дан 29 November 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: