以下是在缓冲区文本中进行搜索的底层函数。它们主要用于程序中,但也可以交互式调用。交互式调用时,函数会提示输入搜索字符串;参数 limit 和 noerror 默认为 nil,repeat 默认为 1。关于交互式搜索的更多说明,参见 see Searching and Replacement in The GNU Emacs Manual。
如果当前缓冲区是多字节(multibyte)模式,这些搜索函数会自动将搜索字符串转为多字节;若为单字节(unibyte)模式,则转为单字节。See 文本表示方式。
该函数从当前指针位置向后精确搜索 string。若搜索成功,会将指针移至匹配内容的末尾,并返回新的指针位置。若未找到匹配项,返回值与副作用取决于 noerror(见下文)。
下面示例中,指针初始位于行首。调用 (search-forward "fox") 后,指针移到 ‘fox’ 最后一个字母之后:
---------- Buffer: foo ---------- ∗The quick brown fox jumped over the lazy dog. ---------- Buffer: foo ----------
(search-forward "fox")
⇒ 20
---------- Buffer: foo ----------
The quick brown fox∗ jumped over the lazy dog.
---------- Buffer: foo ----------
参数 limit 指定搜索边界,应为当前缓冲区中的某个位置。任何超出该位置的匹配都不会被接受。若 limit 省略或为 nil,则默认为缓冲区可访问部分的末尾。
搜索失败后的行为取决于 noerror。若 noerror 为 nil,会抛出 search-failed 错误。若为 t,则返回 nil 且不做任何操作。若 noerror 既非 nil 也非 t,则将指针移至搜索上界并返回 nil。
noerror 仅影响有效但未找到匹配的搜索。无效参数无论 noerror 为何都会直接报错。
若 count 为正整数 n,则连续执行 n 次搜索;每次搜索都从上一次匹配的结尾开始。若全部连续搜索成功,函数调用成功,移动指针并返回新位置。否则调用失败,结果按上述 noerror 规则处理。若 count 为负整数 −n,则向相反方向(向前)执行 n 次搜索。
该函数从当前指针位置向前搜索 string。用法与 search-forward 类似,只是搜索方向相反。向前搜索会将指针停在匹配内容的开头。
该函数从当前指针位置向后对 string 进行单词匹配搜索。若找到匹配,将指针移至匹配末尾,并返回新指针位置。
单词匹配将 string 视为一串单词序列,忽略分隔它们的标点符号。它在缓冲区中搜索相同的单词序列。每个单词必须完整独立(搜索 ‘ball’ 不会匹配 ‘balls’),但标点和空格细节会被忽略(搜索 ‘ball boy’ 会匹配 ‘ball. Boy!’)。
下面示例中,指针初始在缓冲区开头,搜索后停在 ‘y’ 和 ‘!’ 之间:
---------- Buffer: foo ---------- ∗He said "Please! Find the ball boy!" ---------- Buffer: foo ----------
(word-search-forward "Please find the ball, boy.")
⇒ 39
---------- Buffer: foo ----------
He said "Please! Find
the ball boy∗!"
---------- Buffer: foo ----------
若 limit 非 nil,必须是当前缓冲区中的位置,指定搜索的上界。找到的匹配不能超出该位置。
若 noerror 为 nil,搜索失败时 word-search-forward 会抛出错误。若为 t,则返回 nil 而非报错。若为其他值,则将指针移至 limit(或缓冲区可访问部分末尾)并返回 nil。
若 count 为正数,指定连续搜索的次数。指针停在最后一次匹配的末尾。若为负数,则向前搜索,指针停在最后一次匹配的开头。
内部实现中,word-search-forward 及相关函数使用 word-search-regexp 将 string 转换为忽略标点的正则表达式。
该命令与 word-search-forward 完全相同,区别在于:除非 string 以空白开头或结尾,否则其开头或结尾不必匹配单词边界。例如,搜索 ‘ball boy’ 会匹配 ‘ball boyee’,但不会匹配 ‘balls boy’。
该函数从当前指针位置向前对 string 进行单词匹配搜索。用法与 word-search-forward 一致,只是方向相反,通常将指针停在匹配开头。
该命令与 word-search-backward 完全相同,区别在于放宽了单词边界匹配规则,规则同 word-search-forward-lax。