1

我发现此宏的在线帮助信息不足。也许 Stackoverflow 可以做得更好?

我正在使用 emacs trunk (24.0.50.1) 以防万一。

谢谢!

4

1 回答 1

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)来完成实际工作并直接返回其结果。

于 2011-09-17T05:25:59.347 回答