スクリプトでvimdiffを使用してファイルを比較する

スクリプトでvimdiffを使用してファイルを比較する

vimdiff両方のディレクトリを再帰的に比較し、違いが見つかったら実行するスクリプトを作成しています。

#!/bin/bash

dir1=${1%/}
dir2=${2%/}

find "$dir1/" -type f -not -path "$dir1/.git/*" | while IFS= read line; do
    file1="$line"
    file2=${line/$dir1/$dir2}

    isdiff=$(diff -q "$file1" "$file2")

    if [ -n "$isdiff" ]; then
        vimdiff "$file1" "$file2"
    fi
done

vimは「入力が端末から来ていません」という警告を表示するため、機能しません。-引数を提供する必要があるのは少し面倒ですが、ある程度作業しています。

#!/bin/bash

dir1=${1%/}
dir2=${2%/}

find "$dir1/" -type f -not -path "$dir1/.git/*" | while IFS= read line; do
    file1="$line"
    file2=${line/$dir1/$dir2}

    isdiff=$(diff -q "$file1" "$file2")

    if [ -n "$isdiff" ]; then
        cat "$file1" | vim - -c ":vnew $file2 | windo diffthis"
    fi
done

問題は、diffウィンドウの右側に新しいファイルがあることです。 dir1のソースファイルとdir2のソースファイルを比較したいです。どうすればいいですか?

答え1

vimだからvimdiff推測したようだ。標準入力端末。スクリプトで次の操作を行うことで、この問題を解決できます。

</dev/tty vimdiff "$file1" "$file2"

答え2

次のようにしてみてください。

#! /bin/sh

[ $# -eq 2 -a -d "$1" -a -d "$2" ] || exit 1

find "$1" -name .git -prune -o \( -type f -printf '%P\n' \) | \
    while IFS= read -r f; do
        if [ -f "$2/$f" ] && ! diff -q -- "$1/$f" "$2/$f" >/dev/null; then
            vimdiff -- "$1/$f" "$2/$f" </dev/tty
        fi
    done

上記はGNU find(1)-printf動作用)を想定しています。

答え3

Xで実行している場合は、いくつかの異なるトリックを使用できます。 vimのコピーがguiにコンパイルされている場合は、-gfvimに追加するのが役立ちます。 gオプションはGUIを有効にし、fオプションはGUIを前景に保持します。私は自分のxtermでvimdiffを起動する方法も知っていますxterm -e vimdiff "$@"

答え4

どのように:

vim -c ":e $file1 | vnew $file2 | windo diffthis"

編集用に開き、$file12番目のファイルが開きます。標準入力では何も読み取れないため、名前のないファイルはありません。

関連情報