如何在Vim/Vi文本编辑器中撤消操作

时间:2020-01-09 10:44:06  来源:igfitidea点击:

如何撤消vim文本编辑器中的最新更改?

Vim/vi文本编辑器会记住所有最近的更改,例如添加或者删除文本或者代码块。
您可以使用撤消模式快速还原vim中的所有更改。
该页面显示了如何撤消最近的更改以及如何在Linux或者类似Unix的系统上运行的Vim/vi文本编辑器中进行编辑。

如何在Vim中撤消

以下命令用于撤消文本以及在vim中进行编辑或者删除。
语法为:

u

或者

:u

或者

:undo
:undo N
:undo 3

要撤消一行上的所有最新更改,请运行:

U

撤消vim/Vi中的更改

  • 按Esc键返回正常模式" ESC"
  • 执行" u"撤消上一次更改。
  • 要撤消最后两个更改,请执行2u。
  • 按Ctrl-r重做撤消的更改。换句话说,撤消撤消。通常,称为重做。

例子

启动一个新文件:

vim demo.txt

通过按" i"追加以下文本

Linux macOS Unix theitroad

通过按五次" x"来删除第二个单词:

Linux Unix theitroad

现在,通过按五次" u"来撤销该操作:

Linux macOS Unix theitroad

列出变更树

以下命令在Vi中不起作用,仅在Vim中起作用。
也可以在撤销分支。
当您撤消一些更改然后进行新更改时,会发生这种情况。
撤消的更改将成为分支。
执行以下命令以列出更改树中的叶子:

:undolist

其中:

  • "编号"列是变更编号。这个数字不断增加,可用于识别特定的可撤消更改
  • " changes"列是从树的根开始对该叶子进行更改的次数。
  • "时间"列是进行此更改的日期和时间。例如,8秒前或者时,分,秒。
  • "保存"列指定此更改是否写入磁盘以及写入哪个文件。可以和:later:earliervim命令一起使用。

:earlier,:later,g-和g +命令

语法如下。

:earlier {count}	Go to older text state {count} times.
:earlier {N}s		Go to older text state about {N} seconds before.
:earlier {N}m		Go to older text state about {N} minutes before.
:earlier {N}h		Go to older text state about {N} hours before.
:earlier {N}d		Go to older text state about {N} days before.
:later {count}		Go to newer text state {count} times.
:later {N}s		Go to newer text state about {N} seconds later.
:later {N}m		Go to newer text state about {N} minutes later.
:later {N}h		Go to newer text state about {N} hours later.
:later {N}d		Go to newer text state about {N} days later.
g-			Go to older text state.  With a count repeat that many times. 
g+			Go to newer text state.  With a count repeat that many times.

例如,使用此命令返回十分钟:

:earlier 10m

有时您进行了几次更改,然后发现您想回到上一次写入文件的时间。
您可以使用以下命令执行此操作:

:earlier 1f

f在这里代表文件。
您可以重复此命令以回溯过去。
或者使用不同于1的计数来更快地返回。
如果您退后太远,请再次执行以下操作:

:later 1f

在Vim中使用撤消分支的示例

启动一个新文件:

vim demo.txt

i进入插入模式并输入Linux:

Linux

esc
现在再次进入插入模式并输入Unix:

Linux Unix

最后,再次按esc并通过输入i并输入macOS返回插入模式。
我的缓冲区现在将包含

Linux Unix macOS

:echo changenr()命令

要列出最新更改的数量,请执行:

:echo changenr()

输出示例:

3

由于您进行了三处更改,因此将输出三处。
还记得我们按了三下i键进入插入模式吗?
接下来,我将按u撤消一个更改,再次启动插入模式并更改缓冲区,使其看起来像这样:

Linux Unix FreeBSD

现在,您从缓冲区的先前版本分支,并创建了一个新的撤消分支:

:echo changenr()

输出示例:

4

如果在正常模式下按u,您将返回到

Linux Unix

使用u进一步撤消会将缓冲区更改为

Linux

如果您最后一次按u,您将再次有一个空缓冲区,因为这是您开始的状态。
您现在在变更1和之前回来了

:echo changenr()

输出示例:

0

如果您使用Ctrl-R重做更改,则将移至

Linux

然后(按Ctrl-R键)

Linux Unix

最后(按Ctrl-R键)

Linux Unix FreeBSD

注意,您从未遇到过其中缓冲区包含Linux Unix macOS的更改词macOS。
但是,您可以使用g-:earlier命令返回到该更改。
因此,如果您现在按g-或者:earlier,则缓冲区如下所示:

Linux Unix macOS

当然,如果您知道要跳转到哪个更改,也可以使用:undo跳转到指定的更改。

:undo 1

会将缓冲区放回:

Linux