VIM的撤消树如何使用?


132

这个答案说:

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

这是我第一次听说。我如何沿树后移?


1
嫉妒的Emacs用户可能希望了解undo-tree-mode
亚伦·米勒

Answers:


142

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

遍历撤消树有两种方法。一种是“回到过去”。 g+并且g-会按时间顺序或逆时间顺序遍历树中的所有节点(这可能有点令人困惑,因为它可以在撤消分支之间任意跳转,但是如果您做的g-时间足够长,那么总会到达需要的位置最终)。 :earlier:later采用时间描述符,例如7m1h;同样,这可以使您在撤消分支之间任意跳转。

另一种方法是使用:undo nwhere n动作数跳到树中的特定节点。(所有动作,即文本的添加,删除,替换,都按照您执行的顺序编号。)您可以通过来在撤消树的叶子上查找动作的数量:undolist。这将使您轻松地在分支之间跳转。然后u,您可以使用和Ctrl-R在该分支上上下移动。

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


43
你可以合并分支吗?(我在开玩笑)
he_the_great 2010年

40
有点。查一查:H undojoin
波德

23
Vim太棒了,它甚至实现了我们开玩笑的方式!
andyortlieb

4
我不知道如何使用此撤消树,但我知道有一天它将挽救我的生命。好,这一天到了。谢谢!!
ndvo 2013年

1
@Pod看起来undojoin与分支无关;实际上,下一个帮助部分首先说:“上面我们只讨论了一行撤消/重做。但是也可以分支。” 有什么方法可以undojoin与我没看到的分支一起使用?
Kyle Strand



16

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

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

使文档及时回退的其他方式:

  • :earlier 15m:向后移15分钟
  • :later 15m:及时向前移动15分钟

2
此答案仅说明如何在一个分支上前进和后退。不是如何在分支之间移动。
乔纳森·哈特利

这将在所有分支上移动,并按时间顺序对所有点进行排序。参见@Br​​ianCarper的答案。
Holloway

@JonathanHartley,如果您正在使用earlier并且later它不会跨分支移动。我希望大多数人不关心或记住他们创建的各个分支。但是只是想回到过去。如果您想创建分支并命名,git最好使用版本控制系统。
alpha_989 '18

@ alpha_989您对版本控制的评论没有任何意义。版本控制用于磁盘上命名文件的状态。我们正在谈论Vim的撤消树,它只是内存中的数据结构。他们俩都使用“分支”这个词,但这并不意味着同一件事。
乔纳森·哈特利

多亏每个人指出,早先/晚些时候要跨分支移动!
乔纳森·哈特利

9

我知道已经回答了这个问题,但我想举个例子。

创建一个新文件并键入:

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

如果您输入

:u 3

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

this is a new line


3

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


3

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 

在此处输入图片说明

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.