автоматически отключать глобальный второстепенный режим для определенного основного режима - PullRequest
23 голосов
/ 27 июля 2011

Я активировал глобальный режим с центрированным курсором, например:

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

Работает нормально, но есть несколько основных режимов, в которых я хотел бы отключить его автоматически. Например, slime-repl и shell.

Есть еще один вопрос, связанный с той же проблемой, но с другим второстепенным режимом. К сожалению, ответы предлагают только обходные пути для этого специфического второстепенного режима (global-smart-tab-mode), который не работает с режимом по центру курсора.

Я пробовал этот крючок, но он не действует. Переменная не меняется.

(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))))

Ответы [ 2 ]

16 голосов
/ 27 июля 2011

Глобальные второстепенные режимы, созданные с помощью макроса 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

12 голосов
/ 27 июля 2011

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

(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 и сделайте правильные исключения.

...