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

MDC*_*ore 15 vim undo

我发现Vim的撤消有点过于粗糙.例如,如果我键入这样的东西:

a // to go into edit mode
to be or not to ve
<esc> // to exit insert mode
Run Code Online (Sandbox Code Playgroud)

哎呀!我弄错了.我想开始撤消所以我按u,但然后它清除整行.有没有办法逐字逐句或逐字逐句撤消?

Fat*_*lan 22

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

:inoremap <Space> <Space><C-g>u
Run Code Online (Sandbox Code Playgroud)

之后,每个单词都可以撤消 u


sou*_*rge 10

不,这是不可能的,实际上也没有必要.Vim有百万种处理方式.试试这个cb例子.或者bC.或者brb.或者Tspace跳回去而不是b.或者ciw.

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

  • 这不是一个解决方案,而是告诉我我的问题是错误的. (5认同)
  • 我宁愿将此视为您要删除输入的最后一个单词的问题的解决方案.如果你的问题是关于仅使用撤消和撤消来做到这一点,你的答案将是:不,不可能,这对所有imo都没有帮助. (2认同)

Ter*_*les 9

因此,当您从其他人那里看到您要求的内容在Vi(AFAIK)中不存在.

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

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

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

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

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

文件:

这是我的帖子

真的是一个考验

这是中间的

这就是结局

如果我想将"is"替换为"was",我可以写:%s /\<is \>/was/g

但是,如果我想改变第一行,第三行"是"到"是"(我不知道他们的行号,我想看看是否还有其他地方我想改变的是我可以输入"/是"

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

  • 我喜欢将命令“c”视为_change_而不是_cut_。这更好地解释了为什么它在删除受影响的文本后切换到编辑模式...... (2认同)

Jon*_*ler 8

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