在Emacs中查找文件,您可以使用C-x C-f(find-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 f(describe-function
)查看其源代码。)
我展示的定义具有简短但完整的文档和交互规范,在您以交互方式使用命令时会提示您输入文件名。定义的主体包含两个函数,find-file-noselect
和 switch-to-buffer
。
根据C-h f(describe-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-noselect
和set-buffer
。