14.5 查找文件

在Emacs中查找文件,您可以使用C-x C-ffind-file)命令。这个命令几乎完全符合长度问题,但还需要稍作调整。

让我们看一下find-file的源代码:

(defun find-file (filename)
  "编辑文件 FILENAME。
切换到访问文件 FILENAME 的缓冲区,如果不存在则创建一个。"
  (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不会切换其注意力(或者如果您正在使用find-file-noselect,那么是您的注意力)到选定的缓冲区。这就是switch-to-buffer的作用:它切换Emacs关注的缓冲区;并且将窗口中显示的缓冲区切换到新的缓冲区。我们已经在其他地方讨论了缓冲区切换。 (See 切换缓冲区。)

在这个直方图项目中,我们不需要在屏幕上显示每个文件,因为程序确定其中每个定义的长度。我们可以使用set-buffer而不是switch-to-buffer,后者会将屏幕上的缓冲区重新显示。因此,我们不必调用find-file来执行这项任务,而是必须编写我们自己的表达式。

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