Comparando arquivos com o vimdiff de um script

2

Estou escrevendo um script para comparar dois diretórios recursivamente e executar vimdiff quando encontrar uma diferença:

#!/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

Isso não funciona porque o vim lança um aviso: "A entrada não é de um terminal". Eu entendo que eu preciso fornecer o argumento - , o que é meio complicado, mas eu tenho mais ou menos trabalho:

#!/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

O problema com isto é o lado direito da janela de diferenças é um novo arquivo. Eu quero comparar o arquivo original em dir1 para o arquivo original em dir2. Como posso fazer isso?

    
por David Kennedy 12.05.2015 / 07:14

4 respostas

3

vim e, portanto, vimdiff parecem assumir que stdin é um tty . Você pode resolver isso por algo assim em seu script:

</dev/tty vimdiff "$file1" "$file2"
    
por 12.05.2015 / 07:59
2

Tente algo assim:

#! /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

O acima assume o% GNUfind(1) (para a ação -printf ).

    
por 12.05.2015 / 08:08
1

Se você está rodando sob X, você pode usar alguns truques diferentes. Se você copiar do vim é compilado com um gui adicionando -gf ao vim pode funcionar para você. a opção g permite que o gui e a opção f o mantenham em primeiro plano. Eu também sou conhecido por iniciar o vimdiff em seu próprio xterm com xterm -e vimdiff "$@" .

    
por 12.05.2015 / 08:14
0

Que tal isso:

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

Abre $file1 para edição e, em seguida, o segundo arquivo. Nada para ler de stdin, portanto, nenhum arquivo sem nome.

    
por 12.05.2015 / 08:08