比較してvimdiffとマージする必要のあるファイルが数十個あります。シェルに何度も戻ってファイルの各ペアを開くのではなく、一度にすべてを開くことができるように、比較のためにファイルのペアをキューに入れる方法はありますか?
これは、各ペアを独自のタブで開くことで実行できますか?私のシェルはBashです。
ディレクトリ内のすべてのファイルをすべての組み合わせで相互に比較する場合は、次の方法でペアを2回(またはファイル自体と)比較しないようにする方法を説明します。
for f1 in *; do
for f2 in *; do
[[ $f1 < $f2 ]] || vimdiff "$f1" "$f2"
done
done
これは、すべてのdiffyオプションをグローバルに設定することで、シェルシェナニガンなしで実行できます(一度に8つ以上のファイルをdiffしようとすると、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が2つのウィンドウに垂直に分割され(-o2
水平が必要な場合に使用)、バッファーを切り替えたり新しいファイルを開いたりしても、常に差分モードになります。
すべてのファイルを1つのスーパーファイルにマージする場合は、を使用: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
これらのオプションは、ウィンドウに対してローカルに設定されます。別のファイルを編集すると、それらはグローバル値にリセットされます。
そして、経験的にナンセンスな自動コマンドの必要性を発見しただけです。
これは、各ペアを独自のタブで開く別の回答です。以下をファイル(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
実行すると、ペアがそれぞれのタブで開きます。
私の知る限り、単一のvimコマンドを使用してそれを行うことはできません。forループ内からvimdiffを開始できます。
または、「meld」を試してくださいhttp://meld.sourceforge.net/
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
これにより、異なるファイルの差分を実行している間、シェルに何も入力する必要がなくなります。一方のファイルのペアの差分を終了すると、もう一方のファイルがすぐに表示されます。
ここで使用するもう1つの便利なヒントは、.vimrcに次のものを入れることです。
if &diff
map <f4> :qa<cr>
map <f5> :wqa!<cr>
map <f6> :qa!<cr>
endif
次に、変更がない場合はf4を押して終了し、変更がある場合はf5を押します。