我有几十个文件需要与 vimdiff 进行比较和合并。有没有办法将成对的文件排队进行比较,以便我可以一次打开它们,而不是一次又一次地返回 shell 来打开每对文件?
这可以通过在自己的标签中打开每对来完成吗?我的外壳是 Bash。
如果您想在所有组合中将目录中的所有文件相互比较,以下是如何做到这一点,并且仍然避免将一对(或文件与自身)比较:
for f1 in *; do
for f2 in *; do
[[ $f1 < $f2 ]] || vimdiff "$f1" "$f2"
done
done
通过全局设置所有 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
这些选项设置在窗口的本地。当编辑另一个文件时,它们被重置为全局值。
并且仅凭经验发现了对自动命令废话的需求。
据我所知,你不能使用单个 vim 命令来做到这一点。您可以从 for 循环中启动 vimdiff。
或者尝试“融合” http://meld.sourceforge.net/
这是另一个答案,它在自己的选项卡中打开每一对。将以下内容再次保存在文件 (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
当您执行时,它将在它们自己的选项卡中打开这些对。
就像 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。