【问题标题】:How do I get fine-grained undo in Vim如何在 Vim 中获得细粒度的撤消
【发布时间】: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


    【解决方案1】:

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

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

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

    撤消

    【讨论】:

    • 恕我直言,这个答案应该被接受;虽然可能不是因为节目来晚了,可惜。我将其映射到 SpaceReturnTab,对此我非常满意。
    • 还可以考虑将其映射为 CTRL-U 删除行首。
    • 漂亮!我将这个技巧用于大删除操作::inoremap &lt;C-W&gt; &lt;C-G&gt;u&lt;C-W&gt;:inoremap &lt;C-U&gt; &lt;C-G&gt;u&lt;C-U&gt;
    • 这就像一个魅力,每一个空格命中添加它作为撤消重做树的动作。真的可以节省很多时间。谢谢你的帮助。 :inoremap 你像神一样工作
    • 我真的希望 Vim 有更多像这样健全的默认值。您不断添加内容只是为了让它像一个体面的编辑器一样工作,然后您必须跨系统跟踪所有这些更改。
    【解决方案2】:

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

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

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

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

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

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

    文件:

    这是我的帖子

    真的是考验

    这是中间

    到此结束

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

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

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

    【讨论】:

    • 我喜欢将命令c 视为change 而不是cut。这更好地解释了为什么它在删除受影响的文本后切换到编辑模式...
    【解决方案3】:

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

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

    【讨论】:

    • 告诉我我的问题是错误的,这并不是真正的解决方案。
    • 我宁愿将此视为解决您想要删除输入的最后一个单词的问题的方法。如果您的问题是关于仅使用撤消和撤消来执行此操作,您的答案将是:不,不可能,这对 imo 完全没有帮助。
    • 好的,我应该尝试使用移动命令而不是直接撤消。
    • 正如 Terence Honles 所说,Vim 的撤消命令旨在撤消上一个操作。如果您可以学会预测这一点,那么在撰写和分解文本时,撤消功能真的可以为您工作。观看我的截屏视频:Modal editing: undo, redo and repeat 进行演示。
    • 撤消也是一种返回先前输入文本的方法。你的百万解决方案根本不满足这一点。
    【解决方案4】:

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

    【讨论】:

    • 在 OSX 上运行良好。问题:如何重做?
    • 如果你想像上面 2 cmets 提到的那样撤消这个,那么退出插入模式并使用 u 撤消。
    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 2010-12-06
    • 1970-01-01
    • 2015-08-13
    • 2012-05-15
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多