1

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

每个主要模式命令都应该运行一个称为模式挂钩的普通挂钩,作为初始化的最后步骤之一。

从主要模式约定:

每个主要模式都应该有一个名为modename-mode-hook. 主模式命令应该做的最后一件事是调用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 文件缓冲区,关于 hooks 和的加载/执行顺序是with-eval-after-load什么?从开始时指定的文档来看,模式挂钩似乎会在with-eval-after-load代码之前运行?

更具体地说,每次进入缓冲区/将其设为当前缓冲区时,是否都会运行模式挂钩?(PS 这很难从文档/手册中找到,欢迎在文档/手册中阐明上述任何内容的任何链接)。

4

1 回答 1

3

现在假设我打开 emacs,然后打开一个 python 文件缓冲区,关于 hooks 和 with-eval-after-load 的加载/执行顺序是什么?

假设python.el尚未加载,则:

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

每次进入缓冲区/将其设为当前缓冲区时,是否都会运行模式挂钩?

不,每次调用 mode 函数时它们都会运行。


1默认库是python.elwhich uses (provide 'python),但从您看来,您显然是with-eval-after-load在使用该python-mode.el库。

于 2017-09-24T10:31:49.800 回答