*usr_32.txt*	For Vim version 8.0.  最近更新: 2010年7月

		     VIM 用户手册 - by Bram Moolenaar
		     译者: Willis http://vimcdoc.sf.net

			      撤销树


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:ft=help:norl:
