CODE:
fu! DiffUnified()
let diffexpr="diff -Nuar"
let bname=bufname("")
let origtemp=0
" Case 1: File has a filename and is not modified
if !&modified && !empty(bname)
let tempfile=0
let origFile=bname.".orig"
else
" Case 2: File has a filename and is modified
if &modified && !empty(bname)
if !filereadable(bname.".orig")
sp
enew
r #
0d
let tempfile2=tempname()
exe ":sil w! " .tempfile2
wincmd q
let origtemp=1
wincmd p
endif
let origFile=tempfile2
" let bname=tempname()
" exe ":sil w! ".bname
" let tempfile=1
" Case 2: File is new and is modified
else
if &modified
let origFile=bname.".orig"
else
let origFile=""
endif
endif
let bname=tempname()
exe ":sil w! ".bname
let tempfile=1
endif
try
if !filereadable(origFile)
let origFile=input("With which file to diff?: ","","file")
endif
if !filereadable(bname)
exe ":sil w! ".bname
endif
if empty(origFile)
throw "nofile"
endif
exe "sil sp"
exe "enew"
set bt=nofile
exe "sil r!".diffexpr." ".origFile." ".bname
exe "0d_"
exe "set ft=diff"
" Clean up temporary files
if tempfile == 1
exe "sil :!rm -f ". bname
let tempfile=0
endif
if origtemp == 1
exe "sil :!rm -f ". origFile
let origtemp=0
endif
catch
endtry
endf
let diffexpr="diff -Nuar"
let bname=bufname("")
let origtemp=0
" Case 1: File has a filename and is not modified
if !&modified && !empty(bname)
let tempfile=0
let origFile=bname.".orig"
else
" Case 2: File has a filename and is modified
if &modified && !empty(bname)
if !filereadable(bname.".orig")
sp
enew
r #
0d
let tempfile2=tempname()
exe ":sil w! " .tempfile2
wincmd q
let origtemp=1
wincmd p
endif
let origFile=tempfile2
" let bname=tempname()
" exe ":sil w! ".bname
" let tempfile=1
" Case 2: File is new and is modified
else
if &modified
let origFile=bname.".orig"
else
let origFile=""
endif
endif
let bname=tempname()
exe ":sil w! ".bname
let tempfile=1
endif
try
if !filereadable(origFile)
let origFile=input("With which file to diff?: ","","file")
endif
if !filereadable(bname)
exe ":sil w! ".bname
endif
if empty(origFile)
throw "nofile"
endif
exe "sil sp"
exe "enew"
set bt=nofile
exe "sil r!".diffexpr." ".origFile." ".bname
exe "0d_"
exe "set ft=diff"
" Clean up temporary files
if tempfile == 1
exe "sil :!rm -f ". bname
let tempfile=0
endif
if origtemp == 1
exe "sil :!rm -f ". origFile
let origtemp=0
endif
catch
endtry
endf
Diese Funktion such automatisch nach einer passenden .orig Datei und nutzt diese, um den Patch in einem neuen Fenster zu erstellen. Falls keine .orig-Datei vorhanden ist, aber die aktuelle Datei modifiziert ist, wird automatisch die unmodifizierte Version der aktuellen Datei benutzt. Ansonsten fragt es nach einer zu vergleichenden Datei.
Aufruf:
:call DiffUnified()
Abhängigkeiten: diff muß vorhanden sein und das löschen der temporären Dateien funktioniert nur unter Unix/Linux. Man könnte evtl. auch den passenden del-Aufruf für die Windows-Version hinzufügen.
Dies ist eine Kopie von diesem Vim Tipp.
