17

我发现 Vim 的 undo 有点太粗糙了。例如,如果我输入这样的内容:

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

哎呀!我打错了。我想开始撤消,所以我按u,但随后它清除了整行。有没有办法逐字或逐字符撤消?

4

4 回答 4

25

您可以通过 取消撤消:help i_ctrl-g_u。如果你想为每个角色映射它,你可以映射它,但这可能有点复杂。将此映射到空间按钮是一种方法。

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

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

于 2010-12-05T18:26:44.637 回答
10

不,这是不可能的,实际上也没有必要。Vim 有一百万种方法来处理它。举个cb例子。或bC。或brb。或Tspace跳回而不是b。或ciw

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

于 2010-05-24T08:15:40.417 回答
10

因此,正如您从其他人那里看到的那样,Vi(AFAIK)中不存在您所要求的内容。

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

...您应该将其视为一个动作,并且动作可以原子地撤消或恢复

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

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

当您记得使用“.”时,这个概念会变得更加有用。命令(在正常模式下)。该命令是重复上一个动作。我已经多次使用它来查找和替换文件中的一小组单词(如果您对更改过多感到偏执,它特别有用)。情况如下:

文件:

这是我的帖子

真的是一个考验

这是中间

这就是结局

如果我想用“was”替换“is”,我可以写: %s/\<is\>/was/g

但是,如果我想将第一行和第三行“is”更改为“was”(而且我不知道他们的行号,并且我想看看是否还有其他地方我想更改是我可以输入“/is”

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

于 2010-05-24T09:33:56.673 回答
9

在 Linux 上,control-w在输入模式下使用 while 会删除最后一个“单词”。

于 2010-05-24T08:38:21.220 回答