使用脚本中的 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 编译的,添加-gf到 vim 可能对你有用。 g 选项启用 GUI,而 f 选项将其保持在前台。我还知道在它自己的 xterm 中启动 vimdiff xterm -e vimdiff "$@"

答案4

那个怎么样:

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

它打开$file1进行编辑,然后是第二个文件。无法从标准输入读取任何内容,因此没有未命名的文件。

相关内容