Vim的撤销/重做系统是无与伦比的。键入内容,撤消,键入其他内容,您仍然可以取回键入的第一个内容,因为Vim使用撤消树而不是堆栈。在几乎所有其他程序中,你输入的第一件事的历史在这种情况下都会丢失。
这是我第一次听到这个。我怎样才能沿着树回溯?
答案 0 :(得分:133)
另请参阅:h undo-redo
,其中列出了所有命令及其用法。
有两种方法可以遍历撤消树。一个是“回到过去”。 g+
和g-
将按时间顺序或反向时间顺序遍历树中的所有节点(这可能有点令人困惑,因为它可以在撤消分支之间任意跳转,但如果你这样做{{} 1}}足够长的时间,你总会到达你最终需要去的地方)。 g-
和:earlier
采用:later
或7m
等时间描述符;再次,这可以在撤销分支之间任意跳转。
另一种方法是使用1h
跳转到树中的特定节点,其中:undo n
是一个动作的数字。 (所有操作,即文本添加,删除,替换,都按顺序编号。)您可以通过n
查找撤消树叶子上的操作数。这将让您轻松地在分支之间跳转。然后,您可以使用:undolist
和u
来上下移动该分支。
Vim帮助中有一些很好的例子。找出它如何工作的最好方法是稍微玩一下。
答案 1 :(得分:67)
我参加聚会有点晚了,但我想我会提到我为Vim编写了一个撤销树可视化插件:http://bitbucket.org/sjl/gundo.vim/
就我个人而言,我发现像这样绘制树是我理解它的唯一方法。
答案 2 :(得分:15)
此页面介绍了您需要了解的所有内容:
答案 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