我发现 Vim 的 undo 有点太粗糙了。例如,如果我输入这样的内容:
a // to go into edit mode
to be or not to ve
<esc> // to exit insert mode
哎呀!我打错了。我想开始撤消,所以我按u
,但随后它清除了整行。有没有办法逐字或逐字符撤消?
您可以通过 取消撤消:help i_ctrl-g_u
。如果你想为每个角色映射它,你可以映射它,但这可能有点复杂。将此映射到空间按钮是一种方法。
:inoremap <Space> <Space><C-g>u
之后,每个单词都可以通过u
不,这是不可能的,实际上也没有必要。Vim 有一百万种方法来处理它。举个cb例子。或bC。或brb。或Tspace跳回而不是b。或ciw。
当然,您可以在插入模式下使用大多数这些解决方案(CTRLo首先按下),或者将其中一个绑定到您最喜欢的组合键(:help map
和:help imap
)。
因此,正如您从其他人那里看到的那样,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" 将匹配)
在 Linux 上,control-w在输入模式下使用 while 会删除最后一个“单词”。