我有几十个文件需要比较并与vimdiff合并。有没有办法排队文件对进行比较,以便我可以一次打开它们,而不是一次又一次地返回shell来打开每对文件?
可以通过在自己的标签中打开每一对来完成吗?我的shell是Bash。
答案 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
这些选项在窗口本地设置。编辑另一个文件时,它们将重置为全局值。
并且只是凭经验发现了对自动命令的需求。