【问题标题】:How do I do redo (i.e. "undo undo") in Vim?我如何在 Vim 中重做(即“撤消撤消”)?
【发布时间】:2010-12-06 01:28:01
【问题描述】:

在 Vim 中,我做了太多撤消操作。如何撤消此操作(即重做)?

【问题讨论】:

  • 因为我已经收集了 2 票,我认为这属于这里,因为 vim 是程序员的编辑器。
  • 我同意,这是与编程相关的并且这是一个真正的问题。
  • 这里有人四处走动,并将每个 Vim 问题标记为“属于 SU”,尽管社区很久以前就决定 Vim 属于 SO,它是一种编程工具。
  • @Brian:你有达成共识的文件的链接吗?
  • meta.stackexchange.com/questions/20251/… 但我记得去年某个时候会出现这种情况。 Vim/Emacs 是 IDE。此外,两者的配置文件中使用的语言都是图灵完备的脚本语言,因此设置 Vim 的行为本身就是从编程开始的。

标签: vim undo redo


【解决方案1】:

Ctrl+r

【讨论】:

  • 我只是想把 undoTree 插件扔出去,对于你似乎用一连串的撤消和重做把自己搞砸的时代来说,这真是太棒了。
  • 如果我正在阅读有关 vi 的内容,那么我的手指只会自行行动。 vi 命令在 stackoverflow 上不起作用。 :-)
  • Mac 用户注意:Mac 终端中的 Ctrl + r 会毁了你在 vim 中的一天。不知道 Mac 终端中要撤消的正确组合键,但绝对不是 Ctrl + r !
  • @tpartee 我刚刚在 macOS 的终端应用程序下的 vim 中使用了 Ctrl+r - 这里没有问题。
  • 也许@tpartee 的意思是Cmd + r 搞砸了?它肯定会做一些奇怪的事情。但是Ctrl + r 对我来说很好用(Mac + tmux + vim)
【解决方案2】:

还可以查看:undolist,它提供了通过撤消历史记录的多种路径。如果您在撤消过多后不小心输入了某些内容,这将非常有用。

【讨论】:

  • @amindfv:从:undolist 中获取数字并输入:undo 178(比如说)以倒退到第178 步。
  • 有什么方法可以显示:undolist 中将撤消的具体内容吗?
  • @csharpfolk 使用 undotree 插件 (github.com/mbbill/undotree)
【解决方案3】:

使用:earlier/:later。重做你只需要做的所有事情

later 9999999d

(假设您最多在 9999999 天前第一次编辑该文件),或者,如果您记得当前撤消状态和所需撤消状态之间的区别,请使用 NhNmNs 表示小时、分钟和秒。 + :later N<CR> Ng+:later Nf 用于文件写入。

【讨论】:

  • :latervi 为我工作(不是vim——在谷歌上搜索“vi”,但所有结果都是“vim”),谢谢!
  • @Luc 几乎所有有vi 命令的地方,它都是vim 可执行文件或其副本的符号链接。但并非完全无处不在。
  • @ZyX 我希望这是真的。我只在 bash 抛出 vim: command not found 后使用 vi。接下来我要做的是alias vim=vi,因为我会自动键入它,但它仍然是普通的旧 vi。此外,如果 vi 是 vim 的别名,redo (ctrl+r) 会正常工作。
  • 9999999d 是 27395 年前。我假设当时在 vi 中没有实现撤消功能。您可能希望节省一些详尽的打字工作并使用合理的数字。 9999d 对应约 27 年,999d 对应 2.7 年。我想在大多数情况下就足够了......
【解决方案4】:

Vim documentation

<Undo>      or                  *undo* *<Undo>* *u*
u           Undo [count] changes.  {Vi: only one level}

                            *:u* *:un* *:undo*
:u[ndo]         Undo one change.  {Vi: only one level}

                            *CTRL-R*
CTRL-R          Redo [count] changes which were undone.  {Vi: redraw screen}

                            *:red* *:redo* *redo*
:red[o]         Redo one change which was undone.  {Vi: no redo}

                            *U*
U           Undo all latest changes on one line.  {Vi: while not
            moved off of it}

【讨论】:

    【解决方案5】:

    在命令模式下,使用 U 键撤消,Ctrl + r 重做。看看http://www.vim.org/htmldoc/undo.html

    【讨论】:

    • 插入模式怎么样?
    • @YuFengShen vim 的强大之处在于命令模式。我们不需要在插入模式下重做
    • 链接(实际上)已损坏。
    【解决方案6】:

    首先按Esc键退出编辑模式。

    那么,

    对于 undo,使用 u 键可以多次撤销。

    对于重做,使用Ctrl +r

    【讨论】:

      【解决方案7】:

      请参阅"undo" and "redo" part of Vim document

      :red[o](重做一项已撤消的更改)和 {count} Ctrl+r(重做 {count} 个更改已撤消)都可以。

      此外,:earlier {count}(转到较旧的文本状态 {count} 次)始终可以替代撤消和重做。

      【讨论】:

        【解决方案8】:

        CTRL+r

        “r”是小写的。

        【讨论】:

        • 其实应该没关系——传统的控制台并没有^r^R的区别,Vim也是如此。
        • @ehemient:同意。在 MS-DOS 中,您甚至不能输入小写的 ^X(其中 X 可以是任何字母)。
        • 在 Vim 中,Ctrl-shift-R (ctrl 与大写 R) 是替换模式。
        【解决方案9】:

        在 Visual Studio 中使用 VsVim?

        我在尝试 VsVim 时遇到了这个问题,它提供了bindings for Vim commands in Visual Studio

        我知道 Vim 本身中的 Ctrlr,但是这个特定的绑定在 VsVim 中不起作用(至少在我的设置中不起作用?)。

        起作用的是命令:red。这个比上面的稍微麻烦一点,但是当你真正需要的时候还是可以的。

        【讨论】:

        • 投了反对票,因为该问题专门针对 vim,而不是 Visual Studio。
        • @JohnVonNeumann 这与Vim有关,或者至少与vim绑定有关,只是在VS的上下文中。毕竟,这就是让我想到这个问题的原因。惩罚某人添加更多信息似乎有点苛刻和不必要,你不觉得吗,即使它可能会稍微超出 OP 的范围?
        • 不幸的是,这似乎不再有效?很烦人,因为撤消/重做是 VsVim 似乎特别不擅​​长的事情
        【解决方案10】:

        实际上,:undolist 很难使用,而 Vim 的 :earlier:later 更改时间跟踪仅可用于课程粒度修复。

        鉴于此,我求助于一个插件,它结合了这些功能来提供可浏览撤消的可视化树,称为“Gundo”。

        显然,只有当您需要细粒度的修复,或者您不确定要返回的文档的确切状态时,才使用此功能。请参阅:Gundo. Graph your Vim undo tree in style

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-14
          • 2015-03-09
          • 2015-08-13
          • 2011-11-25
          • 2011-08-04
          • 2014-04-15
          • 1970-01-01
          相关资源
          最近更新 更多