23.1.2 设置钩子

这是一个示例,它向模式挂钩添加了一个函数,以在 Lisp 交互模式下打开自动填充模式:

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

钩子变量的值应该是一个函数列表。您可以使用普通的 Lisp 工具操作该列表,但通常情况下,使用下面定义的函数add-hook和 remove-hook。这两个函数会小心处理一些不寻常的情况,避免出现问题。

用户可以将lambda 函数放入钩子中,但 Emacs 并不建议这样做,因为这很容易引起混淆。如果用户向一个钩子添加了两个功能上等价,但编写上略有不同,那么用户会在挂钩上获得两个等效但不同的函数。如果用户随后删除其中一个,另一个仍将保留在其上。

Function: add-hook hook function &option depth loacl

此函数手动将 function 加入 钩子hook中。用户可以将它用于异常钩子以及正常钩子。function可以是任何 Lisp 函数,它可以接受适当数量的参数。例如,

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

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

如果钩子中已经存在函数(使用equal比较 ),则不会再次添加它。

如果函数的permanent-local-hook属性的值为 非nil,则kill-all-local-variables(或更改主要模式)不会将这个函数从钩子变量中删除。

对于普通的钩子,钩子函数的设计原则应该使它们的执行顺序无关紧要。任何对顺序的依赖都是自找麻烦。但是,顺序预料中的:通常,依次运行钩子中靠前的函数(除非再次add-hook调用)。

在某些情况下,控制钩子上函数的相对位置很重要。这时可选参数depth允许您指示函数应在列表中的哪个位置插入。depth 应当是一个介于 -100 和 100 之间的数字,其值越大,函数就越靠近列表的末尾。depth的默认值为0,为了向后兼容,当depth是一个非零符号时,它会被被解释为90。更进一步,如果depth 是一个严格大于0的数,那么这个函数会被放在同等depth 函数之后,而不是之前。此外,永远不要使用 100(或 -100)的depth,因为我们无法确定在那个函数位置之前(或之后)不需要其他函数。

add-hook可以处理hook为void或其值为单个函数的情况,它会将其值重设或更改为函数列表。

如果参数local为 non- nil,则表示将函数添加到缓冲区本地钩子列表而不是全局钩子列表。这使挂钩缓冲区本地化并添加t到缓冲区本地值。后者充当在默认值和本地值中运行钩子函数的标志。

Function: remove-hook hook function &option local

此函数从钩子变量hook 中删除函数function。它使用equal比较函数,因此这个函数同时也适用于 符号 和 lambda 表达式。

如果local值为 non- nil,则表示从缓冲区本地钩子列表中删除函数而不是全局钩子列表。

最后更新于