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

Поскольку doc-view-mode очень медленно с включенным linum-modeЯ пытаюсь отключить его для этого режима. На тот же вопрос был дан ответ почти 6 лет назад: автоматически отключать глобальный второстепенный режим для определенного основного режима.

Следуя ответу phils, я поместил в свой файл .emacs следующее:

(define-global-minor-mode my-global-linum-mode global-linum-mode
(lambda ()
  (when (not (memq major-mode
                   (list 'doc-view-mode 'shell-mode)))
    (global-linum-mode))))
(my-global-linum-mode 1)
(add-hook 'doc-view-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))

Проблема в том, что я не могу заставить его работать постоянно. Когда я запускаю новый буфер, номера строк снова появляются в буфере doc-view-mode, Пожалуйста помоги!

1 ответ

Решение

Ваша проблема в том, что ваш собственный глобальный второстепенный режим вызывает глобальный минимальный линейный режим вместо локального буферного минимального режима!

Вы хотели сделать это:

(define-global-minor-mode my-global-linum-mode linum-mode
  (lambda ()
    (when (not (memq major-mode
                     (list 'doc-view-mode 'shell-mode)))
      (linum-mode 1))))
(my-global-linum-mode 1)

Я бы предложил на самом деле использовать derived-mode-p для тебя major-mode тестовое задание:

(define-globalized-minor-mode my-global-linum-mode linum-mode
  (lambda ()
    (unless (or (minibufferp)
                (derived-mode-p 'doc-view-mode 'shell-mode))
      (linum-mode 1))))

Н.Б. define-globalized-minor-mode это то же самое, что define-global-minor-mode, но я предпочитаю "глобализованное" именование, так как оно немного более показательно для чего оно предназначено (например, чтобы использовать дополнительный локальный буферный режим и создать новый глобальный вспомогательный режим, который управляет этим локальным буферным режимом - включение или отключение во многих буферах массово. "Обычный" глобальный минорный режим таким образом не будет зависеть от локально-буферного минорного режима, поэтому "глобализированная" терминология помогает отличить этот тип режима от других глобальных режимов).

nb Поскольку вы используете настраиваемый глобальный второстепенный режим, вам не нужно my-inhibit-global-linum-mode код. Это был совершенно другой подход, и вы можете удалить его из файла.emacs.

Другие вопросы по тегам