使用 eval-after-load
设置模式和使用模式挂钩之间有区别吗?
我见过一些代码在主要模式挂钩中使用了 define-key
,而在其他一些代码中 define-key
以 eval-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)))
eval-after-load
实际评估 nxml-mode
,而这个技巧奏效了!
包含在 eval-after-load
中的代码只会执行一次,因此它通常用于执行一次性设置,例如设置默认全局值和行为。一个示例可能是为特定模式设置默认键盘映射。在 eval-after-load
代码中,没有“当前缓冲区”的概念。
模式挂钩对启用模式的每个缓冲区执行一次,因此它们用于每个缓冲区的配置。因此,模式挂钩在 eval-after-load
代码之后运行;这使他们可以根据当前缓冲区中是否启用其他模式等信息采取行动。
不定期副业成功案例分享
eval-after-load
块总是eval
在相关库被load
编辑后。但请注意,代码将始终在调用相关库中的任何函数之前执行。因此,如果您使用(eval-after-load 'lisp-mode ...)
,则此块中的...
代码将在lisp-mode.el
中的lisp-mode
函数被调用之前运行。after-load
究竟做了什么?eval-after-load
有区别吗?eval-after-load
的本地宏包装器,以避免需要引用传递给eval-after-load
的表单。 IE。我可以写(after-load 'foo (foo) (bar))
而不是(eval-after-load 'foo '(progn (foo) (bar)))
。emacs-lisp-mode
和lisp-mode
与 emacs 一起转储并且从未加载。