24.1.2 设置钩子

下面是一个示例,将函数添加到模式钩子中,使其在 Lisp 交互模式下自动启用自动填充模式:

(add-hook 'lisp-interaction-mode-hook 'auto-fill-mode)

钩子变量的值应为一个函数列表。你可以使用常规的 Lisp 操作来处理该列表, 但更模块化的方式是使用下文定义的 add-hookremove-hook 函数。 它们会妥善处理一些特殊场景以避免问题。

lambda 表达式形式的函数添加到钩子中是可行的,但我们建议避免这样做,因为容易造成混淆。 若你再次添加写法略有不同的相同逻辑 lambda 表达式,钩子中会出现两个功能等价但互不相同的函数。 当你删除其中一个后,另一个仍会保留在钩子中。

Function: add-hook hook function &optional depth local

该函数用于便捷地将函数 function 添加到钩子变量 hook 中。 它同时适用于标准钩子与非标准钩子。function 可以是任意能接收该钩子所需参数数量的 Lisp 函数。例如:

(add-hook 'text-mode-hook 'my-text-hook-function)

my-text-hook-function 添加到名为 text-mode-hook 的钩子中。

function 已存在于 hook 中(通过 equal 比较),则 add-hook 不会重复添加。

function 具有非 nilpermanent-local-hook 属性,则 kill-all-local-variables(或切换主模式)不会将其从钩子变量的局部值中移除。

对于标准钩子,钩子函数的设计应保证执行顺序无关紧要。任何对执行顺序的依赖都可能引发问题。 不过执行顺序是可预期的:通常 function 会被添加到钩子列表头部,因此会优先执行(除非再次调用 add-hook)。

某些场景下需要精确控制钩子中函数的相对顺序。 可选参数 depth 用于指定函数插入位置:取值为 -100 到 100 之间的数字, 数值越大,函数越靠近列表尾部。depth 默认值为 0; 为兼容旧版,当 depth 为非 nil 符号时,按深度 90 处理。 此外,当 depth 严格大于 0 时,该函数会被添加到同深度函数的 后面。 永远不要使用深度 100 或 -100,因为无法确保不会有其他函数需要更靠前或更靠后的位置。

add-hook 可以处理 hook 未定义或其值为单个函数的情况,会自动将其设置或修改为函数列表。

localnil,则将 function 添加到缓冲区局部钩子列表而非全局钩子列表。 这会使该钩子成为缓冲区局部变量,并在局部值中添加 t,该标记表示同时运行默认值与局部值中的钩子函数。

Function: remove-hook hook function &optional local

该函数从钩子变量 hook 中移除 function。 它通过 equal 比较 function 与钩子列表中的元素,因此对符号与 lambda 表达式均有效。

localnil,则从缓冲区局部钩子列表而非全局钩子列表中移除 function


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike