33.19.9 定义与使用域

域是缓冲区中一段连续的字符范围,这些字符通过拥有相同的 field 属性值(使用 eq 比较)来标识,该属性可以是文本属性或覆盖层属性。本节介绍可用于操作域的专用函数。

你可以使用缓冲区位置 pos 来指定一个域。我们将每个域视为包含一段缓冲区位置,因此你指定的位置代表包含该位置的域。

pos 前后的字符属于同一个域时,pos 所属的域是明确的,即这两个字符共同所属的域。当 pos 位于域的边界时,它属于哪个域取决于其两侧字符 field 属性的粘性(see 文本属性的粘性)。在 pos 处插入文本会继承的属性所对应的域,即为包含 pos 的域。

存在一种特殊情况:在 pos 处新插入的文本不会从任何一侧继承 field 属性。这种情况发生在前一个字符的 field 属性不具备后粘性,且后一个字符的 field 属性不具备前粘性时。此时,pos 既不属于前一个域,也不属于后一个域;域相关函数会将其视为属于一个空域,该域的起始和结束位置均为 pos

在所有这些函数中,如果 pos 被省略或为 nil,则默认使用点的位置。如果启用了缩窄,pos 应当位于可访问区域内。See 范围限制

Function: field-beginning &optional pos escape-from-edge limit

该函数返回 pos 所指定域的起始位置。

如果 pos 位于其所在域的起始位置,且 escape-from-edgenil,则返回值始终为在 pos结束的前一个域的起始位置,而不考虑 pos 周围 field 属性的粘性。

如果 limitnil,则它是一个缓冲区位置;如果域的起始位置在 limit 之前,则返回 limit

Function: field-end &optional pos escape-from-edge limit

该函数返回 pos 所指定域的结束位置。

如果 pos 位于其所在域的结束位置,且 escape-from-edgenil,则返回值始终为在 pos开始的后一个域的结束位置,而不考虑 pos 周围 field 属性的粘性。

如果 limitnil,则它是一个缓冲区位置;如果域的结束位置在 limit 之后,则返回 limit

Function: field-string &optional pos

该函数以字符串形式返回 pos 所指定域的内容。

Function: field-string-no-properties &optional pos

该函数以字符串形式返回 pos 所指定域的内容,并丢弃文本属性。

Function: delete-field &optional pos

该函数删除 pos 所指定域内的文本。

Function: constrain-to-field new-pos old-pos &optional escape-from-edge only-in-line inhibit-capture-property

该函数将 new-pos 约束在 old-pos 所属的域内,换句话说,它返回与 new-pos 最接近、且与 old-pos 位于同一域的位置。

如果 new-posnil,则 constrain-to-field 使用点的位置,并在返回该位置的同时将点移动到该位置。

如果 old-pos 位于两个域的边界,则可接受的最终位置取决于参数 escape-from-edge。如果 escape-from-edgenil,则 new-pos 必须位于这样一个域中:该域的 field 属性与在 old-pos 处插入新字符时会继承的属性相同(这取决于 old-pos 前后字符 field 属性的粘性)。如果 escape-from-edgenil,则 new-pos 可以位于相邻的两个域中的任意位置。此外,如果两个域之间被一个具有特殊值 boundary 的域分隔,则该特殊域内的任意位置也被视为位于边界上。

像不带参数的 C-a 这类通常会向后移动到特定位置并停留在那里的命令,可能应当为 escape-from-edge 指定 nil。其他检查域的移动命令则通常应当传入 t

如果可选参数 only-in-linenil,且按常规方式约束 new-pos 会使其移动到另一行,则直接返回未约束的 new-pos。这用于按行移动的命令,如 next-linebeginning-of-line,使它们仅在仍能移动到目标行的情况下才遵守域边界。

如果可选参数 inhibit-capture-propertynil,且 old-pos 处存在该名称的非 nil 属性,则忽略所有域边界。

通过将变量 inhibit-field-text-motion 绑定为非 nil 值,可以让 constrain-to-field 忽略所有域边界,从而不进行任何约束。