Emacs 会定期保存你正在访问的所有文件,这一机制称为自动保存(auto-saving)。 自动保存可在系统崩溃时避免大量工作丢失。默认情况下,每输入 300 次按键或空闲约 30 秒后触发自动保存。 面向用户的自动保存说明参见 Auto-Saving: Protection Against Disasters in The GNU Emacs Manual。 本节介绍实现自动保存的函数及控制变量。
该缓冲区局部变量为当前缓冲区自动保存所用的文件名。若缓冲区无需自动保存,其值为 nil。
buffer-auto-save-file-name
⇒ "/xcssun/users/rms/lewis/#backups.texi#"
自动保存模式的模式命令,为缓冲区局部次要模式。启用自动保存模式后,缓冲区将开启自动保存功能。 调用规则与其他次要模式命令一致(see 编写次要模式的规范)。
与大多数次要模式不同,不存在 auto-save-mode 变量。
当 buffer-auto-save-file-name 非 nil 且 buffer-saved-size(见下文)非零时,自动保存模式启用。
该变量为一组转换规则,用于在生成自动保存文件名前对缓冲区文件名进行转换。
每条转换规则为形如 (regexp replacement [uniquify]) 的列表。
regexp 为匹配文件名的正则表达式,匹配成功后使用 replace-match 将匹配部分替换为 replacement。
若可选元素 uniquify 非 nil,自动保存文件名由转换后文件名的目录部分,
与原缓冲区文件名拼接而成,其中所有目录分隔符替换为 ‘!’ 以避免冲突。
(若文件系统会截断过长名称,该方式可能无法正常工作。)
若 uniquify 为 secure-hash-algorithms 成员之一,
Emacs 会对缓冲区文件名应用对应安全哈希算法生成非目录部分,避免文件名过长。
列表中的转换规则按顺序尝试,某条规则生效后结果即为最终结果,不再继续尝试后续规则。
默认值会将远程文件的自动保存文件放入临时目录(see 生成唯一文件名)。
在不支持长文件名的 MS-DOS 文件系统中,该变量始终被忽略。
该函数在 filename 符合自动保存文件名格式时返回非 nil 值。
其采用常规命名规则:以井号 ‘#’ 开头和结尾的文件名为自动保存文件名。
参数 filename 不应包含目录部分。
(make-auto-save-file-name)
⇒ "/xcssun/users/rms/lewis/#backups.texi#"
(auto-save-file-name-p "#backups.texi#")
⇒ 0
(auto-save-file-name-p "backups.texi")
⇒ nil
该函数返回当前缓冲区自动保存所用文件名,即在原文件名前后添加井号 ‘#’。
该函数不会检查变量 auto-save-visited-file-name(见下文),调用者应先判断该变量。
(make-auto-save-file-name)
⇒ "/xcssun/users/rms/lewis/#backups.texi#"
若该变量非 nil,Emacs 会将缓冲区自动保存至其所访问的原文件,
即自动保存与编辑文件为同一文件。通常该变量为 nil,
自动保存文件使用由 make-auto-save-file-name 生成的独立名称。
修改该变量后,已有缓冲区需下次重新启用自动保存模式时新值才会生效。
若自动保存模式已启用,自动保存会继续使用原文件名,直至再次调用 auto-save-mode。
注意:将该变量设为非 nil 不会改变自动保存与普通保存的区别,
例如缓冲区自动保存时不会运行 保存缓冲区 中所述的钩子。
若当前缓冲区自上次读取或保存后已执行自动保存,该函数返回 t。
该函数将当前缓冲区标记为已自动保存。缓冲区文本再次修改前不会重复自动保存。函数返回 nil。
该变量以输入事件次数为单位指定自动保存的触发频率。 每读取该数量的新增输入事件后,Emacs 对所有启用自动保存的缓冲区执行自动保存。 设为 0 可禁用基于输入字符数的自动保存。
该变量以秒为单位指定触发自动保存的空闲时间。 用户空闲达到该时长后,Emacs 对所有启用自动保存的缓冲区执行自动保存。 (若当前缓冲区较大,指定超时时间会随大小倍增,百万字节缓冲区的系数接近 4。)
若值为 0 或 nil,则不会因空闲触发自动保存,仅按 auto-save-interval 指定的输入事件次数触发。
该常规钩子在每次自动保存即将执行时运行。
若该变量非 nil,访问文件的缓冲区默认启用自动保存,否则不启用。
该函数对所有需要自动保存的缓冲区执行自动保存, 即保存所有启用自动保存且自上次自动保存后已修改的缓冲区。
若有缓冲区被自动保存,do-auto-save 通常会在回显区显示 ‘Auto-saving...’。
若 no-message 非 nil,则抑制该提示信息。
若 current-only 非 nil,仅对当前缓冲区执行自动保存。
若 delete-auto-save-files 非 nil,该函数删除当前缓冲区的自动保存文件。
每次保存缓冲区时都会调用该函数。
除非 force 非 nil,否则仅删除当前 Emacs 会话中、上次正式保存后生成的自动保存文件。
该变量由 delete-auto-save-file-if-necessary 使用。
若其非 nil,Emacs 在执行正式保存(保存至所访问文件)时删除自动保存文件,
可节省磁盘空间并清理目录。
若所访问文件名称已变更,该函数调整当前缓冲区的自动保存文件名, 并对当前会话中已生成的自动保存文件执行重命名。若文件名未变更,则不执行任何操作。
该缓冲区局部变量的值为缓冲区上次读取、保存或自动保存时的长度, 用于检测缓冲区大小是否大幅缩减,并据此关闭自动保存。
若值为 −1,表示因缓冲区大小显著减小,本缓冲区临时关闭自动保存。 显式保存缓冲区会为该变量存入正值,从而重新启用自动保存。 开启或关闭自动保存模式也会更新该变量,清除大小显著减小的标记。
若值为 −2,表示本缓冲区忽略大小变化,尤其不会因缓冲区大小变化临时关闭自动保存。
若该变量非 nil,指定用于记录所有自动保存文件名的文件。
每次 Emacs 执行自动保存时,会为每个启用自动保存的缓冲区写入两行信息:
第一行为所访问文件名称(无对应文件则为空),第二行为自动保存文件名。
Emacs 正常退出时会删除该文件;若 Emacs 崩溃,可通过该文件查找可能丢失工作的自动保存文件。
recover-session 命令使用该文件定位自动保存文件。
该文件默认位于用户主目录,以 ‘.saves-’ 开头,包含 Emacs 进程 ID 与主机名。
Emacs 读取初始化文件后,若你尚未将 auto-save-list-file-name 设为非 nil,
会基于此前缀并追加主机名与进程 ID 初始化该变量。
若在初始化文件中将其设为 nil,Emacs 则不会初始化 auto-save-list-file-name。