Antworten:
http://vim.wikia.com/wiki/Diff_current_buffer_and_the_original_file
Hier ist eine Funktion und ein Befehl, um einen Unterschied zwischen der aktuell bearbeiteten Datei und ihrer unveränderten Version im Dateisystem festzustellen. Legen Sie dies einfach in Ihrem vimrc oder im Plugin-Verzeichnis ab, öffnen Sie eine Datei, nehmen Sie einige Änderungen vor, ohne sie zu speichern, und tun Sie dies
:DiffSaved
.function! s:DiffWithSaved() let filetype=&ft diffthis vnew | r # | normal! 1Gdd diffthis exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype endfunction com! DiffSaved call s:DiffWithSaved()
Um die Diff-Ansicht zu verlassen, können Sie den
:diffoff
Befehl verwenden.Unten finden Sie eine ähnliche Funktion, die den
'cvs diff'
Befehl nachahmt ...
:w !diff % -
diff
. %
verweist auf den aktuell geöffneten Dateipfad. Warum ist das alles ein Argument für den :w
Befehl? Wie wird -
der Inhalt des Arbeitspuffers zugewiesen? Ist das in vim automatisch, dass der Inhalt des Puffers (oder vielleicht ein bestimmter Bereich im Puffer) stdin für Shell-Befehle zugewiesen wird?
:w
weil wir die Datei in den Befehl (on stdin
) schreiben . -
Weist es im Befehl an, aus zu lesen stdin
.
:w !git diff % -
für eine kolorierte Version, wenn Sie Git installiert haben!
fatal: bad flag '-' used after filename
wenn ich laufe :w !git diff % -
.
Weil einige Leute nach einer Erklärung für den Befehl fragten
:w !diff % -
Hier ist mein Versuch, eine detailliertere Antwort zu schreiben:
Ich gehe davon aus, dass Sie an einem System arbeiten, auf dem installiert cat
und echo
installiert ist (z. B. fast alle GNU / Linux-, Mac OS-, BSD- und andere UNIX-ähnliche Systeme).
Der obige Befehl funktioniert wie folgt:
Die Syntax zum Speichern einer Datei in vim lautet:
:w <filename>
Die Syntax zum Ausführen eines Shell-Befehls in vim lautet:
:!<command>
In der von vim ausgegebenen Shell-Umgebung wird %
zufällig auf den aktuellen Dateinamen verwiesen. Sie können dies überprüfen, indem Sie Folgendes ausführen:
:!echo %
Dies sollte den Dateinamen ausgeben (oder einen Fehler, wenn vim ohne Dateinamen ausgeführt wurde).
Mit cat können wir auch den Inhalt der Datei ausgeben:
:!cat %
Dies sollte den Dateiinhalt in seinem zuletzt gespeicherten Zustand oder einen Fehler zurückgeben, wenn er noch nie gespeichert wurde.
Das Programmdiff kann von der Standardeingabe (stdin) lesen. Die Manpage enthält Folgendes:
[...] Wenn eine DATEI '-' ist, lesen Sie die Standardeingabe. [...]
Wenn Sie den Befehl save ohne Dateinamen, sondern mit einem dahinter stehenden Shell-Befehl ausführen, schreibt vim den Dateiinhalt in stdin der Shell, anstatt ihn in einer physischen Datei zu speichern. Sie können dies überprüfen, indem Sie ausführen
:w !cat
Dies sollte immer den aktuellen Inhalt der Dateien drucken (der stattdessen in eine Datei geschrieben worden wäre).
Zusammenfügen (oder tl; dr): Die Datei wird in stdin "gespeichert", diff wird mit dem Dateinamen und stdin als Eingabe ausgeführt.
Wenn Sie dies wissen, können Sie auch Dateien mit vimdiff vergleichen, die so etwas tun - dies ist nur eine Idee, die Sie nicht tun möchten:
:w !cat > /tmp/tempFile && vimdiff /tmp/tempFile % && rm /tmp/tempFile
(Dann schreibgeschützt öffnen und vimdiff mit schließen :qall
)
vim - -c ":vnew $1 |windo diffthis"
, es ausführbar zu machen, es beispielsweise im PATH zu speichern vimdiffWithStdin
und dann mit dem folgenden Befehl in vim zu vergleichen::w !vimdiffWithStdin %
:w !vimdiff % /dev/stdin
. Ich weiß nicht, ob es einen ähnlichen Trick für Windows gibt.
Ich mag immer Diffchanges - nett, einfach, funktioniert.
von vimrc_example.vim:
" Convenient command to see the difference between the current buffer and the
" file it was loaded from, thus the changes you made.
if !exists(":DiffOrig")
command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis
\ | wincmd p | diffthis
endif
w !diff % -
ist , dass es über Remote - Quellen auch funktioniert (zB vim sftp://example.com/foo.txt
)
Geben Sie Folgendes ein und verwenden Sie den Befehl: DIFF
function! s:diff()
let tmpa = tempname()
let tmpb = tempname()
earlier 100h
exec 'w '.tmpa
later 100h
exec 'w '.tmpb
update
exec 'tabnew '.tmpa
diffthis
vert split
exec 'edit '.tmpb
diffthis
endfunction
command! -nargs=0 DIFF call <SID>diff()
Nicht genau das, wonach Sie suchen, aber SCMDiff.vim ist wirklich cool. Ein Tastendruck, und es hebt Ihre aktuelle Datei mit der Kopfrevision in einem Versionsverwaltungs-Repo hervor. Es soll mit vielen SCMS funktionieren. Ich benutze es notgedrungen.
Hier gibt es ein Plugin, das auf unterschiedlichen Antworten basiert: https://github.com/gangleri/vim-diffsaved
Es bietet die :w !diff % -
Methode und die involviertere diffthis
.
Abgesehen davon erlaubt undotree dies auch, aber auch viel mehr (unterscheidet sich zwischen verschiedenen Rückgängig-Checkpoints). Ähnlich wie bei Gundo .
Ich kann das empfehlen Histwin Plugin .
Es unterscheidet sich zwar nicht von der aktuell gespeicherten Version der Datei (wie die anderen Antworten), kann jedoch Änderungen seit Beginn der Bearbeitung und sogar vimdiff wiederholen , um die Änderungen in Ordnung. Der Unterschied zeigt, ob Sie zwischenzeitlich speichern.
Zusätzlich wird eine Liste von angezeigt aller Rückgängig-Verlaufszweige und Sie können zwischen ihnen wechseln oder unterscheiden.
PS: Während das Plugin seit jeder Dateiänderung nicht automatisch Momente im Bearbeitungsverlauf verfolgt, können Sie den Moment, in dem Sie die Datei speichern, explizit "markieren", damit Sie später damit vimdiff können, wenn Sie dies möchten. Vielleicht könnte dies automatisiert werden?
Wenn Sie vim zum Vergleich wie in vimdiff verwenden möchten, können Sie Folgendes tun:
Bearbeiten Sie Ihre .vimrc und fügen Sie hinzu:
nmap <F8> :w !vim -M -R - -c ":vnew % \| windo diffthis"<CR><CR>
Von dort aus sehen Sie Ihre Änderungen und können die Diff-Ansicht mit beenden qall
like in vimdiff im Befehlsmodus F8 drücken. Ersetzen Sie F8 durch eine beliebige Taste.
Bearbeiten: -M hinzugefügt, um Änderungen zu verbieten, da diese nicht gespeichert werden.
Vim: Error reading input, exiting...
irgendwelche Ideen, was hier falsch läuft?
git unterstützt den folgenden Befehl
:w !git diff --no-index -- % -
Ordnen Sie es einem Befehl zu, indem Sie Folgendes zu Ihrem ~ / .vimrc hinzufügen
command GitDiff execute "w !git diff --no-index -- % -"
Jetzt ausführen :GitDiff
zu einem praktischen kleinen Befehl, um den Unterschied vor jedem Speichern schnell anzuzeigen.
Sie können vim dazu bringen, ein letztes Backup und ein Original-Backup zu erstellen mit:
:set backup
:set patchmode=.orig
Danach können Sie sie in einem Split öffnen:
:vsp %:p~ or :vsp %:.orig
Und von dort aus:
:vimdiff in each buffer
Wenn Sie keine Reste mehr haben, aber Vimdiff wollen, können Sie auch Folgendes tun:
ggVGy # copy the whole buffer
:vnew # open a split
CTRL-W w # switch to it
shift-P # paste at start
und dann: differfthis bei jedem Split
Änderungen, die Sie gerade bearbeitet haben [ Puffer ], dh diejenigen, die sich von der zuletzt gespeicherten Version (im Arbeitsverzeichnis ) unterscheiden, können sich von der letzten Indexversion ( Git ) unterscheiden. Ich habe beide abgebildet:
" Find diff inbetween currrent buffer and ... A{last index version} vs B{last saved version in working directory}
" - A{last index version}: the file as you last commited it
" git diff to vimdiff against the index version of the file:
nnoremap <leader>gd <Esc>:Gvdiff<CR><Esc>:echo "currentBuffer vs lastIndexVersion (last commited)"<CR>
" - B{last saved version in working directory}: the file you last :w,
" not neccesary commited it (not commited for sure if it is in NO git project)
" https://vim.fandom.com/wiki/Diff_current_buffer_and_the_original_file
nnoremap <leader>gd2 <Esc>:DiffSaved<CR><Esc>:echo "currentBuffer vs lastSaved (not neccesary equal to last commited)"<CR>
function! s:DiffWithSaved()
let filetype=&ft
diffthis
vnew | r # | normal! 1Gdd
diffthis
exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
endfunction
com! DiffSaved call s:DiffWithSaved()
Beispiel von vimdiff vs Gdiff.
Darüber hinaus zu einfachen vimdiff
Homonym-Datei in anderen Pfad:
" vimdiff homonym file
nnoremap <leader>dh <Esc>:vsplit %:p:h/../__/%:t <bar> :windo diffthis<Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left><Left>
"E.g."$ vim /path01/proj02_pg064/processorder.php
":vsplit %:p:h/../proj01_pg05/%:t | :windo diffthis
Gdiff
wenn möglich und ansonsten (zB kein Git-Projekt) dann a ausführen :vimdiff
. Mit try-catch-endtry
. Aber so :DiffWithSaved
fehlt es in einem Git-Projekt.
:w !diff % -
überlegen, wenn Sie vim für eine sich ständig ändernde und große Anzahl von Boxen verwenden, für die Sie die .vimrc nicht einfach ändern können? (Vorausgesetzt, sie haben Diff installiert.)