33.10 维护撤销列表

本节介绍如何为指定缓冲区开启或关闭撤销信息记录,同时说明撤销列表如何被自动截断以避免体积过大。

新建缓冲区的撤销信息记录默认处于开启状态;但如果缓冲区名称以空格开头,则初始状态为关闭。 你可以通过下面两个函数显式开启或关闭撤销记录,也可以直接设置 buffer-undo-list

Command: buffer-enable-undo &optional buffer-or-name

该命令为缓冲区 buffer-or-name 开启撤销信息记录,使后续修改可以被撤销。 若未提供参数,则使用当前缓冲区。如果缓冲区已开启撤销记录,该函数不执行任何操作。返回 nil

交互调用时,buffer-or-name 固定为当前缓冲区,无法指定其他缓冲区。

Command: buffer-disable-undo &optional buffer-or-name

该函数丢弃缓冲区 buffer-or-name 的撤销列表,并禁止后续撤销信息记录。 结果是此前与之后的修改均无法撤销。若该缓冲区的撤销记录已关闭,则函数无效果。

交互调用时,BUFFER-OR-NAME 固定为当前缓冲区,无法指定其他缓冲区。函数返回 nil

随着编辑持续进行,撤销列表会越来越长。为避免占用全部可用内存,垃圾回收会将其修剪至你设定的大小限制。 (为此,撤销列表的大小统计包括构成列表的 cons 单元以及被删除文本的字符串。) 有三个变量控制可接受的大小范围:undo-limitundo-strong-limitundo-outer-limit。 这些变量中的大小以占用字节数计算,包含保存的文本与其他数据。

User Option: undo-limit

撤销列表可接受大小的软限制。超出该大小的修改组为最后保留的一组。

User Option: undo-strong-limit

撤销列表可接受大小的硬上限。超出该大小的修改组本身(以及所有更早的修改组)会被丢弃。 唯一例外是:最新的修改组仅在超出 undo-outer-limit 时才会被丢弃。

User Option: undo-outer-limit

若垃圾回收时当前命令的撤销信息超出此限制,Emacs 会丢弃该信息并显示警告。 这是防止内存溢出的最后一道限制。

User Option: undo-ask-before-discard

若该变量非空,当撤销信息超出 undo-outer-limit 时,Emacs 会在回显区询问是否丢弃。 默认值为 nil,即自动丢弃。

该选项主要用于调试。询问期间垃圾回收会被暂停,若用户等待过久未作答,可能导致 Emacs 内存泄漏。