Подтвердить что ты не робот

Автоматически отключить глобальный вспомогательный режим для определенного основного режима

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

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

Ответ 1

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

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

Ответ 2

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

2C-h f define-globalized-minor-mode RET показывает, что turn-on является третьим аргументом, и мы проверяем, что в определении режима с помощью M-x find-function RET global-centered-cursor-mode RET.

3 при таком подходе этот факт будет препятствовать тому, чтобы вы когда-либо разрешали этот второстепенный режим с буферами slime-repl-mode или shell-mode, тогда как глобализованный второстепенный режим с отдельным поворотным режимом, по-прежнему можно вызвать в своей неглобальной форме, если вы этого пожелаете.

4fooobar.com/info/194255/...