Wie verwende ich vim als Diff-Tool?

101

Ich benutze vim als meinen primären Editor.

Ich würde auch gerne vim verwenden, um Dateien zu diffieren und zu modifizieren, während ich den Diff mache, um einfache Änderungen zu korrigieren (anstelle der meisten Diff-Techniken, die ein Zyklus aus diff / fix / diff / fix sind).

Darüber hinaus gibt es einfache Möglichkeiten, vim in Diff-Tools zu integrieren, die von Tools / Sites für die Quellcodeverwaltung verwendet werden (ich denke speziell an git, aber ich bin sicher, dass andere Leute an der Integration mit anderen Tools / Sites für die Quellcodeverwaltung interessiert sind).

Martin York
quelle
1
Sie sollten es mit vim-fugitive versuchen, da es die Befehle hinzufügt, :Gdiffund mit :Gvdiffbeiden Befehlen können Sie den Nebeneinanderunterschied des aktuellen Puffers sehen, wenn Ihr aktueller Puffer von git verwaltet wird. Es hilft Ihnen auch, Konflikte in einem Layout mit drei Fenstern zu lösen, wenn Sie Konflikte in einigen Dateien zusammenführen
am
Ich habe diese einfache Funktion in meinem bashrc vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }und rufe sie mit auf vd file1 file2. Es wird verwendet, diffum festzustellen, ob sich die Dateien unterscheiden, und wird nur dann geöffnet, vimdiffwenn dies der Fall ist. Ansonsten bleibe ich in der Shell. Ich deaktiviere auch die Syntaxhervorhebung in Vim, da ich sie beim Vergleichen als störend empfinde. Funktioniert nur mit zwei Dateien.
Rolf

Antworten:

122

In vim ist diese Funktionalität integriert (mit dem richtigen Befehlszeilen-Flag).

vim -d <file1> <file2>

Dadurch wird jede Datei in einer Ansicht geöffnet und die Unterschiede werden hervorgehoben.
Jeder identische Code ist foldednicht mehr vorhanden, sodass Sie nicht den identischen Code anzeigen oder durch große Teile des identischen Codes scrollen müssen.

Es gibt aber auch eine Wrapper-Anwendung vimdiff, die vim korrekt mit den richtigen Flags aufruft.

vimdiff source1.cpp source2.cpp

Wenn Sie Git verwenden, können Sie ein externes Diff-Tool einrichten. So ist es einfach, vimdiff als Diff-Tool für Git einzurichten.

git config --global diff.tool vimdiff

Bei Verwendung von vimdiff können Sie beide Seiten bearbeiten und die Diff-Hervorhebung hält Schritt, um die Unterschiede anzuzeigen.

Hinweis: Beim Bearbeiten von einem Git Diff. Wenn Sie versuchen, die im Repository gespeicherte Version der Datei zu bearbeiten, werden Ihre Änderungen beim Beenden verworfen (git vertraut Ihnen nicht mit dem Original, sodass Sie sich von einer tmp-Kopie unterscheiden), aber Sie können die lokale Kopie nach Herzenslust und nach Belieben bearbeiten Speichern Sie es über Ihre aktuelle Version.

Einige grundlegende Befehle, die in nützlich sind vimdiff

dp             diffput: puts changes under the cursor into the other file
                        making them identical (thus removing the diff).
