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"
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?
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
).
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 "$@"
.
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.
Tags bash vim shell-script vimdiff