如何在emacs的evil-mode中使用undo-tree更改撤销的粒度级别?

25

这里有一些不错的选择: emacs-24、evil-mode(使用vim绑定在emacs中)、和undo-tree。

然而,在编辑模式下(插入模式),我有时会进行多个插入、删除等操作,才离开插入模式。

"撤销"将整个插入(包括删除)作为一个编辑行为。例如,我无法仅撤销意外删除的段落而不撤消整个删除!

有没有办法解决这个问题?

以下是一些相关链接:

以下是vim映射,可以将某些vim命令转换为可撤销的命令:

inoremap <c-u> <c-g>u<c-u>
inoremap <c-w> <c-g>u<c-w>
inoremap <End> <C-g>u<End>
inoremap <BS> <c-g>u<BS>
inoremap <CR> <c-g>u<CR>
inoremap <del> <c-g>u<del>

需要的是在Emacs中使用evil undo-tree时,撤销模式能够跟踪除了离开插入模式以外的其他事件。例如,您应该能够长时间保持插入模式,然后撤销任何删除、剪切、粘贴等操作。


根据https://dev59.com/S2w15IYBdhLWcg3wd7pj,evil中的额外命令需要调用undo-boundary。 - justingordon
仅仅因为还没有被说过:“你应该像在热炭上奔跑一样对待插入模式;尽快离开那里。” - Cory Kendall
2个回答

22

尝试evil-want-fine-undo

是否将操作分为几个步骤来撤销。 有两种可能的选择:nil(“否”)表示在插入状态下进行的所有更改,包括更改操作后的可能删除,都被收集到单个撤销步骤中。 非nil(“是”)表示根据Emacs启发式确定撤销步骤,并且不尝试聚合更改。

(setq evil-want-fine-undo t)

这可能真的是答案!我会在一两天内告诉你。 - justingordon
太棒了,仍然救了我的一天!但是链接失效了 :/ - xeruf

1

这个问题是针对撤销树的吗?我不使用它,所以下面的可能不适用...

我不确定您是否可以修改撤销机制认为是单个单位的编辑量,但您可以做的是:

首先选择一个区域,然后键入撤销键,Emacs将仅撤消在该区域中进行的更改。

那非常有用。


这可能更多地与恶意模拟vim行为有关,需要进行上述修改。 - justingordon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接