本节介绍通常用于访问文件的函数。由于历史原因,这些函数的名称以 ‘find-’ 开头,而非 ‘visit-’。有关获取框架的被访问文件名、或根据被访问文件名查找已有框架的函数与变量,参见 Buffer File Name。
在 Lisp 程序中,若你只想查看文件内容而不修改它,最快的方式是在临时框架中使用 insert-file-contents。访问文件并非必需,且速度更慢。参见 从文件读取。
该命令选中一个访问文件 filename 的框架;若已有对应框架则直接使用,否则创建新框架并将文件读入其中。它同时返回该框架。
除一些技术细节外,find-file 函数的主体大致等价于:
(switch-to-buffer (find-file-noselect filename nil nil wildcards))
(参见 Switching to a Buffer in a Window 中的 switch-to-buffer。)
若 wildcards 非 nil(交互式调用时恒为真),则 find-file 会展开 filename 中的通配符,并访问所有匹配的文件。
当以交互式方式调用 find-file 时,它会在迷你缓冲区中提示输入 filename。
该命令与 find-file 类似,会访问 filename,但不执行任何格式转换(see 文件格式转换)、字符编码转换(see Coding Systems)或行尾转换(see End of line conversion)。
访问该文件的框架会被设为单字节模式,且主模式为基本模式,与文件名无关。文件中的文件局部变量设置(see 文件局部变量)会被忽略;同时禁用自动解压,以及因 require-final-newline(see require-final-newline)在文件末尾自动添加换行的行为。
注意:若 Emacs 中已有以普通方式访问同一文件的框架,则不会以字面量方式重新访问,而是直接切换到已有框架。若你确保以字面量方式读取文件内容,应创建临时框架,再使用 insert-file-contents-literally 将文件内容读入其中(see 从文件读取)。
该函数是所有文件访问函数的核心。它返回一个访问文件 filename 的框架。你可以自行将该框架设为当前框架或在窗口中显示,但该函数本身不会这样做。
若已有对应框架,函数会直接返回该框架;否则创建新框架并读入文件。当 find-file-noselect 使用已有框架时,会先检查文件自上次在该框架中访问或保存后是否被修改(除非 nowarn 非 nil,见下文)。若文件已变更,函数会询问用户是否重新读取已修改的文件。若用户选择 ‘yes’,框架中此前的编辑内容将丢失。
读取文件过程包括对文件内容进行解码(see Coding Systems),其中包含行尾转换与格式转换(see 文件格式转换)。若 wildcards 非 nil,则 find-file-noselect 会展开 filename 中的通配符,并访问所有匹配的文件。
该函数会在多种特殊情况下显示警告或提示信息,除非可选参数 nowarn 非 nil。例如,当需要创建框架但不存在名为 filename 的文件时,它会在回显区显示信息 ‘(New file)’,并保持框架为空。若 nowarn 非 nil,文件上次修改时间的校验也会被跳过。
find-file-noselect 通常在读取文件后调用 after-find-file(see 访问文件的子例程)。该函数会设置框架主模式、解析局部变量,若存在比刚访问文件更新的自动保存文件则提醒用户,最后运行 find-file-hook 中的函数。
若可选参数 rawfile 非 nil,则不会调用 after-find-file,文件不存在时也不会运行 find-file-not-found-functions。此外,非 nil 的 rawfile 会禁用编码系统转换与格式转换。
find-file-noselect 通常返回访问文件 filename 的框架。但如果实际使用并展开了通配符,则返回一个访问各对应文件的框架列表。
(find-file-noselect "/etc/fstab")
⇒ #<buffer fstab>
该命令选中访问文件 filename 的框架,但会在当前选中窗口之外的另一窗口中显示。它可能使用已有其他窗口或拆分窗口,参见 Switching to a Buffer in a Window。
以交互式方式调用该命令时,会提示输入 filename。
该命令与 find-file 类似,选中访问文件 filename 的框架,但会将框架标记为只读。相关函数与变量参见 Read-Only Buffers。
以交互式方式调用该命令时,会提示输入 filename。
若该变量非 nil,则各个 find-file 命令会检查通配符并访问所有匹配的文件(交互式调用或其 wildcards 参数非 nil 时)。若该选项为 nil,则 find-file 系列命令会忽略 wildcards 参数,永远不会特殊处理通配符。
该变量的值是一个函数列表,会在访问文件后被调用。钩子运行前,文件的局部变量设置(若有)已被处理完毕。钩子函数运行时,访问该文件的框架为当前框架。
该变量是一个常规钩子。参见 钩子。
该变量的值是一个函数列表,当 find-file 或 find-file-noselect 传入不存在的文件名时会被调用。find-file-noselect 检测到文件不存在时会立即按列表顺序调用这些函数,直到其中一个返回非 nil。此时 buffer-file-name 已经设置完成。
它并非常规钩子,因为函数的返回值会被使用,且多数情况下只会调用列表中的部分函数。
该框架局部变量若被设为非 nil 值,会使 save-buffer 表现为框架以字面量方式访问文件,即不进行任何格式转换。命令 find-file-literally 会设置该变量的局部值,其他等效函数与命令也可如此设置,例如避免在文件末尾自动添加换行。该变量为永久局部变量,因此不会随主模式切换而改变。