完整的 zap-to-char 实现

zap-to-char 函数删除光标位置(即 point)到下一个指定字符(包括该字符)之间的文本。zap-to-char 删除的文本被放入 kill ring,可以通过键入 C-yyank)从 kill ring 中检索。如果给命令传递了一个参数,它将通过指定数量的出现次数删除文本。因此,如果光标位于本句的开头,字符为 ‘s’,则将删除 ‘Thus’。如果参数为二,则将删除 ‘Thus, if the curs’,直到 ‘cursor’ 中的 ‘s’。

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

为了确定要删除多少文本,zap-to-char 使用搜索函数。搜索在处理文本的代码中广泛使用,我们将重点关注搜索以及删除命令。

下面是版本 22 的函数实现的完整文本:

(defun zap-to-char (arg char)
  "Kill up to and including ARG'th occurrence of CHAR.
Case is ignored if `case-fold-search' is non-nil in the current buffer.
Goes backward if ARG is negative; error if CHAR not found."
  (interactive "p\ncZap to 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”这个术语的含义。

zap-to-char 版本 22 的文档字符串使用 ASCII grave accent 和撇号引用一个符号,因此它显示为 `case-fold-search'。这种引用风格受到上世纪 70 年代显示器的启发,在那里 grave accent 和撇号经常是镜像图像,适合用作引号。在大多数现代显示器上,这不再成立,当这两个 ASCII 字符出现在文档字符串或诊断消息格式中时,Emacs 通常将它们转换为 弯引号(左右单引号),因此上面引用的符号显示为 ‘case-fold-search’。源代码字符串也可以直接使用弯引号。