如何在 Vimdiff 中展开/折叠差异部分?

Posted

技术标签:

【中文标题】如何在 Vimdiff 中展开/折叠差异部分?【英文标题】:How can I expand/collapse a diff sections in Vimdiff? 【发布时间】:2011-07-14 10:01:10 【问题描述】:

我今天开始使用 vimdiff,并且想做一些我在基于 Windows 的差异编辑器上认为理所当然的事情(例如展开/折叠差异部分,具有完整的文件扩展/仅具有三个上下文的差异线上方或下方等)。我目前只知道以下命令:

键盘快捷键:

do - 从其他窗口获取更改到当前窗口。

dp - 将当前窗口的更改放入另一个窗口。

]c - 跳转到下一个更改。

[c - 跳转到上一个更改。

Ctrl+W, w - 切换到另一个分割窗口(Ctrl + W , Ctrl + W 做同样的事情,以防你稍后松开 Ctrl 键)

谁能指出我正确的方向,以便我可以复制类似的功能?

例如,如果我可以在差异周围展开/折叠线,那就太好了。

【问题讨论】:

有关添加/恢复一长串更改的快捷方式,请参阅***.com/q/6093746/212942 参见:Use vimdiff as git mergetool 和 vimdiff – the cool way to diff for vim users 看到这个问题在 4 年多后被关闭很有趣,当 'vimdiff' 被谷歌搜索时,它是前 3 个帖子! 见:vimdiff cheat sheet at GitHub Gist 【参考方案1】:

除了你提到的之外,我只在比较时经常使用以下内容:

:diffupdate :diffu -> 重新计算差异。当进行几次更改后,Vim 不再显示最小更改时,它很有用。请注意,它仅在文件已在 vimdiff 中修改时才有效。否则,请使用: :e 重新加载文件,如果它们已在 vimdiff 之外修改。 :set noscrollbind -> 暂时禁用两个缓冲区的同时滚动,:set scrollbind 重新启用并滚动。

您要求的大部分内容都是折叠:the Vim user manual's chapter on folding。在差异之外,我有时会使用:

zo -> 打开折叠。 zc -> 关闭折叠。

但你可能会得到更好的服务:

zr -> 降低折叠级别。 zm -> 请再折叠一层。

甚至:

zR -> 完全减少折叠,我说过! zM -> 最多折叠!

您要求的另一件事,使用 n 行折叠,可以在 Vim reference manual section on options 找到,通过 section on diff:

set diffopt=<TAB>,然后更新或添加context:n

您还应该看看user manual section on diff。

【讨论】:

确实非常全面!!我会查看您所说的链接,但将问题保持开放几天,看看我是否会收到更多回复(我在周末发布,那时没有多少人会活跃)。 顺便问一下,你知道vimdiff是否可以用于合并/三向解析等吗?那就太好了!! @shan23 对于 3 路合并(对于 git),请检查 this。 svn 上也有 cmets。当你有 4 个缓冲区时,仍然试图找出命令(do/dp 不起作用)。 要使:set noscrollbind 生效,还必须使用:set nocursorbind,这不是默认值。所以这两个选项都必须调整。 "zm = one More folder level, please" 我不记得这个了,我喜欢这个描述 - 谢谢!【参考方案2】:

设置 vimdiff 忽略大小写。

使用 vim diff 开始

 gvim -d main.sql backup.sql &

我发现一个文件的 mysql 关键字是小写的,而另一个大写的关键字几乎每隔一行都显示出差异,这很烦人。

:set diffopt+=icase

这会动态更新屏幕,您可以再次轻松将其关闭。

【讨论】:

虽然这是一个不错的提示,但我看不出它与手头的问题有什么关系(如何在 vimdiff 中展开和折叠 diff 部分)。【参考方案3】:

其实,如果你使用 Ctrl + W, W,你就不需要再添加那个额外的Ctrl kbd>。它做同样的事情。

【讨论】:

我发现 ^W ^W 的打字速度比 ^W w 快很多。 认为这值得一提github.com/ankr/dotfiles/blob/master/files/vimrc#L103【参考方案4】:

Ctrl + W, W 如前所述可用于在窗格之间导航。

现在您可以单独选择特定更改并将其粘贴到另一个窗格,如下所示。在这里,我给出了一个例子,好像我想将我的一段代码从窗格 1 更改为窗格 2,并且当前我的光标在窗格 1 中。

使用 Shift + V 突出显示一行并使用向上或向下键选择您需要的代码段,然后从下面编写的步骤 3 继续粘贴您的更改在另一个窗格中。

使用视觉模式,然后改变它

    V。这将带您进入视觉模式 使用向上或向下键选择所需的代码 按 Esc 现在使用 yy 复制或 dd 剪切更改 执行 Ctrl + WW 导航到窗格 2 按 P 将更改粘贴到您需要的位置

【讨论】:

您指定的全部内容(第一行除外)是 vim 本身的功能,而不是 vimdiff。

以上是关于如何在 Vimdiff 中展开/折叠差异部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中制作可展开/可折叠的部分小部件

如何在 vimdiff 中的垂直分割和水平分割之间切换?

React:如何在内容大小未知时为展开和折叠 Div 设置动画

html5 - 如何折叠和展开复杂的表格元素

如何展开和折叠使用 aria-expanded 属性制作的 div?

如何在 Flutter 中折叠其他 ExpansionTile 元素