在 Emacs 中查找文件使用 C-x C-f(find-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 f(describe-function)查看其源码。)
我展示的定义拥有简洁但完整的文档,以及交互式声明,在交互使用时会提示输入文件名。
定义体包含两个函数:find-file-noselect 与 switch-to-buffer。
根据 C-h f(describe-function 命令)显示的文档,find-file-noselect
函数将指定文件读入缓冲区并返回该缓冲区。(其最新版本也包含可选的 wildcards 参数,
以及用于直接读取文件和抑制警告消息的参数,这些可选参数与当前无关。)
但 find-file-noselect 并不会选中它存放文件的缓冲区。Emacs 不会将注意力
(以及使用该函数的用户)切换到选中的缓冲区。这正是 switch-to-buffer 的作用:
它将 Emacs 关注的缓冲区切换到新缓冲区,并将窗口中显示的缓冲区切换为新缓冲区。
我们在其他地方讨论过缓冲区切换。(See 切换缓冲区。)
在本直方图项目中,程序在计算每个定义长度时,无需在屏幕上显示每个文件。我们可以不使用
switch-to-buffer,而是使用 set-buffer,它将程序的注意力重定向到另一个
缓冲区,但不在屏幕上重新显示。因此,我们不能直接调用 find-file,必须编写
自己的表达式。
任务很简单:使用 find-file-noselect 与 set-buffer。