Ich benutze Vim. Ich öffne eine Datei. Ich bearbeite es und möchte sehen, was ich bearbeitet habe, bevor ich es speichere.
Wie kann ich das in Vim machen?
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 % -
ü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.)quelle
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 (onstdin
) schreiben .-
Weist es im Befehl an, aus zu lesenstdin
.: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
Hier ist mein Versuch, eine detailliertere Antwort zu schreiben:
Ich gehe davon aus, dass Sie an einem System arbeiten, auf dem installiert
cat
undecho
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:
Die Syntax zum Ausführen eines Shell-Befehls in vim lautet:
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: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:
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 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
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:
(Dann schreibgeschützt öffnen und vimdiff mit schließen
:qall
)quelle
vim - -c ":vnew $1 |windo diffthis"
, es ausführbar zu machen, es beispielsweise im PATH zu speichernvimdiffWithStdin
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.
quelle
von vimrc_example.vim:
quelle
w !diff % -
ist , dass es über Remote - Quellen auch funktioniert (zBvim sftp://example.com/foo.txt
)Geben Sie Folgendes ein und verwenden Sie den Befehl: DIFF
quelle
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.
quelle
Hier gibt es ein Plugin, das auf unterschiedlichen Antworten basiert: https://github.com/gangleri/vim-diffsaved
Es bietet die
:w !diff % -
Methode und die involvierterediffthis
.Abgesehen davon erlaubt undotree dies auch, aber auch viel mehr (unterscheidet sich zwischen verschiedenen Rückgängig-Checkpoints). Ähnlich wie bei Gundo .
quelle
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?
quelle
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:
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.
quelle
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.quelle
Sie können vim dazu bringen, ein letztes Backup und ein Original-Backup zu erstellen mit:
Danach können Sie sie in einem Split öffnen:
Und von dort aus:
Wenn Sie keine Reste mehr haben, aber Vimdiff wollen, können Sie auch Folgendes tun:
und dann: differfthis bei jedem Split
quelle
Ä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:
Beispiel von vimdiff vs Gdiff.
Darüber hinaus zu einfachen
vimdiff
Homonym-Datei in anderen Pfad:quelle
Gdiff
wenn möglich und ansonsten (zB kein Git-Projekt) dann a ausführen:vimdiff
. Mittry-catch-endtry
. Aber so:DiffWithSaved
fehlt es in einem Git-Projekt.Befolgen Sie die obigen Vorschläge, dass ich Git Diff verwende, das mir sehr gefällt:
quelle