2017-09-24 117 views
1

让我们假设我正在使用的特定模式是python-mode。 以下对钩Emacs手册规定了:emacs中给定主模式的eval-after-load vs hooks的执行顺序

每一个主要的模式命令是应该运行正常钩称为模式钩作为初始化的最后步骤之一。

来自主要模式约定:

每个主要模式应该有一个名为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.这很难从文档/手册中找到,欢迎任何在文档/手册中澄清上述内容的链接)。

回答

2

现在假设我开的Emacs,然后打开一个python文件缓冲区,是什么相对于挂钩,并与-EVAL-后负荷加载/执行顺序?

假设python.el尚未已经被加载,然后:

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

模式挂钩是否每次进入缓冲区/运行当前缓冲区都运行?

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


默认库是python.el它使用(provide 'python),但是从你的with-eval-after-load你evidentially使用python-mode.el库,而不是。

+0

谢谢!我查看了源代码,从中我学到的是模式作者本身不运行钩子(它们只是用钩子定义钩子),但是在那种情况下,谁运行钩子? –

+0

主要模式通常使用'define-derived-mode'定义,它会自动创建钩子变量并通过调用'run-mode-hooks'来定义模式命令。 – jpkotta

+0

如果OTOH您不*使用标准宏来定义模式功能,那么您有责任手动实施所有这些预期的内务管理。 – phils