我发现此宏的在线帮助信息不足。也许 Stackoverflow 可以做得更好?
我正在使用 emacs trunk (24.0.50.1) 以防万一。
谢谢!
首先,您需要阅读有关hooks的手册,并可能阅读文档与此宏进行比较的建议。该宏使您能够编写可以被一些未来代码包装的代码,以改变它的工作方式。
(with-wrapper-hook hook-name ()
your code here)
然后其他人可以向其中添加一个函数hook-name
,如下所示:
(defun my-hook (your-code)
(let ((original-result (funcall your-code)))
(modify original-result)))
参数your-code
代表your code here
上面,封装在一个函数对象中。包装器可以使用 调用您的原始代码(funcall your-code)
,但不需要这样做,在这种情况下,它会完全覆盖您的代码。钩子甚至可以包含几个函数,每个函数都接收下一个函数作为其第一个参数,因此可以有一个包装链,每个都修改下一个的结果。也可以为这些函数中的每一个定义一些额外的参数(这就是上面的空括号的用途)。
要查找示例,您可能需要围绕源进行 grep。一种用途是expand-abbrev
:
(with-wrapper-hook abbrev-expand-functions ()
...)
expand-abbrev 函数是用来扩展缩写abbrev-expand-functions
的,你有一个钩子 ( ) 来自定义它在不同模式下的执行方式是有意义的。这个钩子不能“正常”,因为它必须能够修改结果,并且它需要能够将一些结果返回给调用代码。(正如关于钩子的文档中所解释的,一个普通的钩子在没有参数的情况下被调用并且它的返回值被忽略,所以它被调用只是因为它对缓冲区的副作用。)
这个钩子上的函数可以做自己的缩略扩展而忽略被包装的代码,或者调用被包装的代码并修改结果,或者用不同的输入多次调用被包装的代码。使用该挂钩的一个示例是mail-abbrev-expand-wrapper
,它会检查您是否在电子邮件中键入 To: 标头,在这种情况下会扩展您的邮件别名而不是标准缩写。该函数修改影响缩写扩展的各种环境(语法表,缩写表),然后调用包装函数 with(funcall expand)
来完成实际工作并直接返回其结果。