141

这个答案说:

Vim 的撤销/重做系统是无与伦比的。键入一些内容,撤消,键入其他内容,您仍然可以取回您键入的第一个内容,因为 Vim 使用的是撤消树而不是堆栈。在几乎所有其他程序中,您输入的第一件事的历史都会在这种情况下丢失。

这是我第一次听说这个。我怎样才能沿着树回溯?

4

8 回答 8

154

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

有两种方法可以遍历撤消树。一是“回到过去”。 g+并将g-按时间顺序或逆时间顺序遍历树中的所有节点(这可能有点令人困惑,因为它可以在撤消分支之间任意跳转,但如果你做g-的时间足够长,你总会到达你需要去的地方最终)。 :earlier:later取一个时间描述符,如7mor 1h;再次,这可以在撤消分支之间任意跳转。

:undo n另一种方法是使用where nis a number of an action跳转到树中的特定节点。(所有操作,即文本添加、删除、替换,都按顺序编号。)您可以通过 查找撤消树的叶子上的操作数:undolist。这将使您轻松地在分支之间跳跃。然后,您可以使用uandCtrl-R上下移动该分支。

Vim 帮助中有一些很好的例子。弄清楚它是如何工作的最好方法是稍微玩一下。

于 2009-07-06T20:09:07.523 回答
73

我参加聚会有点晚了,
但我想我会提到我为 Vim 编写了一个撤消树可视化插件:
https ://github.com/sjl/gundo.vim

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

于 2010-10-18T22:24:16.513 回答
18

此页面解释了您需要了解的所有内容:

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

于 2009-07-06T19:48:42.977 回答
17

如果您使用的是 vim,您可以使用以下命令浏览撤消树:

  • u:(撤消)在撤消树中移回
  • Ctrl+R:(重做)在撤消树中向前移动

及时将文件带回或转发的其他方式:

  • :earlier 15m: 时光倒流 15 分钟
  • :later 15m: 及时前移 15 分钟
于 2009-07-06T20:12:59.170 回答
12

我知道这个问题已经得到解答,但我想我会添加一个例子。

创建一个新文件并键入:

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”将被删除(您正在遍历第一个撤消树)。也就是说,如果您删除“old”g-并再次按g+,“old”将被重做。

如果你输入

:u 3

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

this is a new line
于 2014-05-25T22:15:49.910 回答
8

这里总结了很多:

http://vim.wikia.com/wiki/Using_undo_branches

于 2012-01-16T23:21:47.740 回答
4

g+除了使用gundo.vim我还想提一下g-

于 2014-01-30T09:00:02.173 回答
4

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 

在此处输入图像描述

于 2019-12-10T15:16:19.407 回答