24.1 钩子

钩子是一种变量,可用于存储一个或多个函数(see 什么是函数?), 使其在现有程序的特定时机被调用。Emacs 提供钩子机制以便用户进行定制。 钩子通常在初始化文件中设置(see The Init File),Lisp 程序也可以对其进行设置。 部分标准钩子变量的列表,See Standard Hooks

Emacs 中的绝大多数钩子都是标准钩子。这类变量保存的是无参数调用的函数列表。 按照惯例,钩子名称以‘-hook’ 结尾即表示它是标准钩子。 我们尽可能将所有钩子设计为标准钩子,以便你可以用统一的方式使用它们。

每个主模式命令都会在初始化的最后阶段运行一个名为模式钩子(mode hook)的标准钩子。 这样用户就可以方便地定制该模式的行为,例如覆盖模式已经设置的缓冲区局部变量。 大多数次模式函数在执行完毕时也会运行对应的模式钩子。 不过钩子也用于其他场景,比如suspend-hook 钩子会在 Emacs 即将挂起之前运行(see Suspending Emacs)。

如果钩子变量名称不以‘-hook’ 结尾,则它通常是非标准钩子(abnormal hook)。 这类钩子与标准钩子有两点区别:调用时可以带有一个或多个参数,并且函数的返回值可能会被程序使用。 钩子的文档字符串会说明函数的调用方式以及返回值的用途。 添加到非标准钩子中的函数必须遵循该钩子规定的调用规范。 按照惯例,非标准钩子名称以‘-functions’ 结尾。

如果变量名称以‘-predicate’ 或单数形式的‘-function’ 结尾,则其值必须是单个函数,而不是函数列表。 与非标准钩子类似,这类单函数钩子对参数和返回值的要求各不相同,具体细节在各个变量的文档字符串中说明。

由于钩子(包括多函数钩子和单函数钩子)本质是变量,可以使用setq 修改其值,或使用let 临时绑定。 但更常见的需求是在保留钩子已有其他函数的前提下,添加或移除某个特定函数。 对于多函数钩子,推荐使用add-hookremove-hook 实现(see 设置钩子)。 大多数标准钩子变量初始为空,add-hook 可以正确处理这种情况。 使用add-hook 既可以全局添加钩子,也可以针对某个缓冲区局部添加。 对于仅保存单个函数的钩子,则不适合使用add-hook,可以使用add-function(see 为 Emacs Lisp 函数添加建议)将新函数与原有钩子函数组合。 需要注意的是,部分单函数钩子可能为nil,而add-function 无法处理这种情况,因此在调用前必须先进行检查。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike