加载后评估与模式挂钩


75

eval-after-load使用模式挂钩和使用模式挂钩为东西设置东西之间有区别吗?

我已经看到了在define-key主要模式挂钩中使用的一些代码,以及define-keyeval-after-load表单中使用的其他一些代码。


更新:

为了更好地理解,这是将eval-after-load和mode挂钩与org-mode一起使用的示例。该代码可以运行之前 (load "org")(require 'org)(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)))

6
+1为 “ org”,因为Ch f org-mode RET表示org-el在org.el中定义。我一直在努力eval-after-load进行实际评估nxml-mode,而这个技巧有用!
扎克·杨

Answers:


107

包装的代码eval-after-load将只执行一次,因此通常用于执行一次性设置,例如设置默认全局值和行为。一个示例可能是为特定模式设置默认键盘映射。在eval-after-load代码中,没有“当前缓冲区”的概念。

模式挂钩对于启用了该模式的每个缓冲区执行一次,因此它们用于每个缓冲区的配置。因此,模式挂钩比eval-after-load代码运行晚;这使他们可以根据诸如当前缓冲区中是否启用其他模式之类的信息来采取措施。


1
附带说明一下(如果我错了,请纠正我):emacs-lisp-mode和lisp-mode似乎在执行自定义eval-after-load脚本之前已被加载。因此,在那种情况下,确实可能需要使用模式挂钩。
2014年

1
是:该eval-after-load块始终是eval“d后,相关的库load编。但是请注意,将始终在调用相关库中的任何函数之前执行代码。因此,如果您使用(eval-after-load 'lisp-mode ...),则...此块中的代码将在lisp-mode调用in函数之前运行lisp-mode.el
sanityinc 2014年

1
到底是after-load做什么的?有什么区别eval-after-load吗?
balu 2014年

6
它只是用于本地宏包装程序eval-after-load,从而避免了引用传递给的表单eval-after-load。即。而不是(eval-after-load 'foo '(progn (foo) (bar)))我可以写(after-load 'foo (foo) (bar))
sanityinc 2014年

2
@balu:emacs-lisp-mode并且lisp-mode与emacs一起转储并且从未加载。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.