emacs中给定主要模式的eval-after-load和hook的执行顺序

时间:2017-09-24 03:39:17

标签: emacs initialization hook elisp major-mode

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

  

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

从主要模式惯例:

  

每个主要模式都应该有一个名为modename-mode-hook的普通模式挂钩。主模式命令应该做的最后一件事就是调用run-mode-hooks

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

我的init文件中有以下内容:

(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的加载/执行命令是什么?从开始时指定的文档开始,似乎模式挂钩将在with-eval-after-load代码之前运行?

更具体地说,每次输入缓冲区/当前缓冲区时都会运行模式挂钩吗? (P.S.很难从文档/手册中找到,欢迎在文档/手册中澄清上述任何内容的任何链接。)

1 个答案:

答案 0 :(得分:2)

  

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

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

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

每次输入缓冲区/当前缓冲区时都会运行模式挂钩吗?

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

1 默认库为python.el,使用(provide 'python),但您with-eval-after-load显然使用python-mode.el库代替。