3

我有几十个文件需要与 vimdiff 进行比较和合并。有没有办法将成对的文件排队进行比较,以便我可以一次打开它们,而不是一次又一次地返回 shell 来打开每对文件?

这可以通过在自己的标签中打开每对来完成吗?我的外壳是 Bash。

4

5 回答 5

2

如果您想在所有组合中将目录中的所有文件相互比较,以下是如何做到这一点,并且仍然避免将一对(或文件与自身)比较:

for f1 in *; do 
  for f2 in *; do 
    [[ $f1 < $f2 ]] || vimdiff "$f1" "$f2"
  done
done
于 2015-03-13T13:42:11.603 回答
2

通过全局设置所有 diffy 选项(以及一些自动命令,因为如果您尝试一次 diff 超过 8 个文件,vim 会生气),这在没有任何 shell 恶作剧的情况下是可行的

vim -c 'windo set diff scrollbind cursorbind scrollopt+=hor nowrap foldmethod=diff foldcolumn=2 | au BufWinEnter * setlocal diff | au BufWinLeave * setlocal nodiff' -O2 your filenames here

这将打开缓冲区中的所有文件,并将 vim 垂直拆分为两个窗口(-o2如果您想要水平则使用),并且始终处于差异模式,即使您在缓冲区之间切换或打开新文件也是如此。

如果您将所有文件合并到一个超级文件中,那么使用:bn就可以了。

如果您要合并成对的文件,那么您将需要 的一些变体:windo bn N,其中 N 取决于您列出文件的方式:

  • 因为A1 A2 B1 B2 C1 C2,:windo bn 2会做正确的事
  • 对于A1 B1 C1 A2 B2 C2,您首先需要转到A2缓冲区,然后:windo bn 1做正确的事情

我从帮助文件中提取了设置:

在每个已编辑的文件中,设置了这些选项:

'diff'    on
'scrollbind'  on
'cursorbind'  on
'scrollopt' includes "hor"
'wrap'    off
'foldmethod'  "diff"
'foldcolumn'  value from 'diffopt', default is 2

这些选项设置在窗口的本地。当编辑另一个文件时,它们被重置为全局值。

并且仅凭经验发现了对自动命令废话的需求。

于 2018-12-27T06:41:02.160 回答
1

据我所知,你不能使用单个 vim 命令来做到这一点。您可以从 for 循环中启动 vimdiff。

或者尝试“融合” http://meld.sourceforge.net/

于 2011-03-25T14:17:22.160 回答
1

这是另一个答案,它在自己的选项卡中打开每一对。将以下内容再次保存在文件 (do2.sh) 中:

#!/bin/bash

files1=( file1.txt file2.txt file3.txt )
files2=( file1_.txt file2_.txt file3_.txt )

cmd="vim -c 'set diffopt=filler,vertical' -c 'edit ${files1[0]}' -c 'diffsplit ${files2[0]}' "
echo $cmd
for i in {1..2}; do
  cmd="${cmd} -c 'tabe ${files1[i]}' -c 'diffsplit ${files2[i]}' "
done

eval $cmd

当您执行时,它将在它们自己的选项卡中打开这些对。

于 2011-03-25T16:49:35.473 回答
1

就像 StephenPaulger 建议的那样,for 循环适用于少量文件。我这样做的方法是创建一个包含以下内容的小脚本(比如 do.sh):

#!/bin/bash

files1=( file1.txt file1_.txt )
files2=( file2.txt file2_.txt )
for i in {0..1} ; do
  vimdiff ${files1[i]} ${files2[i]}
done

这将允许您在为不同文件执行差异时不必在 shell 中键入任何内容,一旦您退出一对文件的差异,另一个文件会立即显示。

在这里使用的另一个有用的技巧是将以下内容放入您的 .vimrc

if &diff
   map <f4> :qa<cr>
   map <f5> :wqa!<cr>
   map <f6> :qa!<cr>
 endif

然后如果没有变化就按f4退出,如果有变化就按f5。

于 2011-03-25T16:01:58.067 回答