如何在Vim中重做(即“撤消撤消”)?


696

在Vim中,我做了太多撤销操作。我该如何撤消(即重做)?


106
因为我已经收集了2张接近的选票,所以我认为这是在这里,因为vim是程序员的编辑。
flybywire

28
我同意,这与编程有关这是一个真实的问题。
DigitalRoss

41
尽管社区早就确定Vim属于SO(它是一种编程工具),但周围的人四处走走,并将每个Vim问题标记为“属于SU”。
布赖恩·卡珀

@Brian:您是否有指向达成共识的文档的链接?
太多的PHP

12
meta.stackexchange.com/questions/20251/…但是我记得去年某个时候出现了这种情况。Vim / Emacs是IDE。此外,两种配置文件中使用的语言都是图灵完备的脚本语言,因此设置Vim的操作本身就是从编程开始的。
布赖恩·卡珀

Answers:


906

Ctrl+r


2
我只想将undoTree插件扔在那里,对于您似乎一连串的undo和redos搞砸自己的时代来说,这真是太棒了。
杰克·塞勒斯

3
如果我正在阅读有关vi的内容,那么我的手指就会自己动手。vi命令在stackoverflow上不起作用。:-)
ciscogambo 2014年

2
Mac用户注意:Mac终端中的Ctrl + r将破坏vim的一天。不知道要在Mac终端中使用正确的组合键来撤消操作,但绝对不是Ctrl + r!
tpartee

@tpartee我只是在macOS的终端应用程序下的vim中使用了Ctrl + r-在这里没有问题。
亚瑟(Jase)

3
也许@tpartee意味着搞砸Cmd + r了吗?它确实做了一些奇怪的事情。但Ctrl + r对我来说效果很好(Mac + tmux + vim)
dwanderson

132

还请检出:undolist,它提供了撤消历史记录的多个路径。如果您在撤消太多内容后不小心输入了某些内容,这将很有用。


22
@amindfv:取从数量:undolist和类型:undo 178(比方说)后退到步骤178
彼得

有什么方法可以显示出将要撤消的内容:undolist吗?
csharpfolk

2
@csharpfolk使用(undotree插件github.com/mbbill/undotree

54

使用:earlier/ :later。重做您只需要做的一切

later 9999999d

(假设你第一次编辑最多9999999天前的文件),或者,如果你还记得当前撤销状态,需要一个,使用之间的区别NhNm或者Ns几个小时,分钟和秒分别。+ :later N<CR><=> Ng+:later Nf用于文件写入。


1
:later为我工作vi(不是vim-在Google上搜索“ vi”,但所有结果都是“ vim”),谢谢!
2014年

@Luc在几乎所有您有vi命令的地方,它都是vim可执行文件或其副本的符号链接。虽然并非到处都是。
ZyX

@ZyX我希望那是真的。我只在bash抛出a之后使用vi vim: command not found。接下来要做的是alias vim=vi因为我自动键入了它,但是它仍然是普通的旧vi。另外,如果vi是vim的别名,则redo(ctrl + r)也可以正常工作。
2014年

2
9999999d是27395年前。我假设当时在vi中未实现撤消功能。您可能要节省一些详尽的打字工作,并使用合理的数字。9999d约27年,999d约2.7年。我想在大多数情况下就足够了……
ChristophK,

45

Vim文档

<Undo>      or                  *undo* *<Undo>* *u*
u           Undo [count] changes.  {Vi: only one level}

                            *:u* *:un* *:undo*
:u[ndo]         Undo one change.  {Vi: only one level}

                            *CTRL-R*
CTRL-R          Redo [count] changes which were undone.  {Vi: redraw screen}

                            *:red* *:redo* *redo*
:red[o]         Redo one change which was undone.  {Vi: no redo}

                            *U*
U           Undo all latest changes on one line.  {Vi: while not
            moved off of it}


14

首先Esc按键退出编辑模式。

然后,

对于撤消,请u多次使用密钥。

重做,请使用Ctrl+ r



5

CTRL+r

“ r”是小写字母。


9
实际上,没关系-传统的控制台在^r和之间没有区别^R,而Vim遵循这一点。
迅速

@ephemient:同意。在MS-DOS中,您甚至不能键入小写字母^X(其中X可以是任何字母)。
nyuszika7h 2011年

在Vim中,Ctrl-shift-R(带有大写字母R的ctrl)是替换模式。
Paul Stelian

5

使用VsVim for Visual Studio吗?

我在尝试VsVim时遇到了这个问题,VsVim 为Visual Studio中的Vim命令提供了绑定

我知道 Ctrlr Vim本身,但是这种特定的绑定在VsVim中不起作用(至少在我的设置中不起作用?)。

什么不过的工作,就是命令:red。与上面相比,这有点麻烦,但是在您真正需要它时仍然可以。


投反对票的原因是该问题专门询问的是vim,而不是Visual Studio。
约翰·冯·诺依曼

3
@JohnVonNeumann这至少VIM绑定,与vim,或者只是在VS的情况下 毕竟,这就是让我提出这个问题的原因。惩罚某人以添加更多信息似乎有些苛刻,这是没有必要的,即使您的信息可能超出了OP的范围,您也不认为吗?
Kjartan '18年

2

实际上,这:undolist是很难使用的,Vim :earlier:later更改的时间跟踪仅可用于修复过程中的问题。

鉴于此,我求助于一个将这些功能结合在一起的插件,以提供可视化的可浏览撤消树,称为“ Gundo”。

显然,仅当您需要细粒度的修复程序,或者不确定要返回的文档的确切状态时,才可以使用此功能。请参阅:Gundo。用样式绘制Vim撤消树

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.