【问题标题】:Execution order of eval-after-load vs hooks for a given major mode in emacsemacs中给定主要模式的eval-after-load vs hooks的执行顺序
【发布时间】:2018-03-05 07:27:34
【问题描述】:

假设我正在使用的特定模式是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 代码之前运行?

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

【问题讨论】:

    标签: emacs initialization hook elisp major-mode


    【解决方案1】:

    现在假设我打开 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 运行。

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

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


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

    【讨论】:

    • 谢谢!我查看了源代码,从中我学到的是模式作者自己不运行钩子(他们只是用钩子类型定义钩子),但在那种情况下,谁来运行钩子?
    • 主要模式通常用define-derived-mode定义,它会自动创建钩子变量并通过调用run-mode-hooks定义模式命令。
    • 如果,OTOH,您使用标准宏来定义模式函数,那么您有责任手动实现所有此类预期的内务管理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2013-04-23
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多