在插入模式下撤消


23

在插入模式下,是否有命令撤消上一次执行的操作?

我只是使用粘贴了来自错误寄存器的文本<C-r>,并且有两个选择:

  1. 手动删除我刚刚粘贴的内容,然后重新开始。
  2. 切换到普通模式,点击u并丢失我输入的文字<C-r>

有没有更好的办法?

Answers:


16

Vim提供了有限的能力来使用Ctrl-G u命令指定不可撤消更改的范围,这会破坏撤消顺序。看到

:help i_CTRL-G_u

在您的情况下,解决方案是<C-R>像这样重新映射:

:inoremap <C-R> <C-G>u<C-R>

然后键入<C-O>u将只撤消自键入以来所做的更改<C-R>。看到

:help i_CTRL-O

1
太好了,我不知道该命令。在输入<C-O>u结果和在屏幕上看到结果之间有相当长的延迟(大约4秒钟),关于如何摆脱这种情况的任何想法吗?
zool

我也注意到了。我不知道; 我会尝试找出答案。
garyjohn

嘿,您可能是说<CR>(回车)而不是<CR>(ctrl-r)吗?
德温特(Derwent)'18年

否。最初的问题与<CR>的行为有关,因此这就是映射使用的内容。但是,您可以在该映射中将<CR>替换为<CR>,以使撤消序列被<CR>中断。有关更多示例,请参见:help i_CTRL-G_u
garyjohn '18

6

从插入模式:

  1. 如果您粘贴的文本小于一行(这就是您的第二点所暗示的意思),只需单击<C-u>以删除当前行中光标之前的所有字符。

  2. 如果粘贴的文本是多行,你的第二个解决方案将能更好地工作,适应如下:<C-o>u

以上两点将在插入模式下开始并保持(或结束);它们实际上与您提出的解决方案相同,只是简化了一些:)


6

您可以尝试<C-w>(删除左侧的一个单词)或<C-u>(一次按下光标之前清除字符,第二次按下时删除换行符)。请参阅:help i_CTRL-W:help i_CTRL-U

如果从寄存器中粘贴很多内容,撤消更改当然会更快,则可以<C-o>为此使用insert-normal-mode (执行一个正常模式命令,然后返回到插入模式)。

通常,通过经常返回正常模式将您的编辑分成小块是有帮助的,这样您就可以实现细粒度的撤消可能性。

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.