如何使用VIM的撤消树?

时间:2009-07-06 19:41:32

标签: vim undo

This answer说:

  

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

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

8 个答案:

答案 0 :(得分:133)

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

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

另一种方法是使用1h跳转到树中的特定节点,其中:undo n是一个动作的数字。 (所有操作,即文本添加,删除,替换,都按顺序编号。)您可以通过n查找撤消树叶子上的操作数。这将让您轻松地在分支之间跳转。然后,您可以使用:undolistu来上下移动该分支。

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

答案 1 :(得分:67)

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

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

答案 2 :(得分:15)

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

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

答案 3 :(得分:14)

如果您正在使用vim,则可以使用以下方法浏览撤消树:

  • u :(撤消)返回撤消树
  • Ctrl+R :(重做)在撤消树中前进

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

  • :earlier 15m:及时回到15分钟
  • :later 15m:及时前进15分钟

答案 4 :(得分:7)

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

创建一个新文件并输入:

this is a line

undol将显示撤消树。此时你还没有撤消任何东西

:undol

number changes  when               saved
     1       1  14:50:36

现在按ESC并将行修改为:

this is a old line

切换到正常模式并按u(撤消),这应该删除" old"。如果您选中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

答案 5 :(得分:6)

答案 6 :(得分:3)

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

答案 7 :(得分:2)

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