在 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 文档,看看是否有任何暗示它是否能够做到这一点:
没有把两个分支合并在一起。我认为 ewh 和 ZyX 是对的:要获得将 B 与 D 合并的通用解决方案,vim 需要
-
Bram 将在未来版本中将其添加为单独的功能
有人通过与已经可以合并的东西(如 git/hg)集成在插件中实现它
您当然可以尝试通过打开具有版本 B、C 和 D 的文件以及一些差异来手动执行此操作。
注意:如果我误解了,并且您不知道通用解决方案并且正在寻求有关此特定实例的帮助,请告诉我,我会看看我能做什么: )
【讨论】:
以上是关于在 Vim 中跳过撤消步骤的主要内容,如果未能解决你的问题,请参考以下文章
Maven 发布插件 - 在发布中跳过快照版本更新:准备步骤
如何在qt安装程序框架中的卸载步骤中省略component.addOperation的撤消步骤?
核心数据:如何在两个 NSManagedObjectContext 之间合并插入/更新/删除,同时将合并保持为可撤消的步骤?