如何在Evil中获得类似于Vim的撤消行为?


17

Evil中的默认撤消行为过于粗糙,因为它考虑了在进入插入模式和将其保留为一个编辑操作之间发生的任何事情。在一次插入过程中输入整个文本段落,然后执行撤消操作时,将删除整个段落。与此相反,只要在插入模式下通过输入文本以外的其他方式移动光标,Vim就会启动一个新的撤消单元。

Evil具有一个自定义变量,可用于获取更细粒度的撤消历史记录:

(setq evil-want-fine-undo t)

使用此设置,就像在Vim一样,在插入模式下移动光标时,Evil将启动一个新的撤消单元。但是,此设置也弄乱了替换操作的处理方式:如果使用替换单词cw,则必须撤消两次以还原原始单词:一次用于删除新单词,一次用于重新插入原始单词。这与Vim不一致,并且没有太大意义,因为replace应该是原子的。

问题:如何配置Evil和undo-tree以获得Vim的撤消行为?


在此处提交问题:bitbucket.org/lyro/evil/issues?status=new&status=open(Evil通常认为与vim的差异是bug)。
shosti 2014年

@shosti,您是对的,但是自定义变量的存在表明他们决定在当前情况下对该规则进行例外处理。无论如何,我都会提交一个错误。让我们看看发生了什么。
tmalsburg 2014年

我认为定制变量实际上是为了获得更多类似Emacs的撤消行为(Emacs不会以与vim相同的方式执行原子操作)。
shosti 2014年

Answers:


10

由于@shosti指出Evil认为与Vim行为的偏离是bug,因此我提交了一个bug,Evil的一位作者为以下行为添加了新的可能值evil-want-fine-undo

(setq evil-want-fine-undo 'fine)

使用此设置,在插入模式下移动光标时会获得新的撤消单位,但是替换操作将一步一步撤消。据我所知,这与Vim一致。有关详细信息,请参见此处


2
不再建议使用此解决方案,因为该'fine设置已被弃用。
tmalsburg '16

1

根据变量描述(请参阅参考资料C-h v evil-want-fine-undo),fine由于行为不一致,不再支持该值。

当我使用undo撤消拼写错误或上述设置有助于我进行分配时。

(setq evil-want-fine-undo t) 

我很难在组织表公式编辑中消除错误,因为如果要更改为*Edit Forumlas*with,则不必离开插入模式C-'


感谢更新。我要求重新打开Bitbucket上的问题。
tmalsburg '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.