Il semble que vous souhaitiez activer ou désactiver des modes mineurs spécifiques pour des "tampons spécifiques". Habituellement, les "tampons spécifiques" peuvent être distingués par leur mode majeur, ce qui est la façon dont je regarde habituellement ce type de problème. La procédure d'activation ou de désactivation des modes mineurs dépend de l'implémentation du mode mineur que vous essayez d'activer/désactiver et du mode principal que vous essayez d'activer/de désactiver.
activer/désactiver les choses basées sur le mode majeur est via la variable major-mode-hook
.C'est là que vous tenez les choses à personnaliser le mode:
(add-hook 'text-mode-hook 'auto-fill-mode)
Je l'habitude d'écrire ma propre fonction, même si elle est un simple-liner, parce que je vais presque toujours ajouter des choses plus tard:
(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)
Vous pouvez également faire des choses dans le crochet conditionnel:
(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)
que je fais habituellement tout cela dans un major-mode-load-hook
, de sorte qu'il ne se produit que lorsque le code du major-mode est chargé:
(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)
Un important mode bien écrit aura une variable définie load-hook
(je regarde habituellement au code source du mode pour savoir). Si elle n'a pas de load-hook
, vous pouvez simuler un avec la fonction 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))
Si vous ne le faites pas dans un load-hook
alors vous devez vous assurer que le mode-hook
est personnalisable, puis ajouter votre my-mode-hook
via personnaliser; Je préférerais avoir tous les éléments au même endroit dans mes .emacs, donc je ne personnalise généralement pas mes hameçons de cette façon.
Si jamais vous trouvez un mode majeur qui n'a pas de major-mode-hook
, vous pouvez créer votre propre mode majeur en utilisant define-derived-mode
. Vous devrez alors appeler le nouveau mode défini à chaque fois que l'ancien mode était activé.
(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)
Certains modes mineurs peuvent être activés globalement. Si vous les voulez sur la plupart du temps et qu'il le supporte, vous pouvez l'activer globalement et l'éteindre pour des modes majeurs spécifiques.
(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))))
Si le mode mineur ne peut pas être activé au niveau mondial, ou vous ne voulez pas activé au niveau mondial, il suffit de tourner sur des modes spécifiques, comme indiqué ci-dessus.
Ceci semble être utile pour éditer des fichiers seulement. Cependant, tous les tampons ne sont pas associés à des fichiers, et j'aimerais également activer ou désactiver certains comportements dans ces tampons. Vous avez cependant répondu à certaines parties de ma question. Je vous remercie! – rafl
@rafl Je suis assez sûr que ce crochet est toujours appelé – Anycorn
Je ne crains pas, non. Comme son nom l'indique, il n'est jamais appelé par 'find-file', ce qui n'est en aucun cas le seul moyen de créer des tampons. – rafl