How is the undo tree used in Vim?

This answer says:

Vim's undo/redo system is unbeatable. Type something, undo, type something else, and you can still get back the first thing you typed because Vim uses an undo tree rather than a stack. In almost every other program, the history of the first thing you typed is lost in this circumstance.

This is the first I hear of this. How can I backtrack along the tree?

30630 次浏览

这一页解释了你需要知道的一切:

Http://vimdoc.sourceforge.net/htmldoc/usr_32.html

另请参阅 :h undo-redo,其中列出了所有命令及其用法。

遍历撤消树有两种方法。一个是“回到过去”。g+g-将按照时间顺序或逆时间顺序遍历树中的所有节点(这可能有点混乱,因为它可以在撤消分支之间任意跳转,但是如果你做 g-的时间足够长,你最终总会到达你需要去的地方)。:earlier:later采用类似于 7m1h的时间描述符; 这同样可以在撤消分支之间任意跳转。

另一种方法是使用 :undo n跳转到树中的特定节点,其中 n是一个操作数。(所有的操作,例如文本添加、删除、替换,都会在您执行时按顺序编号。)您可以通过 :undolist查找撤销树叶子上的操作数。这样你就可以轻松地在树枝间跳来跳去。然后可以使用 uCtrl-R在该分支上下移动。

在 Vim 帮助中有一些很好的例子。最好的方法就是玩一玩。

如果使用 vim,可以使用以下方法在撤消树中导航:

  • (撤消)移回撤消树中
  • (重做)在撤消树中向前移动

其他将文件及时送回或提前的方法:

  • 倒退15分钟
  • 15分钟后向前移动

我来晚了,
但我想我应该提一下,我为 Vim 写了一个撤销树可视化插件:
Https://github.com/sjl/gundo.vim

就我个人而言,我发现像这样画树是我能理解它的唯一方法。

除了使用 gundo.vim 之外,我还想提到 g+g-

我知道这个问题已经得到了回答,但我想我应该加一个例子。

创建一个新文件并键入:

this is a line

undol将显示撤消树。此时您还没有撤消任何操作

:undol


number changes  when               saved
1       1  14:50:36

现在按 ESC 键并将该行修改为:

this is a old line

切换到正常模式,并按 u (撤消) ,这应该删除“旧”。如果检查 undol,此时您仍然只有一个分支。

现在修改一下这句话:

this is a new line

现在 :undol显示:

number changes  when               saved
2       2  87 seconds ago
3       2  3 seconds ago

您可以通过键入

:u 2

这将把你移动到与数字2相关联的分支的末端。你可以用 g+g-沿着这个分支移动。在这一点上 g+将什么也不做(你在叶子)。如果按 g-,“ old”将被删除(您正在遍历第一个撤消树)。也就是说,如果你删除“旧”与 g-和按 g+再次,“旧”将被重做。

如果你打字的话

:u 3

您将跳转到第二个撤消分支的叶子,它将显示:

this is a new line

Undotree是用纯 vimscript 编写的,因此不需要。

趁现在还来得及,把这个加到你的 Vimrc 上:

  set nobackup
set noswapfile
set nowritebackup
set undolevels=10000         " use many levels of undo
set history=10000    " After nocompatible


if has('persistent_undo')
set undodir=$HOME/.vim/undo
set undofile
endif

enter image description here