28.4 缓冲区文件名

缓冲区文件名(buffer file name)是该缓冲区中所关联文件的名称。当缓冲区未关联任何文件时,其缓冲区文件名为 nil。大多数情况下,缓冲区名与缓冲区文件名的非目录部分相同,但缓冲区文件名与缓冲区名是相互独立的,可以分别设置。 See 访问文件

Function: buffer-file-name &optional buffer

该函数返回 buffer 所关联文件的绝对文件名。如果 buffer 未关联任何文件,buffer-file-name 返回 nil 。如果未提供 buffer,则默认为当前缓冲区。

(buffer-file-name (other-buffer))
     ⇒ "/usr/user/lewis/manual/files.texi"
Variable: buffer-file-name

这个缓冲区局部变量保存当前缓冲区所关联文件的名称,如果未关联文件则为 nil。它是永久局部变量,不受 kill-all-local-variables 影响。

buffer-file-name
     ⇒ "/usr/user/lewis/manual/buffers.texi"

在不执行其他相关操作的情况下直接修改此变量的值存在风险。通常更建议使用 set-visited-file-name(见下文);该函数会完成一些诸如修改缓冲区名之类并非严格必需的操作,但另一些操作对避免 Emacs 出现混乱至关重要。

Variable: buffer-file-truename

这个缓冲区局部变量保存当前缓冲区所关联文件的规范化缩写真实路径,如果未关联文件则为 nil。它是永久局部变量,不受 kill-all-local-variables 影响。See 真实路径,以及 abbreviate-file-name

Variable: buffer-file-number

这个缓冲区局部变量保存当前缓冲区所关联文件的索引节点号与设备标识符,如果未关联文件或关联的文件不存在则为 nil。它是永久局部变量,不受 kill-all-local-variables 影响。

该值通常是形如 (inodenum device) 的列表。这组值可以在系统可访问的所有文件中唯一标识该文件。有关更多信息,请参见 文件属性 中的 file-attributes 函数。

如果 buffer-file-name 是符号链接,则 inodenumdevice 均指向该链接递归解析后的目标文件。

Function: get-file-buffer filename

该函数返回关联文件 filename 的缓冲区。如果不存在这样的缓冲区,则返回 nil。参数 filename 必须为字符串,会先展开(see 文件名展开相关函数),再与所有活动缓冲区的关联文件名进行比较。注意,缓冲区的 buffer-file-name 必须与展开后的 filename 完全匹配。该函数无法识别同一文件的其他名称。

(get-file-buffer "buffers.texi")
    ⇒ #<buffer buffers.texi>

在特殊情况下,可能存在多个缓冲区关联同一个文件名。此时该函数返回缓冲区列表中第一个匹配的缓冲区。

Function: find-buffer-visiting filename &optional predicate

功能与 get-file-buffer 类似,区别在于它可以返回 可能以不同名称 关联该文件的任意缓冲区。也就是说,缓冲区的 buffer-file-name 无需与展开后的 filename 完全一致,只需指向同一个文件即可。如果 predicate 为非 nil,则它应当是一个单参数函数,参数为关联 filename 的缓冲区。只有当 predicate 返回非 nil 时,该缓冲区才会被视为合适的返回值。如果找不到合适的缓冲区,find-buffer-visiting 返回 nil

Command: set-visited-file-name filename &optional no-query along-with-file

如果 filename 为非空字符串,此函数会将当前缓冲区所关联的文件名修改为 filename。(如果该缓冲区原本没有关联文件,则为其添加一个。)缓冲区 下一次 保存时将写入新指定的文件。

该命令会将缓冲区标记为已修改,因为在 Emacs 看来,其内容与 filename 的内容并不匹配,即便它原本与旧关联文件一致。它还会根据新文件名重命名缓冲区,除非新名称已被占用。

如果 filenamenil 或空字符串,则表示 “无关联文件”。此时 set-visited-file-name 会将缓冲区标记为无关联文件,且不修改缓冲区的修改状态标记。

通常情况下,如果已有缓冲区关联 filename,该函数会向用户请求确认。如果 no-query 为非 nil,则会跳过此确认步骤。如果已有缓冲区关联 filename,且用户确认或 no-query 为非 nil,该函数会通过在 filename 后追加 ‘<…>’ 包裹的数字来生成唯一的缓冲区名。

如果 along-with-file 为非 nil,表示假定原关联文件已被重命名为 filename。此时该命令不会修改缓冲区的修改状态标记,也不会修改由 visited-file-modtime 记录的文件最后修改时间(see 缓冲区修改时间)。如果 along-with-filenil,该函数会清除记录的最后修改时间,之后 visited-file-modtime 将返回零。

当以交互方式调用 set-visited-file-name 时,会在迷你缓冲区中提示输入 filename

Variable: list-buffers-directory

这个缓冲区局部变量用于为没有关联文件名的缓冲区指定一个字符串,在缓冲区列表中显示在原本应显示关联文件名的位置。Dired 缓冲区会使用该变量。