域是缓冲区中一段连续的字符范围,这些字符通过拥有相同的 field 属性值(使用 eq 比较)来标识,该属性可以是文本属性或覆盖层属性。本节介绍可用于操作域的专用函数。
你可以使用缓冲区位置 pos 来指定一个域。我们将每个域视为包含一段缓冲区位置,因此你指定的位置代表包含该位置的域。
当 pos 前后的字符属于同一个域时,pos 所属的域是明确的,即这两个字符共同所属的域。当 pos 位于域的边界时,它属于哪个域取决于其两侧字符 field 属性的粘性(see 文本属性的粘性)。在 pos 处插入文本会继承的属性所对应的域,即为包含 pos 的域。
存在一种特殊情况:在 pos 处新插入的文本不会从任何一侧继承 field 属性。这种情况发生在前一个字符的 field 属性不具备后粘性,且后一个字符的 field 属性不具备前粘性时。此时,pos 既不属于前一个域,也不属于后一个域;域相关函数会将其视为属于一个空域,该域的起始和结束位置均为 pos。
在所有这些函数中,如果 pos 被省略或为 nil,则默认使用点的位置。如果启用了缩窄,pos 应当位于可访问区域内。See 范围限制。
该函数返回 pos 所指定域的起始位置。
如果 pos 位于其所在域的起始位置,且 escape-from-edge 非 nil,则返回值始终为在 pos 处结束的前一个域的起始位置,而不考虑 pos 周围 field 属性的粘性。
如果 limit 非 nil,则它是一个缓冲区位置;如果域的起始位置在 limit 之前,则返回 limit。
该函数返回 pos 所指定域的结束位置。
如果 pos 位于其所在域的结束位置,且 escape-from-edge 非 nil,则返回值始终为在 pos 处开始的后一个域的结束位置,而不考虑 pos 周围 field 属性的粘性。
如果 limit 非 nil,则它是一个缓冲区位置;如果域的结束位置在 limit 之后,则返回 limit。
该函数以字符串形式返回 pos 所指定域的内容。
该函数以字符串形式返回 pos 所指定域的内容,并丢弃文本属性。
该函数删除 pos 所指定域内的文本。
该函数将 new-pos 约束在 old-pos 所属的域内,换句话说,它返回与 new-pos 最接近、且与 old-pos 位于同一域的位置。
如果 new-pos 为 nil,则 constrain-to-field 使用点的位置,并在返回该位置的同时将点移动到该位置。
如果 old-pos 位于两个域的边界,则可接受的最终位置取决于参数 escape-from-edge。如果 escape-from-edge 为 nil,则 new-pos 必须位于这样一个域中:该域的 field 属性与在 old-pos 处插入新字符时会继承的属性相同(这取决于 old-pos 前后字符 field 属性的粘性)。如果 escape-from-edge 非 nil,则 new-pos 可以位于相邻的两个域中的任意位置。此外,如果两个域之间被一个具有特殊值 boundary 的域分隔,则该特殊域内的任意位置也被视为位于边界上。
像不带参数的 C-a 这类通常会向后移动到特定位置并停留在那里的命令,可能应当为 escape-from-edge 指定 nil。其他检查域的移动命令则通常应当传入 t。
如果可选参数 only-in-line 非 nil,且按常规方式约束 new-pos 会使其移动到另一行,则直接返回未约束的 new-pos。这用于按行移动的命令,如 next-line 和 beginning-of-line,使它们仅在仍能移动到目标行的情况下才遵守域边界。
如果可选参数 inhibit-capture-property 非 nil,且 old-pos 处存在该名称的非 nil 属性,则忽略所有域边界。
通过将变量 inhibit-field-text-motion 绑定为非 nil 值,可以让 constrain-to-field 忽略所有域边界,从而不进行任何约束。