【发布时间】:2011-02-23 03:28:38
【问题描述】:
我发现 Vim 的 undo 有点太粗糙了。例如。如果我输入这样的内容:
a // to go into edit mode
to be or not to ve
<esc> // to exit insert mode
哎呀!我打错了。我想开始撤消,所以我按u,但随后它清除了整行。 有没有办法逐字或逐字符撤消?
【问题讨论】:
我发现 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
撤消【讨论】:
Space、Return 和 Tab,对此我非常满意。
:inoremap <C-W> <C-G>u<C-W>、:inoremap <C-U> <C-G>u<C-U>。
因此,正如您从其他人那里看到的那样,您所要求的内容在 Vi (AFAIK) 中不存在。
撤消撤消您的上一个操作。如果您的最后一个操作是进入插入模式,然后添加一行,然后退出插入模式。这将被撤消,但是如果您在默认模式下点击“x”键,那么您将删除 1 个字符,或者如果在可视模式下选择了文本,则该文本将被删除。如果您点击撤消,那么您将恢复该字符或选择的文本。
...您应该将其视为一个动作,并且动作可以原子地撤消或恢复
如前所述,如果您希望删除前一个单词,那么您应该能够按 Ctrl + w 并删除前一个单词,同时保持插入模式。
如果您退出插入模式,您可以使用“b”导航(移动)一个单词,将使用“w”的单词向前移动到使用“e”的单词末尾,并且可以剪切(这使您处于插入模式)用“c”或用“d”删除。剪切和删除动作都可以接受跟随它们的动作,因此您可以使用“dw”删除当前单词/直到下一个单词或使用“cb”剪切前一个单词
当您记得使用“.”时,这个概念会变得更加有用。命令(在正常模式下)。该命令是重复上一个动作。我已经多次使用它来查找和替换文件中的一小组单词(如果您对更改过多感到偏执,它特别有用)。场景如下:
文件:
这是我的帖子
真的是考验
这是中间
到此结束
如果我想用“was”替换“is”,我可以这样写:
%s/\
但是如果我想将第一行和第三行的“is”更改为“was”(我不知道他们的行号,我想看看是否还有其他地方我想更改是我可以打字吗 “/是”
点击“n”直到我到达我想要替换的地方,然后点击“cw”并输入“was” 我现在可以点击“n”,直到我到达另一个我想要替换的地方并点击“.”,这会将“is”替换为“was”(注意:我的搜索字符串不限于单词“is”,只是两个字符 "is" 所以 "This" & "this" 在这种情况下会匹配)
【讨论】:
c 视为change 而不是cut。这更好地解释了为什么它在删除受影响的文本后切换到编辑模式...
不,这是不可能的,实际上也没有必要。 Vim 有一百万种方法来处理它。以 cb 为例。或 bC。或 brb。或 Tspace 跳回而不是 b。或 ciw.
当然,您可以在插入模式下使用大多数这些解决方案(首先按 CTRLo),或者将其中一个绑定到您喜欢的组合键(:help map和:help imap)。
【讨论】:
在 Linux 上,在输入模式下使用 control-w 会删除最后一个“单词”。
【讨论】: