下面是一个示例,将函数添加到模式钩子中,使其在 Lisp 交互模式下自动启用自动填充模式:
(add-hook 'lisp-interaction-mode-hook 'auto-fill-mode)
钩子变量的值应为一个函数列表。你可以使用常规的 Lisp 操作来处理该列表,
但更模块化的方式是使用下文定义的 add-hook 和 remove-hook 函数。
它们会妥善处理一些特殊场景以避免问题。
将 lambda 表达式形式的函数添加到钩子中是可行的,但我们建议避免这样做,因为容易造成混淆。
若你再次添加写法略有不同的相同逻辑 lambda 表达式,钩子中会出现两个功能等价但互不相同的函数。
当你删除其中一个后,另一个仍会保留在钩子中。
该函数用于便捷地将函数 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 具有非 nil 的 permanent-local-hook 属性,则 kill-all-local-variables(或切换主模式)不会将其从钩子变量的局部值中移除。
对于标准钩子,钩子函数的设计应保证执行顺序无关紧要。任何对执行顺序的依赖都可能引发问题。
不过执行顺序是可预期的:通常 function 会被添加到钩子列表头部,因此会优先执行(除非再次调用 add-hook)。
某些场景下需要精确控制钩子中函数的相对顺序。
可选参数 depth 用于指定函数插入位置:取值为 -100 到 100 之间的数字,
数值越大,函数越靠近列表尾部。depth 默认值为 0;
为兼容旧版,当 depth 为非 nil 符号时,按深度 90 处理。
此外,当 depth 严格大于 0 时,该函数会被添加到同深度函数的 后面。
永远不要使用深度 100 或 -100,因为无法确保不会有其他函数需要更靠前或更靠后的位置。
add-hook 可以处理 hook 未定义或其值为单个函数的情况,会自动将其设置或修改为函数列表。
若 local 非 nil,则将 function 添加到缓冲区局部钩子列表而非全局钩子列表。
这会使该钩子成为缓冲区局部变量,并在局部值中添加 t,该标记表示同时运行默认值与局部值中的钩子函数。
该函数从钩子变量 hook 中移除 function。
它通过 equal 比较 function 与钩子列表中的元素,因此对符号与 lambda 表达式均有效。
若 local 非 nil,则从缓冲区局部钩子列表而非全局钩子列表中移除 function。