什么是钩子?


8

只是为了澄清...例如,在此文档中

钩子是一个Lisp变量,其中包含一个函数列表,在某些明确定义的情况下将调用该函数。(这称为运行挂钩。)列表中的各个功能称为挂钩的挂钩功能。例如,挂钩kill-emacs-hook在退出Emacs之前运行。

我认为这是说有一个变量(符号)kill-emacs-hook,该变量代表一组“挂钩函数”的列表,这些挂钩函数将在kill-emacs-hook评估时运行,从而执行这些功能。正确?然后

(add-hook 'text-mode-hook 'auto-fill-mode)

除了已存在的内容外,还会添加auto-fill-mode到该列表text-mode-hook中。好。现在这个

(defcustom text-mode-hook nil
  "Normal hook run when entering Text mode and many related modes."
  :type 'hook
  :options '(turn-on-auto-fill flyspell-mode)
  :group 'wp)

似乎我们正在创建或更改text-mode-hook。我现在对钩子的性质及其与钩子的关系感到困惑defcustom。我的逻辑选择是,此代码创建的变量text-mode-hook是“类型”(不知道elisp中的类型是什么意思)hook。确实,这是否应该是钩子的最初创建text-mode-hook?如果是这样,“选项”是怎么回事?是那些所谓的钩子函数,还是其他?


1
从您的链接:«:options关键字为变量指定建议的值列表。通常,:options适用于钩子。该列表仅是建议。它不是排他性的;设置变量的人可以将其设置为其他值;:options关键字后面显示的列表旨在为用户提供方便的选择。»
Sidhekin

Answers:


6

您对Emacs Lisp钩子概念的理解是绝对正确的。实际上,“常规”钩子只是函数列表(每个函数都不带参数,否则在Emacs Lisp中通常不称为“钩子”或“常规钩子”)。

其中大多数变量的名称都以结尾-hook。它们是普通的挂钩,通过来运行run-hooks。这样的钩子的值是功能列表。调用函数时不带参数,其值将被完全忽略。建议将新函数放在这样的钩子上的方法是调用add-hook

以名称结尾的变量-functions通常是异常钩子(某些旧代码也可能使用不建议使用的-hooks后缀);它们的值是函数列表,但是这些函数以特殊的方式调用(它们是传递的参数,或者使用了它们的返回值)。以名称结尾的变量-function具有单个函数作为其值。

定制界面是另一回事。defvar和之间的所有区别 defcustom是后者允许用户通过“定制”界面编辑变量。这个接口可以方便编辑某些类型的数据,因此,例如,如果你说:typetext-mode-hookhook,那定制界面确保text-mode-hook始终是一个函数列表。此外,您可以指定推荐:options参数的选项。

因此,您的理解是正确的,defcustom它的选项只是指导Emacs的一种方式,因此当用户使用“自定义”界面时,它可以更好地为用户提供帮助。


但是,这个a的例子defcustom并不好,因为text-mode-hook已经存在。它已经包括在内。对?现在,如果我编写了自己的模式,然后想要自定义,我会这样做。我感到困惑的是,这个示例实际上是在创建text-mode-hook而不是更改它。这是正确的理解吗?如果确实要创建一个new text-mode-hook,那么:options它会提供这两个功能作为add-hook对列表执行操作的选项,对吗?
2015年

@ 147pm,此示例仅向您显示Emacs现有代码的某些部分如何定义表示钩子的可自定义变量。简而言之,defcustom只需定义新变量即可。在此特定示例text-mode-hook中,创建它的初始值为nil。还告诉自定义界面,此列表中的推荐值是turn-on-auto-fillflyspell-mode。但是,您可以text-mode-hook通过编程将其设置为任意值,这是常规变量。您也可以使用add-hook任何其他功能。
马克·卡波夫

@ 147,换句话说,所有关键字参数只是自定义系统的提示,它们在此之外没有任何区别。没有提示,代码等于(defvar text-mode-hook nil)
马克·卡波夫

但这是defcustom挂钩的最初创建方式吗?那看起来像什么。换句话说,此示例取自Emacs代码深处的某个地方。
2015年

@ 147pm,是的,正确。
马克·卡波夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.