在Vim中跳过撤销步骤

19
假设我处于文档的状态A,然后按顺序进行了更改B、C和D。是否有一种方法可以保留更改B和D,但跳过更改C?
或者说,假设我处于文档的状态A,我进行更改B,撤销更改B,然后进行更改C和D(因此Vim具有两个分支的撤销树)。然后我改变主意,决定使用B和D,但不使用C。
如何在Vim中实现这一点?我已安装了`gundo.vim`插件,但并没有经常使用它。

有趣的问题模式。我通常会使用g-和g+以及大量的yank/put。我非常好奇人们会想出什么。 - sehe
1
我不确定在Vim中是否可能实现这一点。更改C可以基于B。你想要的基本上是一种存储带有编辑的文档特定状态的方法,以及合并不同状态的能力。听起来像源代码版本控制系统在执行“合并”操作时所能做的。如果您需要快速跳转到修订版之间,我认为您需要练习使用命名缓冲区和/或保存文件的替代版本。 - ewh
我只能想象一种自动完成此操作的方法:将整个撤销树导入某个版本控制系统,然后使用它来跳过更改(例如,git rebase -i 提供了一种删除某个提交的方式,即使它有子提交)。但是我从未见过这样的插件,所以您必须自己编写。 - ZyX
1
是的,这听起来像是一个编辑器,可以将每个步骤存储在像Mercurial或Git这样的好的版本控制系统中。我真的不认为vim或任何其他编辑器可以做到这一点。当然,除了emacs,你可以使用git插件并编写一些脚本来实现它 :-) - user405725
听起来像是一种交互式的撤销/重做类型的东西!?! - yasouser
1
我不认为你能做到这一点,但 Gundo 可能会帮助你获取想要的行:http://sjl.bitbucket.org/gundo.vim/ - Austin Taylor
2个回答

2

好的,我会试着回答这个问题:不,我认为用vim无法完全实现您想要的功能。

gundo.vim 为vim的撤销操作添加了一个漂亮的界面,但并未改变其核心能力。因此,我查看了官方vim文档,看看是否有任何提示表明它是否具备此功能:

没有关于合并两个分支的信息。我认为ewh和ZyX是正确的:要获得将B与D合并的通用解决方案,vim需要:

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

当然,您可以尝试手动完成,方法是打开具有版本B、C和D以及一些差异的文件。


注意:如果我误解了您的意思,您并不是在寻求一般性的解决方案,而是需要针对具体情况的帮助,请告诉我,我会尽力帮助您 :)

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

这将给出三路合并的差异,但仍需要手动选择每个合并冲突中 D 中的每个红线。 这不是一个简单的解决方案。

如果您改为执行

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

然后合并会自动发生(除了具有多个更改的单独行)

对于更复杂的情况,它变得更加困难。

注意:我不确定修订控制工具如何有所帮助。您基本上正在执行类似于在B和D之间创建补丁,然后从C到D中减去该补丁的操作。我认为修订控制系统通常设计用于管理不同更改来源之间的合并,而不是沿单个分支的更改。

kdiff3可在以下网址下载:http://kdiff3.sourceforge.net/


1
为什么选择kdiff3?这是vim,所以它有diff。如果你只想合并,请使用meld或任何易于集成的cli程序。关于“...修订工具如何帮助[...]而不是[...]单个分支”的问题:经常使用微提交吗?整个git apply --interactive概念,甚至可能是它的索引功能都是针对这个需求而设计的。 - sehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接