– 宏: add-function where place function &optional props 这个宏是为存储在 PLACE 中的 FUNCTION 添加补丁的便捷方式(请参看 Generializied Variables)。
WHERE 决定了 FUNCTION 是如何与已经存在的函数组合的,比如:FUNCTION 是在原 函数之前还是之后调用。请看 Advice combinators,了解可用组合方式。
当装饰一个变量(它的名字常常以 `-function' 结尾),你可以选择 FUNCTION 用 于全局还是仅仅当前缓冲区:如果 PLACE 只是符号, FUNCTION 将被添加到 PLACE 的全局值中。不论 PLACE 是像 `(local SYMBOL)',还是返回变量名的表达式, FUNCTION 都只会作用于当前缓冲区。最后,如果你想修饰字面变量,你必须使用 `(var VARIABLE)'。
每一个通过 `add-function' 添加的函数都可以附带一个属性列表 PROPS。目前只 有两个属性有特定意义:
`name' 这个属性给补丁一个名字,`remove-function' 可以用来识别移除的函数, 主要用在 FUNCTION 是匿名函数的情况。
`depth' 这个属性定义如何给这个补丁排序,用于多个补丁的民政部。默认民政部下, 其值为0。如果为100,则说明这个补丁应当被排在尽可以靠里的位置, 而-100则表示应当被排在尽可能靠外的位置。当两个补丁有相同的深度值时, 最近添加的处于最外层。
对于 `:before' 补丁,处于最外层是指这个补丁要在其他补丁运行前首先被运行, 而处于最里层,则指其在原函数被调用前运行,他和原函数之间没有其他要被运行 的补丁。同样的,对于 `:after' 补丁,最里层指其在原函数后立即执行,最外层 指在所有补丁的末尾执行。一个 `:override' 补丁只会覆盖原函数,而其他补丁 将会作用于新的函数上。
如果 FUNCTION 不是一个可交互的函数,重组之后的函数将继承其交互说明,如果有, 继承原函数的交互属性。否则,重组之后的函数,将是一个可交互的函数,使用新的交 互说明。有一个例外:如果 FUNCTION 的交互说明是一个函数(不是表达式或者字符 串),将会使用原函数的交互字符串作为一个参数调用这个函数,其结果作为重组的函 数的交互说明。可以使用 `advice-eval-interactive-spec' 来解析作为参数传递过来 的交互说明。
注意:FUNCTION 的交互说明将会作用于重组的函数,所以应当遵守重组函数的约定, 而不是 FUNCTION。在许多案例中,这没有区别,因为两者是完全等价的,但在使用 `:around'、`:filter-args' 和 `:filter-return' 方式时就不一样了,FUNCTION 接 收原函数存放在 PLACE 中的参数就不同了。
– 宏: remove-function place function 这个宏将FUNCTION从PLACE中移除。这只对用 `add-function' 添加的FUNCTION有 用。
FUNCTION 将会与加入到 PLACE 中的所有函数使用`equal' 进行对比,并且尝试与 lambda 表达式进行对比。 另外还会与加入 PLACE 的函数的 `name' 属性进行对比, 比使用 `equal' 与 lambda 表达式对比要可靠些。
– 函数: advice-function-member-p advice function-def 如果 ADVICE 已经在 FUNCTION-DEF 则返回 non-`nil'。同上面的 `remove-function' 一样, ADVICE 除了可以是一个实际的函数,也可以是一个 补丁片断的 `name'。
– 函数: advice-function-mapc f function-def 对添加到 FUNCTION-DEF 的所有的补丁应用函数 F。调用 F 函数时会传两个参数:补丁 函数及其属性列表。
– 函数: advice-eval-interactive-spec spec 对一个交互说明求值,就像包含这样一个交互说明的函数执行过程一样,然后返回得到 的参数列表。比如: `(advice-eval-interactive-spec "r\nP")' 将返回一个具有3个 元素的列表,包括选区的前后边界和输入的前缀参数。