Usr_32
Nvim :help
页面,生成 自 来源 使用 tree-sitter-vimdoc 解析器。
VIM 用户手册 - 由 Bram Moolenaar 撰写
撤销树
Vim 提供多级撤销。如果您撤销了几个更改,然后进行新的更改,您将在撤销树中创建一个分支。本文档介绍了如何在分支之间移动。
撤销到文件写入
有时您会进行几项更改,然后发现您想回到上次写入文件时的状态。您可以使用以下命令来实现:
:earlier 1f
这里的 "f" 代表 "文件"。
您可以重复此命令以进一步回到过去。或者使用与 1 不同的计数来更快地返回。
如果您退得太远,请使用以下命令再次前进:
:later 1f
请注意,这些命令实际上是在时间序列中执行的。如果您在撤销一些更改后进行了更改,这一点很重要。下一节将对此进行说明。
在
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"。因此撤销和重做在树中上下移动,使用最后使用的分支。
这里重要的是更改的顺序。撤销和重做在此上下文中不被视为更改。每次更改后,您将获得文本的新状态。
请注意,只有更改被编号,上面的树中显示的文本没有标识符。它们通常由其上方的更改编号来引用。但有时也会由其下方某个更改的编号来引用,尤其是在树中向上移动时,这样您就知道刚刚撤销了哪个更改。
那么,您现在如何到达 "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+ 之前输入计数来重复它们。
当您在文本上工作了一段时间后,树会不断增长。然后您可能想要回到几分钟前的文本。
要查看撤销树中有哪些分支,请使用以下命令:
:undolist
更改编号 时间
3 2 16 秒前 4 3 5 秒前
在这里,您可以看到每个分支中叶子数量以及更改发生的时间。假设我们现在在更改 4 下方,在 "not two" 处,您可以使用以下命令返回十秒钟:
:earlier 10s
根据您进行更改所花费的时间,您将最终处于树中的某个位置。
:earlier 命令参数可以是 "m"(分钟)、"h"(小时)和 "d"(天)。要完全回到过去,请使用一个很大的数字:
:earlier 100d
要向前移动时间,请使用
:later 命令
:later 1m
参数与
:earlier 相同,为 "s"、"m" 和 "h"。
如果您需要更多详细信息,或者想操作这些信息,可以使用
undotree() 函数。要查看它返回什么,请执行以下操作:
:echo undotree()