在vim中如何撤销最近的一次写入操作?

22

让我这样提问。 我在vim中打开一个新文件,(版本1)

#include<stdio.h>
main()
{
...blah
}

然后使用<Esc>:w<Enter>来写入文件。然后进行更改(版本2)

#include<stdio.h>
main()
{
...blah
... edit1
... edit2 //and large number of changes here and there in code
}

然后我使用 <Esc>:w<Enter> 保存更改。

是否有一种方法可以直接撤销对版本1的更改(因为它是最后一次保存),即不需要不断按下 u 进行撤销?


4
别浪费时间了,使用 gundo 插件吧。 - Andy Ray
3
Gundo 或者使用版本控制软件。 - FDinoff
@FDinoff 实际上,我使用svn。但问题是,我从服务器拉取更新并进行了许多本地编辑(未提交,因为提交会影响其他用户),最终在很长的时间间隔后才提交! - SKPS
@FDinoff 确实!我不确定我能否将git与svn混合使用。 - SKPS
1
@SathishKrishnan git自带git svn,可以让你在本地使用git,在远程使用svn。 - Dean
显示剩余2条评论
3个回答

33

Vim的帮助文档中写道:

:earlier {N}f   Go to older text state {N} file writes before.
                When changes were made since the last write
                ":earlier 1f" will revert the text to the state when
                it was written.  Otherwise it will go to the write
                before that.
                When at the state of the first file write, or when
                the file was not written, ":earlier 1f" will go to
                before the first change.
所以,如果在第二次保存后您没有进行更改,您可以按照自己的意愿进行操作:
:earlier 1f

另一方面,如果您在第二次保存后进行了未保存的更改,则:

:earlier 2f
将解决您的问题。
请参阅:help :earlier:help :undolist

如果您打算经常使用它,请确保打开持久撤消功能。(:h persistent-undo) - FDinoff

5
您可以轻松地回到您第一次打开文件的状态,只需在 u 前输入一个数字即可。
例如:10000u,将撤销 10000 次。如果这还不够,尝试使用 1000000u :)
如果您想逐步撤销,可以按任意增量进行操作,例如尝试 5u
如果您只想重新加载磁盘上的文件,请使用 :e

谢谢。在执行 :e 命令后,是否可以使用 <Ctrl-r> 回退到版本 2?我会尝试一下。 - SKPS
1
@SathishKrishnan 不,我认为这是不可能的。也许如果您开始使用多个缓冲区来编辑一个文件,但那可能会变得非常混乱,您最终可能会丢失您的更改。 - Paul
4
只有在不使用持久撤销时才能起作用。(我认为这是一个非常好的功能) - FDinoff

1

在你的 .vimrc 文件中添加以下内容。在正常模式中,按下 Shift + u 将撤消到上一次保存。再次按下它将撤消到之前的保存。如果没有进行任何更改,您仍然可以使用大量的 <C-R> 返回到原始点。
nnoremap U :ea 1f<CR>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接