在 Vim 中跳过撤消步骤

Posted

技术标签:

【中文标题】在 Vim 中跳过撤消步骤【英文标题】:Skip undo step in Vim 【发布时间】:2011-08-12 00:16:37 【问题描述】:

假设我在文档中处于状态 A。然后我进行更改 B、C 和 D(按顺序)。

有没有办法可以保留更改 B 和 D,但跳过 C?

或者,假设我在文档中处于状态 A。我进行更改 B,撤消它,然后进行更改 C 和 D(所以 Vim 有一个带有两个分支的撤消树)。然后我改变主意并决定我想使用 B 和 D 而不是 C。

如何在 Vim 中做到这一点?我已经安装了gundo.vim 插件,但我没怎么用过。

【问题讨论】:

有趣的提问模式。我通常用 g- 和 g+ 以及大量的 yank/put 来欺骗。我很好奇人们想出了什么 我不确定这在 Vim 中是否可行。更改 C 可以基于 B。您基本上想要的是一种通过编辑存储文档特定状态的方法,然后能够合并不同的状态。听起来像是源核心修订系统在进行“合并”操作时可以做的事情。如果您需要在修订之间快速跳转,我认为您需要练习使用命名缓冲区和/或保存文件的替代版本。 我只能想象一种自动执行此操作的方法:将整个撤消树导入某个 VCS,然后使用它来跳过更改(例如,git rebase -i 提供了一种删除某些提交的方法,即使它有孩子)。不过没见过这样的插件,就得自己写了。 是的,这听起来像是一个将每一步都存储在 Mercurial 或 Git 等优秀 VCS 中的编辑器。老实说,我认为vim 或任何其他编辑都做不到。除了emacs,当然,你可以通过使用 git 插件和脚本来做到这一点:-) 我不认为你能做到这一点,但 Gundo 可能有助于抓住你想要的线条:sjl.bitbucket.org/gundo.vim 【参考方案1】:

有没有办法可以保留更改 B 和 D,但跳过 C?

你在状态 D. :w file.ext_D

回溯到状态 C. :w file_ext_C

回溯到状态 B. :w file.ext_B

:!kdiff3 file.ext_B file.ext_C file.ext_D

这提供了差异的 3 路合并,但您仍然必须手动进入并为每个合并冲突选择 D 中的每条红线。不完全是一个简单的解决方案。

如果你这样做

:!kdiff3 file.ext_C file.ext_B file.ext_D

然后合并自动发生(除了有多个更改的个别行)

对于更复杂的场景,它变得更加困难。

注意:我不确定修订控制工具有多大帮助。你基本上是在做一些事情,比如在 B 和 D 之间创建一个补丁,然后从中减去从 C 到 D 的补丁。在我看来,修订控制系统通常旨在管理不同更改源之间的合并,而不是沿单个分支的更改。

kdiff3 位于:http://kdiff3.sourceforge.net/

【讨论】:

为什么选择 kdiff3?这个 is vim,所以它有差异。如果您只想合并,请使用 meld 或任何易于集成的 cli 程序。回复:... how a revision tool is much help [...] not [...] a single branch:经常使用微提交?整个 git apply --interactive 概念,甚至它的索引功能都可能是针对这个非常需要的【参考方案2】:

好吧,我会试一试,然后说:不,我不认为有办法用 vim 做你想做的事。

gundo.vim 为 vim 的 undo 添加了一个不错的接口,但不会改变它的核心功能。所以我查看了官方的 vim 文档,看看是否有任何暗示它是否能够做到这一点:

vim docs: undo User manual page about undo

没有把两个分支合并在一起。我认为 ewh 和 ZyX 是对的:要获得将 B 与 D 合并的通用解决方案,vim 需要

    Bram 将在未来版本中将其添加为单独的功能 有人通过与已经可以合并的东西(如 git/hg)集成在插件中实现它

您当然可以尝试通过打开具有版本 B、C 和 D 的文件以及一些差异来手动执行此操作。


注意:如果我误解了,并且您不知道通用解决方案并且正在寻求有关此特定实例的帮助,请告诉我,我会看看我能做什么: )

【讨论】:

以上是关于在 Vim 中跳过撤消步骤的主要内容,如果未能解决你的问题,请参考以下文章

Maven 发布插件 - 在发布中跳过快照版本更新:准备步骤

如何在qt安装程序框架中的卸载步骤中省略component.addOperation的撤消步骤?

在 reStructuredText 中跳过标题级别

在播放中跳过静音 - 优化值

如何在函数调用中跳过可选参数?

核心数据:如何在两个 NSManagedObjectContext 之间合并插入/更新/删除,同时将合并保持为可撤消的步骤?