如何在Vim中获得细粒度的撤消

时间:2010-05-24 07:56:57

标签: vim undo

我发现Vim的撤消有点过于粗糙。例如。如果我输入这样的内容:

a // to go into edit mode
to be or not to ve
<esc> // to exit insert mode

糟糕!我弄错了。我想开始撤消,所以我按u,但它会清除整行。 有没有办法逐字逐句或逐字逐句撤消?

4 个答案:

答案 0 :(得分:22)

你可以通过:help i_ctrl-g_u打破撤消。如果你想要每个角色,你可以映射这个,但这可能有点复杂。将此映射到空格按钮是一种方式。

:inoremap <Space> <Space><C-g>u

之后,每个单词都可以通过 u

撤消

答案 1 :(得分:10)

不,这是不可能的,实际上也没有必要。 Vim有百万种处理方式。例如,尝试 c b 。或 b C 。或 b r b 。或 T space 跳回而不是 b 。或 c i w

当然,您可以在插入模式下使用大多数这些解决方案(首先按 CTRL o ),或者将一个解决方案绑定到您喜欢的组合键({{1 }和:help map)。

答案 2 :(得分:9)

所以你可以从其他人那里看到你要求的东西在Vi(AFAIK)中不存在。

撤消撤消上次操作的内容。如果您的上一个操作是进入插入模式然后添加一行,然后退出插入模式。这将被撤消,但是如果从默认模式中点击“x”键,则您将删除1个字符,或者如果在视觉模式中选择了文本,则文本将被删除。如果您点击撤消,那么您将恢复该一个字符或所选文本。

......您应该将此视为一种行动,并且可以原子地撤消或恢复行动

如前所述,如果你想删除前一个单词,那么你应该能够按住Ctrl + w并在保持插入模式的同时删除前一个单词。

如果退出插入模式,你可以导航(动作)一个单词,用“b”将带有“w”的单词转发到带有“e”的单词的结尾,并且可以剪切(这使你处于插入模式)用“c”或用“d”删除。切换和删除操作都可以接受跟随它们的动作,因此您可以使用“dw”删除当前单词/直到下一个单词,或者使用“cb”删除前一个单词

当你记得使用“。”时,这个概念会变得更有用。命令(在正常模式下)。此命令用于重复上一个操作。我已经多次使用这个来查找并替换文件中的一小组单词(如果你对变化太多而偏执,这尤其有用)。场景如下:

文件:

  

这是我的帖子

     

真的是一个测试

     

这是中间的

     

这是结束

如果我想将“is”替换为“was”,我可以写: %S / \&LT;是\&GT; / WAS /克

然而,如果我想改变第一行,第三行“是”改为“是”(我不知道他们的行号,我想知道是否还有其他地方我想改变是我可以打字吗? “/是”

点击“n”直到我到达我想要替换的地方,然后点击“cw”并输入“was” 我现在可以点击“n”,直到我到达另一个我想要替换的地方然后点击“。”,这将用“was”替换“is”(注意:我的搜索字符串不限于单词“is”,只是两个字符“是”所以“这个”&amp;“this”将在这种情况下匹配)

答案 3 :(得分:8)

在Linux上,在输入模式下使用 control-w 删除最后一个'word'。