web-dev-qa-db-fra.com

eval-after-load vs mode hook

Y a-t-il une différence entre définir les choses pour un mode à l'aide de eval-after-load et en utilisant le mode hook?

J'ai vu du code où define-key est utilisé dans un hook de mode majeur, et un autre code où define-key est utilisé dans eval-after-load forme.


Mettre à jour:

Pour une meilleure compréhension, voici un exemple d'utilisation des hooks eval-after-load et mode avec org-mode. Le code peut s'exécuter avant(load "org") ou (require 'org) ou (package-initialize).

;; The following two lines of code set some org-mode options.
;; Usually, these can be outside (eval-after-load ...) and work.
;; In cases that doesn't work, try using setq-default or set-variable
;; and putting them in (eval-after-load ...), if the
;; doc for the variables don't say what to do.
;; Or use Customize interface.
(setq org-hide-leading-stars t)
(setq org-return-follows-link t)

;; "org" because C-h f org-mode RET says that org-mode is defined in org.el
(eval-after-load "org"
  '(progn
     ;; Establishing your own keybindings for org-mode.
     ;; Variable org-mode-map is available only after org.el or org.elc is loaded.
     (define-key org-mode-map (kbd "<C-M-return>") 'org-insert-heading-respect-content)
     (define-key org-mode-map (kbd "<M-right>") nil) ; erasing a keybinding.
     (define-key org-mode-map (kbd "<M-left>") nil) ; erasing a keybinding.

     (defun my-org-mode-hook ()
       ;; The following two lines of code is run from the mode hook.
       ;; These are for buffer-specific things.
       ;; In this setup, you want to enable flyspell-mode
       ;; and run org-reveal for every org buffer.
       (flyspell-mode 1)
       (org-reveal))
     (add-hook 'org-mode-hook 'my-org-mode-hook)))
71
Yoo

Code encapsulé dans eval-after-load ne sera exécuté qu'une seule fois, il est donc généralement utilisé pour effectuer une configuration unique telle que la définition des valeurs globales et du comportement par défaut. Un exemple pourrait être la configuration d'un keymap par défaut pour un mode particulier. Dans eval-after-load code, il n'y a pas de notion de "tampon courant".

Les hooks de mode s'exécutent une fois pour chaque tampon dans lequel le mode est activé, ils sont donc utilisés pour la configuration par tampon. Les hooks de mode sont donc exécutés après eval-after-load code; cela leur permet de prendre des mesures basées sur des informations telles que si d'autres modes sont activés dans la mémoire tampon actuelle.

93
sanityinc