假设你打开了一个文件并在其缓冲区中进行了修改,与此同时,该文件在磁盘上被其他操作修改。 此时保存缓冲区会覆盖文件中的修改内容。虽然偶尔这可能是你想要的效果, 但通常这会导致重要信息丢失。因此,Emacs 会在保存文件前, 通过下述函数检查文件的修改时间。(有关如何查看文件修改时间的方法,详见 See 文件属性。)
该函数会将 buffer(默认值为当前缓冲区)记录的其所访问文件的修改时间, 与操作系统记录的该文件实际修改时间进行对比。 除非有其他进程在 Emacs 打开或保存该文件后对其进行了写入操作,否则这两个时间应当一致。
若文件的最新实际修改时间与 Emacs 记录的修改时间一致,该函数返回 t;否则返回 nil。
如果缓冲区没有记录的最新修改时间(即 visited-file-modtime 函数返回 0),该函数也会返回 t。
对于未访问任何文件的缓冲区,该函数始终返回 t——即便 visited-file-modtime 返回非 0 值。
例如,对于 Dired 缓冲区,该函数始终返回 t。
对于访问「不存在且从未存在过」的文件的缓冲区,该函数返回 t;
但对于访问的文件已被删除的文件访问类缓冲区,该函数返回 nil。
该函数会清空当前缓冲区所访问文件的最新修改时间记录。 因此,下次尝试保存该缓冲区时,Emacs 不会因文件修改时间不一致而发出警告。
该函数会在 set-visited-file-name 等「不应执行『避免覆盖已修改文件』常规检查」的特殊场景中被调用。
该函数返回当前缓冲区记录的文件最新修改时间,返回值为 Lisp 时间戳(see 时刻)。
若缓冲区没有记录的最新修改时间,该函数返回 0。这种情况包括:
缓冲区未访问任何文件,或通过 clear-visited-file-modtime 显式清空了修改时间记录。
但需注意,对于某些非文件类缓冲区,visited-file-modtime 也会返回时间戳。
例如,在列出目录的 Dired 缓冲区中,该函数会返回 Dired 记录的该目录的最新修改时间。
若缓冲区访问的文件不存在,该函数返回 −1。
该函数会更新缓冲区所访问文件的最新修改时间记录:
若 time 不为 nil,则更新为 time 指定的值;
否则更新为该文件的最新实际修改时间。
若 time 既非 nil,也非 visited-file-modtime 返回的整数标记,
则其应当是一个 Lisp 时间值(see 时刻)。
如果缓冲区并非通过常规方式从文件读取内容, 或文件因某些已知的良性原因发生了变更,该函数会非常实用。
当尝试修改访问文件 filename 的缓冲区,但该文件的磁盘版本比缓冲区文本更新时, Emacs 会调用该函数询问用户后续操作方式。Emacs 能检测到这种情况, 是因为磁盘上文件的修改时间晚于缓冲区最后一次保存的时间,且文件内容已发生变更—— 这意味着其他程序很可能修改了该文件。
根据用户的回答,该函数可能正常返回(此时缓冲区的修改操作会继续执行),
也可能抛出 file-supersession 错误(附带数据 (filename),此时不允许执行拟议的缓冲区修改操作)。
该函数会由 Emacs 在适当的时机自动调用。它的存在是为了让你能够通过重定义它来自定义 Emacs 行为。 标准定义可参见文件 userlock.el。
另请参见 文件锁 中的文件锁定机制。