有没有办法排队多对文件与vimdiff进行比较?

时间:2011-03-25 14:01:45

标签: vim vimdiff

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

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

5 个答案:

答案 0 :(得分:1)

据我所知,您无法使用单个vim命令执行此操作。你可以从for循环中启动vimdiff。

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

答案 1 :(得分: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

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

此处使用的另一个有用的提示是将以下内容放在.vimrc

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

然后如果没有变化你只需按f4退出,如果有变化你按f5。

答案 2 :(得分: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

执行时会在自己的标签中打开对。

答案 3 :(得分:1)

如果你想在所有组合中比较一个目录中的所有文件,这里是如何做到这一点,仍然避免比较一对(或一个文件本身):

for f1 in *; do 
  for f2 in *; do 
    [[ $f1 < $f2 ]] || vimdiff "$f1" "$f2"
  done
done

答案 4 :(得分:1)

这可以通过全局设置所有diffy选项而无需任何shell技巧来实现(以及一些自动命令,因为如果您尝试一次比较8个以上的文件,vim会生气)

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),并且即使在缓冲区之间切换或打开新文件,也始终处于diff模式。

如果要将所有文件合并到一个超级文件中,则可以使用:bn来解决问题。

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

  • 对于A1 A2 B1 B2 C1 C2:windo bn 2会做正确的事
  • 对于A1 B1 C1 A2 B2 C2,您首先需要进入A2缓冲区,然后:windo bn 1将做正确的事

我从help file提取了设置:

  

在每个已编辑文件中,都设置了以下选项:

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

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

并且只是凭经验发现了对自动命令的需求。