如何使用VIM的撤消树?

Nat*_*man 129 vim undo

这个答案说:

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

这是我第一次听到这个.我怎么能沿着树回溯呢?

Bri*_*per 138

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

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

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

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

  • 你能合并分支吗?(我在开玩笑) (38认同)
  • 有点儿.查找:h undojoin (36认同)
  • Vim太棒了,它甚至实现了我们开玩笑的方式! (19认同)
  • 我不知道如何使用这个撤销树,但我知道它有一天会挽救我的生命.嗯,这一天到来了.谢谢!! (3认同)
  • @Pod看起来`undojoin`与分支无关;事实上,下一个帮助部分一开始就说“上面我们只讨论了一行撤消/重做。但也可以进行分支。” 有没有什么方法可以对我没有看到的分支使用“undojoin”? (2认同)

Ste*_*osh 68

I'm a bit late to the party, but I figured I'd mention that I wrote an undo tree visualization plugin for Vim: http://bitbucket.org/sjl/gundo.vim/

Personally I found that graphing the tree like this was the only way I could make sense of it.


Sol*_*ogi 16

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

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


Wad*_* M. 15

如果您正在使用vim,则可以使用以下命令在undo树中导航:

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

将文档及时返回或转发的其他方法:

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

  • 此答案仅说明如何在一个分支上前进和后退。不是如何在分支之间移动。 (2认同)

Ale*_*der 8

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

创建一个新文件并键入:

this is a line
Run Code Online (Sandbox Code Playgroud)

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

:undol

number changes  when               saved
     1       1  14:50:36
Run Code Online (Sandbox Code Playgroud)

现在按ESC并将行修改为:

this is a old line
Run Code Online (Sandbox Code Playgroud)

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

现在修改该行,使其说:

this is a new line
Run Code Online (Sandbox Code Playgroud)

现在:undol显示:

number changes  when               saved
     2       2  87 seconds ago
     3       2  3 seconds ago
Run Code Online (Sandbox Code Playgroud)

您可以通过键入切换到第一个分支

:u 2
Run Code Online (Sandbox Code Playgroud)

这会将您移动到与数字2关联的分支的末尾.您可以使用g+和移动此分支g-.在这一点上g+什么都不做(你在叶子).如果您按g-"旧"将被删除(您正在遍历第一个撤消树).即如果您删除"旧" g-g+再次按,"旧"将重做.

如果你输入

:u 3
Run Code Online (Sandbox Code Playgroud)

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

this is a new line
Run Code Online (Sandbox Code Playgroud)


tin*_*ino 5

undotree包是用纯 vim 脚本编写的,因此没有要求。

并在为时已晚之前将其添加到您的 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 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述