Emacs如何确定要撤消的工作单元

Joh*_*ook 29 emacs

输入命令时C-/,Emacs会将最近更改的某些部分撤消到缓冲区.当你C-/再次进入时,它会撤消另一部分工作.

我已经阅读了关于撤销Emacs手册条目,但它确切地说它是如何工作的模糊不清.手册说"连续字符插入命令通常组合在一起成为一个撤销记录",但它没有解释它如何决定构成一个组的字符插入命令的数量.它放在一个组中的字符数似乎是随机的.

任何人都可以解释Emacs用于将字符分组为撤消记录的算法吗?

Gar*_*ees 34

设置撤消边界的逻辑主要在self-insert-command其中实现cmds.c.你必须阅读完整故事的代码,但基本上:

  • 只要您输入字符,就会每20个字符键入一个撤消边界.
  • 但是,如果您发出不同的编辑命令(例如,您杀死一个单词),这会导致立即添加撤消边界,重置字符计数.
  • 某些"多毛"插入(由确定internal_self_insert)导致立即添加撤消边界,并重置字符计数.阅读代码,看起来好像是:(1)in overwrite-mode,如果你用一个宽度不同的字符覆盖一个字符,例如在标签上打字; (2)如果您插入的字符导致缩写被扩展; (3)如果您键入的字符导致auto-fill-mode插入缩进.
  • 此外,任何决定使用撤消边界的编辑命令都可以通过调用来请求它undo-boundary.这不会导致字符数重置.