usr_32

usr_32.txt 适用于 Vim 9.0 版本。 最近更新: 2010年7月 VIM 用户手册 - by Bram Moolenaar 译者: Willis 撤销树 Vim 提供了多层撤销功能。如果你撤销了一些改变然后又进行了一些新的改变,你就在撤 销树里建立了一个分支。本文本讨论如何在分支间来回移动。 32.1 撤销到文件写入时的状态 32.2 为每次改变进行编号 32.3 撤销树内任意跳转 32.4 时间旅行 后一章: usr_40.txt 创建新的命令 前一章: usr_31.txt 利用 GUI 目录: usr_toc.txt

32.1 撤销到文件写入时的状态

有时你做了一些改变,然后发现还是想恢复到最近写入文件时的状态。没问题,用下面的 命令就可以: :earlier 1f 这里,"f" 代表 "file" (文件)。 可以重复此命令,回到更遥远的过去。使用不同于 1 的计数值可以回去得快一些。 如果回去太久了,可以这样往前: :later 1f 注意 这些命令真的是依据时间序列进行的。如果你在撤销一些改变后又进行过改变,这 一点很有区别。下一节有所解释。 另外也请 注意 我们说的是文本写入。要把撤销信息写入文件见 undo-persistence

32.2 为每次改变进行编号

02.5 一节,我们只讨论了单线的撤销/重做。其实,可以出现分支。当你撤销了一些改 变,又进行了一些新的改变,新的改变构成了撤销树的一个分支。 让我们从文本 "one" 开始。第一个要做的改变是附加 " too"。然后移动到第一个 'o' 上并修改为 'w'。这时我们有了两个改变,分别编号为 1 和 2,而文本有三个状态: one | 改变 1 | one too | 改变 2 | one two 如果我们撤销一次改变,回到 "one too",然后把 "one" 换成 "me",我们就在撤销树里 建立了一个分支: one | 改变 1 | one too / \ 改变 2 改变 3 | | one two me too 现在你可以用 u 命令来撤销。如果你做两次,你得到的是 "one"。用 CTRL-R 来重 做,你会到达 "one too"。多做一次 CTRL-R 又把你带到 "me too"。现在我们看到, 撤销/重做使用最近使用的分支,在树内上下移动。 这里重要的是改变发生的顺序。这里说的改变不考虑撤销和重做。每次改变后,你会得到 一个新的文本状态。 注意 只有改变被编号,上面显示的文本没有标识符。通常,通过它上方的改变号来引用 它。但有时也通过他下方的某个改变之一来引用。特别是在树内往上移动的时候,这样你 可以知道哪个改变刚刚被撤销掉。

32.3 撤销树内任意跳转

那么你现在怎么能到 "one two" 呢?你可以用这个命令: :undo 2 文本现在成为了 "one two",因为它在改变号 2 之下。用 :undo 命令可以跳转到树内 任何改变之下的文本。 现在再进行一项改变: 把 "one" 改成 "not": one | 改变 1 | one too / \ 改变 2 改变 3 | | one two me too | 改变 4 | not two 现在你又改了主意想回到 "me too" 了。用 g- 命令。它在时间点上往后退,也就是 说,它不是在树内上下移动,而是回到之前所在的改变。 你可以重复 g- ,这样你会看到文本的变化过程: me too one two one too one g+ 时间点上往前进: one one too one two me too not two :undo 用于你知道你要跳转到哪个改变的场合。 g-g+ 用于你不知道具体要到 达的改变号的情况。 你可以在 g-g+ 之前加上计数来重复执行。

32.4 时间旅行

如果你在文本上工作了一段时间,撤销树变得相当大。这时你可能想回到几分钟之前的文 本上。 要看撤销树里有什么分支,用: :undolist number changes time 3 2 16 seconds ago 4 3 5 seconds ago 这里你可以看到每个分支上叶结点的编号,还有改变发生的时间。假定我们在改变号 4 下方的 "not two" 那里,你可以这样回到十秒前: :earlier 10s 取决于改变发生了多长时间,你回到达树内的某个位置。 :earlier 命令参数可以用 "m" 代表分钟,"h" 代表小时,"d" 代表天。用一个很大的数,你可以一路回到很久以 前: :earlier 100d 要 (再次) 进入未来世界,用 :later 命令: :later 1m 参数可以用 "s"、"m" 和 "h",和 :earlier 完全类似。 要看到更多的细节,或者要对信息进行操作,可以用 undotree() 函数。要看看它返回 什么: :echo undotree()

下一章: usr_40.txt 创建新的命令 版权: 参见 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl: