Звучит так, будто вы в основном хотите включить или выключить определенные второстепенные режимы для "определенных буферов". Обычно «конкретные буферы» можно отличить по их основному режиму, как я обычно смотрю на этот тип проблемы. Как включить или выключить второстепенные режимы, зависит от реализации как второстепенного режима, который вы пытаетесь включить / выключить, так и основного режима, в котором вы пытаетесь включить / выключить его.
Обычный способ включить / отключить вещи в основном режиме - через переменную major-mode-hook
. Здесь вы можете вставить вещи для настройки режима:
(add-hook 'text-mode-hook 'auto-fill-mode)
Я обычно пишу свою собственную функцию, даже если это простая однострочная строка, потому что я почти всегда буду добавлять вещи позже:
(defun my-text-mode-hook ()
"Stuff to do when `text-mode' is invoked."
(auto-fill-mode 1))
(add-hook 'text-mode-hook 'my-text-mode-hook)
Вы также можете сделать условия внутри крючка условными:
(defun my-text-mode-hook ()
"Stuff to do when `text-mode' is invoked."
;; skip modes based on text-mode
(when (eq major-mode 'text-mode)
(auto-fill-mode 1))
)
(add-hook 'text-mode-hook 'my-text-mode-hook)
Обычно я делаю все это в major-mode-load-hook
, так что это происходит только при загрузке кода основного режима:
(defun my-tnt-load-hook ()
(defun my-tnt-im-mode-hook ()
"Hook for TNT's im-mode hook."
(flyspell-mode 1)
(setq fill-column (- (frame-width) 5)))
(add-hook 'tnt-im-mode-hook 'my-tnt-im-mode-hook)
(add-hook 'tnt-chat-mode-hook 'my-tnt-im-mode-hook))
(add-hook 'tnt-load-hook 'my-tnt-load-hook)
В хорошо написанном мажорном режиме будет определена переменная load-hook
(я обычно обращаюсь к исходному коду режима, чтобы выяснить это). Если у него нет load-hook
, вы можете смоделировать его с помощью функции eval-after-load
:
(defun my-view-mode-after-load-hook ()
"Stuff to do after view mode loads."
(defun my-view-mode-hook ()
"Stuff to run in `view-mode'."
(flyspell-mode 0))
(add-hook 'view-mode-hook 'my-view-mode-hook)
(define-key view-mode-map "b" 'View-scroll-page-backward)
(define-key view-mode-map [(delete)] 'View-scroll-page-backward)
(define-key view-mode-map "q" 'View-kill-and-leave)
(define-key view-mode-map "Q" 'View-quit))
(eval-after-load 'view '(my-view-mode-after-load-hook))
Если вы не сделаете это в load-hook
, вы должны убедиться, что mode-hook
настраивается, а затем добавить в my-mode-hook
с помощью настройки; Я бы предпочел, чтобы все вещи были в одном месте в моем .emacs, поэтому я обычно не настраиваю свои крючки таким образом.
Если вы когда-нибудь найдете мажорный режим, в котором нет major-mode-hook
, вы можете создать свой собственный мажорный режим на основе этого, используя define-derived-mode
. Затем вам нужно будет вызывать вновь определенный режим всякий раз, когда старый режим был.
(defun replace-alist-mode (alist oldmode newmode)
(dolist (aitem alist)
(if (eq (cdr aitem) oldmode)
(setcdr aitem newmode))))
(define-derived-mode hooked-foobar-mode foobar-mode "Foobar")
(replace-alist-mode auto-mode-alist 'foobar-mode 'hooked-foobar-mode)
(defun my-hooked-foobar-mode-hook ()
"Hook to run when `hooked-foobar-mode' is called."
(flyspell-mode 0))
(add-hook 'hooked-foobar-mode-hook 'my-hooked-foobar-mode-hook)
Некоторые второстепенные режимы могут быть включены глобально. Если вы хотите, чтобы они были в большинстве случаев, и они поддерживают это, вы можете включить их глобально, а затем отключить для определенных основных режимов.
(global-font-lock-mode 1)
;; example of how to do it without a defun
(add-hook 'text-mode-hook (function
(lambda () ""
(interactive)
(font-lock-mode 0))))
Если вспомогательный режим нельзя включить глобально или вы не хотите, чтобы он был включен глобально, просто включите его для определенных режимов, как показано выше.