eval-after-load 与 mode 挂钩

Posted

技术标签:

【中文标题】eval-after-load 与 mode 挂钩【英文标题】:eval-after-load vs. mode hook 【发布时间】:2011-02-13 17:34:12 【问题描述】:

使用eval-after-load 设置模式和使用模式挂钩有区别吗?

我见过一些代码在主模式挂钩中使用了define-key,还有一些其他代码在eval-after-load 形式中使用了define-key


更新:

为了更好地理解,这里是一个在 org-mode 中使用 eval-after-load 和 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)))

【问题讨论】:

+1 for "org" 因为 C-h f org-mode RET 表示 org-mode 在 org.el 中定义。我正在努力让eval-after-load 实际评估nxml-mode,这个技巧奏效了! 【参考方案1】:

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

模式挂钩对启用模式的每个缓冲区执行一次,因此它们用于每个缓冲区的配置。因此,模式挂钩的运行时间要晚于eval-after-load 代码;这让他们可以根据当前缓冲区中是否启用其他模式等信息采取行动。

【讨论】:

附注(如果我错了,请纠正我):emacs-lisp-mode 和 lisp-mode 似乎在自定义 eval-after-load 脚本被执行之前被加载。因此,在这种情况下,可能确实需要使用模式挂钩。 是的:eval-after-load 块总是eval'd 之后相关库是loaded。但请注意,代码将始终在调用相关库中的任何函数之前执行。所以如果你(eval-after-load 'lisp-mode ...),那么这个块中的...代码将在lisp-mode.el中的lisp-mode函数被调用之前运行。 after-load 到底是做什么的?和eval-after-load有区别吗? 它只是eval-after-load 的本地宏包装器,以避免需要引用传递给eval-after-load 的表单。 IE。而不是(eval-after-load 'foo '(progn (foo) (bar))),我可以写(after-load 'foo (foo) (bar)) @balu: emacs-lisp-modelisp-mode 与 emacs 一起转储并且从未加载。

以上是关于eval-after-load 与 mode 挂钩的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的主要模式挂钩中访问目录局部变量?

.emacs .txt 文件视觉线模式与缪斯模式同时

Logrus 根据需要与 syslog 挂钩

收到与反应挂钩 useHistory 相关的错误

如何使用 jest/enzyme 测试 useEffect 与 useDispatch 挂钩?

react-router-dom 与反应挂钩不起作用