zap-to-char 完整实现

zap-to-char 函数会删除光标(即 point)位置到下一个指定字符(含该字符)之间的文本。被删除的文本会放入删除环,可通过 C-yyank)恢复。如果命令带参数,会删除到对应次数的字符位置。例如光标在本句开头,指定字符为 ‘s’,则 ‘Thus’ 会被删除;若参数为 2,则会删除到 ‘cursor’ 中的 ‘s’ 为止,即 ‘Thus, if the curs’。

如果未找到指定字符,zap-to-char 会提示“Search failed”并显示你输入的字符,不会删除任何文本。

为确定删除范围,zap-to-char 使用了搜索函数。搜索在文本处理代码中应用广泛,我们会重点讲解搜索与删除命令。

以下是 22 版中该函数的完整代码:

(defun zap-to-char (arg char)
  "删除至第 ARG 次出现的 CHAR 字符(含该字符)。
若当前缓冲区中 `case-fold-search' 非空,则忽略大小写。
ARG 为负时反向搜索;未找到 CHAR 则报错。"
  (if (char-table-p translation-table-for-input)
      (setq char (or (aref translation-table-for-input char) char)))
  (kill-region (point) (progn
                         (search-forward (char-to-string char)
                                         nil nil arg)
                         (point))))

文档说明十分详尽,你只需要理解“kill”一词在专业语境下的含义即可。

22 版中 zap-to-char 的文档字符串使用 ASCII 反引号和单引号引用符号,显示为 `case-fold-search'。这种引用方式源于 1970 年代的显示设备,当时反引号和单引号常互为镜像,适合作为引号。在现代大多数显示设备上已不再如此,因此当这两个 ASCII 字符出现在文档字符串或诊断信息中时,Emacs 通常会将其转换为 弯引号(curved quotes)(左右单引号),上述被引用符号会显示为 ‘case-fold-search’。源码字符串也可以直接使用弯引号。