让我们假设我正在使用的特定模式是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.很难从文档/手册中找到,欢迎在文档/手册中澄清上述任何内容的任何链接。)
答案 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
库代替。