2010-04-29 15 views
59

¿Hay alguna diferencia entre configurar cosas para un modo usando eval-after-load y usando el hook de modo?eval-after-load vs. mode hook

He visto un código donde define-key se usa dentro de un gancho de modo principal, y algún otro código donde define-key se usa en el formulario eval-after-load.


Actualización:

Para una mejor comprensión, aquí es un ejemplo del uso de eval-post-carga y modo de ganchos con org-mode. El código puede ejecutar antes de(load "org") o (require 'org) o (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))) 
+3

+1 para * "org" porque C-h f org-mode RET dice que org-mode se define en org.el *. Estaba luchando para obtener 'eval-after-load' para evaluar' 'nxml-mode', ¡y este consejo funcionó! –

Respuesta

84

Código envuelto en eval-after-load se ejecutará sólo una vez, por lo que normalmente se utiliza para realizar la configuración de una sola vez como la fijación de los valores globales por defecto y el comportamiento. Un ejemplo podría ser configurar un mapa de teclado predeterminado para un modo en particular. En el código eval-after-load, no hay ninguna noción del "buffer actual".

Los ganchos de modo se ejecutan una vez por cada búfer en el que se habilita el modo, por lo que se usan para la configuración por búfer. Por lo tanto, los ganchos de modo se ejecutan después del código eval-after-load; esto les permite tomar acciones basadas en información tal como si otros modos están habilitados en el búfer en uso.

+0

En una nota al margen (corríjanme si estoy equivocado): parece que emacs-lisp-mode y lisp-mode se cargan antes de que se ejecuten los scripts personalizados eval-after-load. Entonces, en ese caso, uno podría necesitar usar un gancho de modo en su lugar. – balu

+1

Sí: el bloque 'eval-after-load' siempre está' eval''d * después de * la biblioteca relacionada está 'load'ed. Pero tenga en cuenta que el código siempre se ejecutará * antes * de que se invoque cualquier función en la biblioteca relacionada. Así que si '' eval-after-load 'lisp-mode ...) ', entonces el código' ... 'en este bloque se ejecutará antes de la función' lisp-mode' en 'lisp-mode.el' se llama. – sanityinc

+0

Perdón por la fraseología. Por supuesto, las bibliotecas se cargan antes de que eval - ** after ** - load se ejecute. Pero en cuanto a emacs-lisp-mode y lisp-mode, no parece que se ejecuten en absoluto: intenté modificar sus mapas de teclas que funcionaban bien en un hook de modo pero no en un bloque eval-after-load (nada cambiaría) . Con el modo python y otros modos, sin embargo, todo funciona bien. Así que supongo que los modos emacs-lisp y lisp son excepciones y de alguna manera son integradas, en el sentido de que se cargan antes de que la configuración de Emacs sea analizada. – balu