8.1.3 search-forward 函数

search-forward 函数用于在 zap-to-char 中定位待删除的目标字符。如果搜索成功,search-forward 会将光标定位到目标字符串最后一个字符的紧后方。(在 zap-to-char 中,目标字符串仅有一个字符长度。zap-to-char 使用 char-to-string 函数确保计算机将该字符按字符串处理。)如果是反向搜索,search-forward 会将光标置于目标首个字符的紧前方。此外,search-forward 成功时返回 t 表示真。(因此移动光标是该函数的一个副作用。)

zap-to-char 中,search-forward 函数的调用形式如下:

(search-forward (char-to-string char) nil nil arg)

search-forward 函数接收四个参数:

  1. 第一个参数是搜索目标,即要查找的内容。该参数必须为字符串,例如 ‘"z"’。

    实际传入 zap-to-char 的参数是单个字符。由于计算机的底层设计,Lisp 解释器可能会将单个字符与字符字符串视为不同类型。在计算机内部,单个字符与长度为一的字符串具有不同的电子存储格式。(单个字符通常仅需一个字节即可存储;而字符串可能更长,计算机需要为此做好准备。)由于 search-forward 针对字符串进行搜索,因此 zap-to-char 接收的字符参数必须在计算机内部完成格式转换,否则 search-forward 将会执行失败。char-to-string 函数即用于完成这一转换。

  2. 第二个参数用于限定搜索范围,以缓冲区中的位置指定。本例中搜索可延伸至缓冲区末尾,因此不设置边界,第二个参数为 nil
  3. 第三个参数告知函数搜索失败时的处理方式 — 可以抛出错误(并打印信息)或返回 nil。若第三个参数为 nil,则函数会在搜索失败时抛出错误。
  4. search-forward 的第四个参数是重复次数,即需要查找目标字符串的出现次数。该参数为可选参数,若调用时未指定重复次数,则默认传入值为 1。若该参数为负数,则执行反向搜索。

模板形式下,search-forward 表达式结构如下:

(search-forward "target-string"
                limit-of-search
                what-to-do-if-search-fails
                repeat-count)

接下来我们介绍 progn