emacs 中给定主要模式的 eval-after-load 与挂钩的执行顺序

Execution order of eval-after-load vs hooks for a given major mode in emacs

让我们假设我正在使用的特定模式是 python-mode。 Emacs 手册为挂钩指定了以下内容:

Every major mode command is supposed to run a normal hook called the mode hook as one of the last steps of initialization.

来自主要模式约定:

Each major mode should have a normal mode hook named modename-mode-hook. The very last thing the major mode command should do is to call run-mode-hooks.

并且 with-eval-after-load 在代码加载后执行代码(例如需要),并且 运行 如果已经需要则立即执行。

我的初始化文件中有以下内容:

(add-hook 'python-mode-hook 'my-post-python)

我也添加了

    (with-eval-after-load 'python-mode
     (setq-default python-basic-offset 7) ; setting some option
     (add-to-list 'python-globals-list "console"))

现在假设我打开 Emacs,然后打开一个 Python 文件缓冲区,关于挂钩和 with-eval-after-load 的 loading/execution 命令是什么?从开始时指定的文档来看,模式挂钩似乎会 运行 before with-eval-after-load code?

更具体地说,模式挂钩是 运行 每次输入缓冲区/使缓冲区成为当前缓冲区吗? (P.S。这很难从 docs/manual 中找到,欢迎在 docs/manual 中澄清上述任何内容的任何链接。

Now assuming I open emacs, followed by opening a python file buffer, what are the loading/execution order with respect to hooks and with-eval-after-load?

假设python.el还没有已经被加载,那么:

  • 您访问foo.py.
  • set-auto-mode 被调用并确定 python-mode 是合适的,然后调用它。
  • python-mode 函数(此时)是 python-mode1 的自动加载定义,因此会被加载。
  • 加载结束时,将评估 python-mode 库的 with-eval-after-load
  • 真正的python-mode函数(通过加载库新定义的)被调用,最后:
  • python-mode-hook 运行s.

Are mode hooks are run every time a buffer is entered/ made the current buffer?

不,他们 运行 每次调用模式函数时。


1 默认库是 python.el,它使用 (provide 'python),但从你的 with-eval-after-load 来看,你显然使用 python-mode.el 图书馆。