14.5 查找文件

在 Emacs 中查找文件使用 C-x C-ffind-file)命令。该命令基本适用于长度统计任务, 但并非完全契合。

我们来看 find-file 的源码:

(defun find-file (filename)
  "Edit file FILENAME.
Switch to a buffer visiting file FILENAME,
creating one if none already exists."
  (interactive "FFind file: ")
  (switch-to-buffer (find-file-noselect filename)))

(最新版本的 find-file 函数定义允许指定可选通配符以打开多个文件;这使其定义更复杂, 此处不做讨论,因为与当前问题无关。你可以通过 M-.xref-find-definitions) 或 C-h fdescribe-function)查看其源码。)

我展示的定义拥有简洁但完整的文档,以及交互式声明,在交互使用时会提示输入文件名。 定义体包含两个函数:find-file-noselectswitch-to-buffer

根据 C-h fdescribe-function 命令)显示的文档,find-file-noselect 函数将指定文件读入缓冲区并返回该缓冲区。(其最新版本也包含可选的 wildcards 参数, 以及用于直接读取文件和抑制警告消息的参数,这些可选参数与当前无关。)

find-file-noselect 并不会选中它存放文件的缓冲区。Emacs 不会将注意力 (以及使用该函数的用户)切换到选中的缓冲区。这正是 switch-to-buffer 的作用: 它将 Emacs 关注的缓冲区切换到新缓冲区,并将窗口中显示的缓冲区切换为新缓冲区。 我们在其他地方讨论过缓冲区切换。(See 切换缓冲区。)

在本直方图项目中,程序在计算每个定义长度时,无需在屏幕上显示每个文件。我们可以不使用 switch-to-buffer,而是使用 set-buffer,它将程序的注意力重定向到另一个 缓冲区,但不在屏幕上重新显示。因此,我们不能直接调用 find-file,必须编写 自己的表达式。

任务很简单:使用 find-file-noselectset-buffer