2011-03-25 33 views
1

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

这可以通过打开每个对在自己的选项卡中完成?我的外壳是Bash。

回答

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 
当你执行它会在自己的标签中打开了对

+0

当你的答案进入时,我手动完成了大部分对。这应该是我所希望的,谢谢。 – 2011-03-25 17:21:58

+0

这是一个好主意,但vim有十个-c参数的限制,所以它不适用于问题中指定的“几十个文件”(正如我发现试图使用它)。更好的方法是使用for循环将tabe和diffsplit命令写入文件,然后在启动vim时使用-S来源。 – Etaoin 2015-03-12 16:09:28

1

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

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

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在外壳键入任何内容不同的文件,一旦您退出一对文件的差异,另一个文件立即显示出来。

另一个有用的技巧在这里使用是摆在你的.vimrc

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

以下然后如果没有改变,你只需按F4退出,如果有您按F5。

1

如果你想在彼此一个目录下的所有文件进行比较所有组合,这里是如何做到这一点,仍然避免两次比较一对(或与自身的文件):

for f1 in *; do 
    for f2 in *; do 
    [[ $f1 < $f2 ]] || vimdiff "$f1" "$f2" 
    done 
done 
相关问题