这个答案说:
Vim 的撤销/重做系统是无与伦比的。键入一些内容,撤消,键入其他内容,您仍然可以取回您键入的第一个内容,因为 Vim 使用的是撤消树而不是堆栈。在几乎所有其他程序中,您输入的第一件事的历史都会在这种情况下丢失。
这是我第一次听说这个。我怎样才能沿着树回溯?
另请参阅:h undo-redo
,其中列出了所有命令及其用法。
有两种方法可以遍历撤消树。一是“回到过去”。 g+
并将g-
按时间顺序或逆时间顺序遍历树中的所有节点(这可能有点令人困惑,因为它可以在撤消分支之间任意跳转,但如果你做g-
的时间足够长,你总会到达你需要去的地方最终)。 :earlier
并:later
取一个时间描述符,如7m
or 1h
;再次,这可以在撤消分支之间任意跳转。
:undo n
另一种方法是使用where n
is a number of an action跳转到树中的特定节点。(所有操作,即文本添加、删除、替换,都按顺序编号。)您可以通过 查找撤消树的叶子上的操作数:undolist
。这将使您轻松地在分支之间跳跃。然后,您可以使用u
andCtrl-R
上下移动该分支。
Vim 帮助中有一些很好的例子。弄清楚它是如何工作的最好方法是稍微玩一下。
我参加聚会有点晚了,
但我想我会提到我为 Vim 编写了一个撤消树可视化插件:
https ://github.com/sjl/gundo.vim
就我个人而言,我发现像这样绘制树是我理解它的唯一方法。
此页面解释了您需要了解的所有内容:
如果您使用的是 vim,您可以使用以下命令浏览撤消树:
u
:(撤消)在撤消树中移回Ctrl+R
:(重做)在撤消树中向前移动及时将文件带回或转发的其他方式:
:earlier 15m
: 时光倒流 15 分钟:later 15m
: 及时前移 15 分钟我知道这个问题已经得到解答,但我想我会添加一个例子。
创建一个新文件并键入:
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
g+
除了使用gundo.vim我还想提一下g-
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