27.2 自动保存

Emacs 会定期保存你正在访问的所有文件,这一机制称为自动保存(auto-saving)。 自动保存可在系统崩溃时避免大量工作丢失。默认情况下,每输入 300 次按键或空闲约 30 秒后触发自动保存。 面向用户的自动保存说明参见 Auto-Saving: Protection Against Disasters in The GNU Emacs Manual。 本节介绍实现自动保存的函数及控制变量。

Variable: buffer-auto-save-file-name

该缓冲区局部变量为当前缓冲区自动保存所用的文件名。若缓冲区无需自动保存,其值为 nil

buffer-auto-save-file-name
     ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
Command: auto-save-mode arg

自动保存模式的模式命令,为缓冲区局部次要模式。启用自动保存模式后,缓冲区将开启自动保存功能。 调用规则与其他次要模式命令一致(see 编写次要模式的规范)。

与大多数次要模式不同,不存在 auto-save-mode 变量。 当 buffer-auto-save-file-namenilbuffer-saved-size(见下文)非零时,自动保存模式启用。

Variable: auto-save-file-name-transforms

该变量为一组转换规则,用于在生成自动保存文件名前对缓冲区文件名进行转换。

每条转换规则为形如 (regexp replacement [uniquify]) 的列表。 regexp 为匹配文件名的正则表达式,匹配成功后使用 replace-match 将匹配部分替换为 replacement。 若可选元素 uniquifynil,自动保存文件名由转换后文件名的目录部分, 与原缓冲区文件名拼接而成,其中所有目录分隔符替换为 ‘!’ 以避免冲突。 (若文件系统会截断过长名称,该方式可能无法正常工作。)

uniquifysecure-hash-algorithms 成员之一, Emacs 会对缓冲区文件名应用对应安全哈希算法生成非目录部分,避免文件名过长。

列表中的转换规则按顺序尝试,某条规则生效后结果即为最终结果,不再继续尝试后续规则。

默认值会将远程文件的自动保存文件放入临时目录(see 生成唯一文件名)。

在不支持长文件名的 MS-DOS 文件系统中,该变量始终被忽略。

Function: auto-save-file-name-p filename

该函数在 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
Function: make-auto-save-file-name

该函数返回当前缓冲区自动保存所用文件名,即在原文件名前后添加井号 ‘#’。 该函数不会检查变量 auto-save-visited-file-name(见下文),调用者应先判断该变量。

(make-auto-save-file-name)
     ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
User Option: auto-save-visited-file-name

若该变量非 nil,Emacs 会将缓冲区自动保存至其所访问的原文件, 即自动保存与编辑文件为同一文件。通常该变量为 nil, 自动保存文件使用由 make-auto-save-file-name 生成的独立名称。

修改该变量后,已有缓冲区需下次重新启用自动保存模式时新值才会生效。 若自动保存模式已启用,自动保存会继续使用原文件名,直至再次调用 auto-save-mode

注意:将该变量设为非 nil 不会改变自动保存与普通保存的区别, 例如缓冲区自动保存时不会运行 保存缓冲区 中所述的钩子。

Function: recent-auto-save-p

若当前缓冲区自上次读取或保存后已执行自动保存,该函数返回 t

Function: set-buffer-auto-saved

该函数将当前缓冲区标记为已自动保存。缓冲区文本再次修改前不会重复自动保存。函数返回 nil

User Option: auto-save-interval

该变量以输入事件次数为单位指定自动保存的触发频率。 每读取该数量的新增输入事件后,Emacs 对所有启用自动保存的缓冲区执行自动保存。 设为 0 可禁用基于输入字符数的自动保存。

User Option: auto-save-timeout

该变量以秒为单位指定触发自动保存的空闲时间。 用户空闲达到该时长后,Emacs 对所有启用自动保存的缓冲区执行自动保存。 (若当前缓冲区较大,指定超时时间会随大小倍增,百万字节缓冲区的系数接近 4。)

若值为 0 或 nil,则不会因空闲触发自动保存,仅按 auto-save-interval 指定的输入事件次数触发。

Variable: auto-save-hook

该常规钩子在每次自动保存即将执行时运行。

User Option: auto-save-default

若该变量非 nil,访问文件的缓冲区默认启用自动保存,否则不启用。

Command: do-auto-save &optional no-message current-only

该函数对所有需要自动保存的缓冲区执行自动保存, 即保存所有启用自动保存且自上次自动保存后已修改的缓冲区。

若有缓冲区被自动保存,do-auto-save 通常会在回显区显示 ‘Auto-saving...’。 若 no-messagenil,则抑制该提示信息。

current-onlynil,仅对当前缓冲区执行自动保存。

Function: delete-auto-save-file-if-necessary &optional force

delete-auto-save-filesnil,该函数删除当前缓冲区的自动保存文件。 每次保存缓冲区时都会调用该函数。

除非 forcenil,否则仅删除当前 Emacs 会话中、上次正式保存后生成的自动保存文件。

User Option: delete-auto-save-files

该变量由 delete-auto-save-file-if-necessary 使用。 若其非 nil,Emacs 在执行正式保存(保存至所访问文件)时删除自动保存文件, 可节省磁盘空间并清理目录。

Function: rename-auto-save-file

若所访问文件名称已变更,该函数调整当前缓冲区的自动保存文件名, 并对当前会话中已生成的自动保存文件执行重命名。若文件名未变更,则不执行任何操作。

Variable: buffer-saved-size

该缓冲区局部变量的值为缓冲区上次读取、保存或自动保存时的长度, 用于检测缓冲区大小是否大幅缩减,并据此关闭自动保存。

若值为 −1,表示因缓冲区大小显著减小,本缓冲区临时关闭自动保存。 显式保存缓冲区会为该变量存入正值,从而重新启用自动保存。 开启或关闭自动保存模式也会更新该变量,清除大小显著减小的标记。

若值为 −2,表示本缓冲区忽略大小变化,尤其不会因缓冲区大小变化临时关闭自动保存。

Variable: auto-save-list-file-name

若该变量非 nil,指定用于记录所有自动保存文件名的文件。 每次 Emacs 执行自动保存时,会为每个启用自动保存的缓冲区写入两行信息: 第一行为所访问文件名称(无对应文件则为空),第二行为自动保存文件名。

Emacs 正常退出时会删除该文件;若 Emacs 崩溃,可通过该文件查找可能丢失工作的自动保存文件。 recover-session 命令使用该文件定位自动保存文件。

该文件默认位于用户主目录,以 ‘.saves-’ 开头,包含 Emacs 进程 ID 与主机名。

User Option: auto-save-list-file-prefix

Emacs 读取初始化文件后,若你尚未将 auto-save-list-file-name 设为非 nil, 会基于此前缀并追加主机名与进程 ID 初始化该变量。 若在初始化文件中将其设为 nil,Emacs 则不会初始化 auto-save-list-file-name


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike