34.1 文本搜索

基于文本的搜索

这一小节介绍几个基础的搜索函数。这些函数可以交互性的使用。如果你交互性的使用这些函数,那么,这些函数会在交互的过程中提示被搜索的词语,并且它们的参数 limit 和 noerror 都默认为 nil,repeat 默认为 1。想要更详细的交互式用法,请查阅 GNU Emacs Manual 中的 搜索和替换章节。

如果当前缓冲区为多字节,那么这些搜索函数会返回多字节的搜索结果;如果是单字节,那返回的结果就是单字节。

Command: search-forward string &optional limit noerror count 这个函数从当前位置点开始向前进行精确匹配。如果搜索到了,那么 Emacs 会立刻把当前位置点转移到咪表位置,然后返回位置点的新位置。如果没有查找到,那么返回值和副作用具体取决于 参数 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 应在当前缓冲区的编辑范围之内。在限定范围外不会进行搜索。如果这个参数被忽略或者为 il,那么默认会把限定位置放在缓冲区的末尾。

当搜索失败时,具体会发生什么,取决于参数 noerror 的值。如果 noerror 值为 nil,那么搜索失败时会抛出 search-failed 错误。如果 noerror 值为 t,那么在搜索失败时,search-forward 会返回 nil,然后啥也不做。如果 noerror 既不是 nil,也不是 t,那么 search-forward 会把位置点移到上界,然后返回 nil。

参数 noerror 只会影响合法的搜索,在合法的搜索中失败是发挥作用。而不合法的参数抛出的错误和 noerror 没啥关系。

如果参数 count 时一个正的整数 n,那么函数会搜索 n 次;其中每次搜索都会从上一次成功搜索的位置开始新的搜索。如果每次搜索都成功,那么会这次函数调用就是成功的,并且会将位置点移到最新的搜索位置上。否则,称这次函数调用是失败的。而搜索失败了具体会发生什么,会取决于 noerror 的值。如果 count 是个负数 -n,那么搜索就会按照反方向进行 n 次。

Command: search-backward string &optional limit noerror count 这个函数从当前位置点向前搜索字符串。这个函数看起来和 search-forward 非常像,只不过它的搜索方向是反过来的。反向搜索最后会把位置点放在匹配位置的开头。

Command: word-search-forward string &optional limit neorror count 这个函数从当前位置点开始搜索目标单词。当它搜索成功时,它会把位置点放在匹配单词的末尾,然后返回位置点的位置。

单词匹配会将 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,那么它的值必须要在当前缓冲区的编辑范围内。limit 参数指明了搜索的上确界。超出上确界的文本将不会被搜索。

如果参数 noerror 的值为 nil,那么当搜索不到时,函数会抛出一个 word-search-forward 错误。如果 noerror 的值为 t,那么函数会返回 nil,而不是抛出错误。如果 noerror 既不是 nil,也不是 t,那么最终会将位置点移到 limit 位置(或者是编辑范围的最后位置),然后返回 nil。

如果 count 是一个正整数,那么函数会明确进行多少次成功匹配。最终的位置点会停在最后一次成功匹配的末尾。如果 count 是一个负数,那么搜索就会反向进行,最后位置点会停留在最后一次成功匹配的开头。

在内部的实现中,word-search-forward 和相关的函数使用了 word-search-regexp 函数将 string 转换为忽略标点的相应正则匹配。

Command: word-search-forward-lax string &optional limit noerror count 这个函数和 word-search-forward 差不多,不过这个函数不需要强制匹配到单词结尾。举个例子,用来搜索 'ball boy' 的函数可以匹配到 'ball boyee', 但是不能匹配 'balls boy'。

Command: word-search-backward string &optional limit noerror count 这个函数用于从当前位置点反向匹配字符串。这个函数简直和 word-search-forward 如出一辙。只不过这个函数的搜索方向是反过来的。而且正常情况下会把位置点停留在匹配位置的开头。

Command: word-search-backward-lax string &optional limit noerror count 这个函数和 word-search-backward 差不多,和 word-search-backward-lax 也差不多,读者自己分析吧。(这个手册也太详细了,要是我的高等代数课本有这手册一半的详尽,也不至于上不了85)

最后更新于