do             diffget: (o => obtain). The change under the cursor is replaced
                        by the content of the other file making them identical.


]c             Jump to the next diff
[c             Jump to the previous diff

Andere vim-Einstellungen, die ich verwende, um mit vimdiff mit Highliting zu arbeiten

if &diff
    highlight! link DiffText MatchParen
endif

Dadurch wird die Hervorhebung der geänderten Codebits deaktiviert. Daher wird die geänderte Zeile hervorgehoben, damit ich die Änderungen erkennen kann. Der tatsächlich geänderte Text wird jedoch in der Zeile hervorgehoben (da er nicht hervorgehoben ist).

Martin York
quelle
Auch Griffe bis zu 4 Puffern, wodurch es ideal für den Vergleich von Konfigurationsdateien zu machen
Izkata
34
Sie können den :diffthisBefehl auch verwenden , um ein Diff zu starten, wenn Vim bereits ausgeführt wird.
Rich
11
Und: diffoff, um es auszuschalten. Ich denke, ein Link zur Dokumentation von vim wäre von Vorteil: vimdoc.sourceforge.net/htmldoc/diff.html
Cody Poll
1
Für mich selbst nach git config --global diff.tool vimdiff, git diffzeigt immer noch alles wie wenn ich nichts ändern.
Hi-Angel
2
versuchengit difftool
Martin York
13

Wenn Sie eine geöffnete Datei bearbeiten und mit einer anderen Datei vergleichen möchten, ohne die aktuelle zu schließen:

Öffnen Sie die neue Datei im geteilten Bildschirm:

Bei vertikaler Teilung:

:vs otherFile

oder horizontale Teilung:

:split otherFile

Cursor auf anderen geteilten Bildschirm umschalten:

ctrl+w ctrl+w

Rufe "diff mode" in der Datei auf:

:diffthis

Wechseln Sie zu einer anderen Datei und rufen Sie den "Diff-Modus" auf:

:diffthis

So deaktivieren Sie den Diff-Modus:

:diffoff
Bruder-Bilo
quelle
5
Um ein Umschalten zwischen den Puffern zu vermeiden, können Sie :windo diffthisauch
Folgendes
4

Sie können die unten angegebene Einstellung in die .gitconfigDatei im %homepath%(oder %userprofile%) Verzeichnis des aktuell angemeldeten Benutzers einfügen:

[diff]
    tool = vimdiff

Dadurch kann das Git-Bash-Tool Vimdiff auch als externes Diff-Tool verwenden.

RBT
quelle
2

Ich kann nur drei Situationen erkennen, in denen vim als Diffe-Tool verwendet wird. Sie werden im Folgenden kurz beschrieben:

  • Geben Sie für git difftool Folgendes ein ~/.gitconfig:

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • Um vim als Diff-Tool für zwei Dateien zu öffnen, können Sie Folgendes tun:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • Um eine Diff-Ansicht für die derzeit aktiven Puffer zu erhalten, dh für alle Puffer, denen auf der derzeit aktiven Registerkarte ein Fenster zugewiesen ist, haben Sie folgende Möglichkeiten:

    :windo diffthis                " to get diff view
    :windo diffoff                 " to remove diff view
    

Weitere Informationen finden Sie unter :h diff

klaus
quelle
1

Folgendes mache ich:

  • öffne ein Fenster mit der ersten Datei (oder dem Textinhalt, wenn du Daten einfügst)
  • Öffnen Sie die nächste Datei / das nächste Fenster mit :vnew(um beide Fenster nebeneinander anzuzeigen) oder :new(um die Fenster oben und unten anzuzeigen). Wenn Sie eine bestimmte Datei im zweiten Fenster öffnen möchten, können Sie den folgenden Pfad angeben::vnew /path/to/secondfile.txt
  • Mit F8 schalten Sie eine benutzerdefinierte Funktion um, die den Diff-Modus ein- und ausschaltet

Hier ist die benutzerdefinierte Funktion, die in meinem ist ~/.vimrc:

nmap <silent> <F8> :call ToggleDiff()<CR>
imap <silent> <F8> <C-O>:call ToggleDiff()<CR>
function ToggleDiff ()
    if (&diff)
        set nodiff noscrollbind
    else
        " enable diff options in both windows; balance the sizes, too
        wincmd =
        set diff scrollbind nowrap number
        wincmd w
        set diff scrollbind nowrap number
        wincmd w
    endif
endfunction
Kaan
quelle
Sie können den Befehl verwenden :diffthisund diffoff!müssen nicht alle Diff-Optionen selbst festlegen (z. B. wird Cursorbind auch von DiffMode festgelegt)
Christian Brabandt