- Delta ist ein Tool, das Git-, diff- und grep-Ausgaben um Syntaxhervorhebung und Pager-Funktionen erweitert und so hilft, Diffs effizienter und angenehmer zu lesen.
- In den meisten Paketmanagern heißt das Paket git-delta, die ausführbare Datei jedoch
delta; über core.pager = delta in ~/.gitconfig lässt es sich als Git-Pager verwenden.
- Zu den wichtigsten Funktionen gehören dieselben Syntax-Highlighting-Themes wie bei bat, wortweise Diff-Hervorhebung auf Basis von Levenshtein-Edit-Inferenz, Side-by-side-Ansicht, Zeilennummern, Navigation mit
n/N sowie eine verbesserte Darstellung von Merge-Konflikten.
- Auch Ausgaben von
git blame, rg, git grep und grep werden mit Syntaxhervorhebung versehen; mit --hyperlinks lassen sich Commit-Hashes als Links im Format von Hosting-Anbietern wie GitHub, GitLab, SourceHut und Codeberg erzeugen.
- Die Ausgabe kann nahe an der standardmäßigen Git-/diff-Ausgabe bleiben oder in Layout und Stil stark angepasst werden, sodass sich die Diff-Review-Umgebung im Terminal detailliert konfigurieren lässt.
Was Delta macht
- Delta ist ein syntaxhervorhebender Pager für Git-, diff- und grep-Ausgaben.
- Ziel ist es, das Lesen von Diffs in Umgebungen mit ständig wechselndem Code effizienter und angenehmer zu machen.
- Layout und Stil von Diffs lassen sich umfassend verändern; auf Wunsch kann die Ausgabe aber auch sehr nah an der Standardausgabe von Git/diff bleiben.
Installation und Grundeinrichtung
- Die Installationsdokumentation steht unter Install it bereit.
- In den meisten Paketmanagern heißt das Paket git-delta, die ausführbare Datei heißt
delta.
- Durch Hinzufügen der folgenden Einstellungen zu
~/.gitconfig kann Delta als Git-Pager und als interaktiver Diff-Filter verwendet werden.
[core]
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
navigate = true # use n and N to move between diff sections
dark = true # or light = true, or omit for auto-detection
[merge]
conflictStyle = zdiff3
- Dieselben Einstellungen lassen sich auch mit dem Befehl
git config --global setzen.
git config --global core.pager delta
git config --global interactive.diffFilter 'delta --color-only'
git config --global delta.navigate true
git config --global delta.dark true # or `delta.light true`, or omit for auto-detection
git config --global merge.conflictStyle zdiff3
- Die Hilfe ist mit
delta -h verfügbar, das vollständige Handbuch mit delta --help, und die Online-Dokumentation im user manual.
Funktionen zum Lesen von Diffs
- Die Syntaxhervorhebung nutzt dieselben Themes wie bat.
- Die wortweise Diff-Hervorhebung verwendet einen Levenshtein-Edit-Inferenz-Algorithmus.
- Side-by-side-Ansicht und Zeilenumbruch werden unterstützt.
- Die Anzeige von Zeilennummern wird unterstützt.
- Zwischen Dateien in großen Diffs sowie zwischen Diffs in der Ansicht
log -p kann man mit den Tasten n und N navigieren.
- Diese Funktion wird mit
--navigate aktiviert.
- Auch die traditionelle unified-diff-Ausgabe wird zusammen mit Git-Ausgaben verarbeitet.
- Helle/dunkle Terminal-Hintergründe können automatisch erkannt werden.
Darstellungsweisen und Themes
- Für Syntax-Highlighting-Themes können in Delta alle von bat bereitgestellten Themes verwendet werden.
delta --show-syntax-themes --dark
delta --show-syntax-themes --light
- Die Side-by-side-Ansicht ist im Side-by-side view user manual dokumentiert.
[delta]
side-by-side = true
- In der Side-by-side-Ansicht sind Zeilennummern standardmäßig aktiviert, und Syntaxhervorhebung wird sowohl im linken als auch im rechten Panel angewendet.
- Die Side-by-side-Ansicht bricht lange Zeilen automatisch um.
- Die Zeilennummern-Funktion ist im Line numbers user manual dokumentiert.
[delta]
line-numbers = true
Unterstützung nach Git-Arbeitsschritt
- Merge-Konflikte werden in einem verbesserten Format angezeigt; die zugehörige Dokumentation findet sich im Merge conflicts user manual.
- Ausgaben von git blame unterstützen Syntaxhervorhebung; bei Verwendung von
--hyperlinks können Commits als Links zu Hosting-Anbietern formatiert werden.
- Unterstützte Hosting-Anbieter: GitHub, GitLab, SourceHut, Codeberg
- Zugehörige Dokumentation: Git blame user manual
- Auch grep-Ausgaben von
rg, git grep, grep und ähnlichen Tools werden mit Syntaxhervorhebung versehen.
- Git-Funktion
--color-moved wird unterstützt.
Styling und Kompatibilitätsmodi
- Code lässt sich direkt aus Diffs kopieren; die Marker
-/+ werden standardmäßig entfernt.
- Es gibt Emulationsmodi für
diff-highlight und diff-so-fancy.
- Commit-Hashes können im Format von Terminal-Hyperlinks mit Seiten von Hosting-Anbietern verknüpft werden.
- Auch Dateipfade können als Hyperlinks formatiert werden, die sich im Betriebssystem öffnen lassen.
- Box-/Linien-Dekorationen, die Commit-, Datei- und Hunk-Header-Abschnitte hervorheben, lassen sich stylen.
- Für mehr als 20 stylebare Elemente werden Style-Strings mit Vordergrundfarbe, Hintergrundfarbe und Schriftattributen unterstützt.
- Die Style-Sprache verwendet dieselbe Farb-/Style-Sprache wie Git.
1 Kommentare
Meinungen auf Hacker News
Delta war für mich ein Tool, das man einmal einrichtet und dann vergisst; seit einer Weile habe ich keine „rohe“ Ausgabe von
git grep/diff/blamemehr gesehen.Ich nutze es auch ständig für normale Diffs außerhalb von Git-Repositories, und heute habe ich erfahren, dass man es auch zusammen mit
ripgrepverwenden kann.https://dandavison.github.io/delta/grep.html
Das bereits erwähnte bat ist ebenfalls so ein Tool, das man einmal einrichtet und dann vergisst: Ich habe
catals Alias aufbatgelegt und das „reine cat“, also/usr/bin/cat, separat alsvcataliasiert.https://github.com/sharkdp/bat
\catverwenden.Ein guter Punkt, den ich früher einmal gelesen habe, ist mir im Gedächtnis geblieben: Das heutige Syntax-Highlighting hebt die falschen Dinge hervor.
Syntax können Menschen gut unterscheiden, daher sollte man nicht die Syntax einfärben, sondern Symbole hervorheben. Wenn unterschiedliche Variablen- und Funktionsnamen jeweils unterschiedliche Farben bekommen, passt das besser zum Ziel: nicht „das ist ein Symbol“, sondern „unterschiedliche Symbole schneller unterscheiden“.
Allerdings ist das deutlich schwieriger, als Syntax zu dekorieren, weshalb Tools anscheinend eher beim Einfachen als beim Nützlichen bleiben. Syntax-Highlighting hilft zwar durchaus, aber ich würde gern sehen, ob eine Symbol-Matching-Engine in der Praxis wirklich gut funktioniert.
Ich weiß nicht mehr, wo ich den Originaltext gelesen habe, daher kann ich ihn nicht sauber belegen.
Beim Suchen bin ich auf diesen Artikel gestoßen: https://www.wilfred.me.uk/blog/2014/09/27/the-definitive-gui...
Es scheint das schon früher gegeben zu haben, aber die früheste Beschreibung, die ich finden kann, ist ein Artikel von 2009: https://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from...
https://difftastic.wilfred.me.uk/
https://github.com/Wilfred/difftastic
Persönlich nutze ich in Emacs color-identifiers-mode.
https://github.com/ankurdave/color-identifiers-mode
Von dieser Logik bin ich nicht ganz überzeugt, aber ein wenig neugierig bin ich schon.
Manchmal markiere ich Variablen von Hand, um sie nachzuverfolgen und sicherzustellen, dass ich keine Verwendungen übersehen habe; diesen Anwendungsfall verstehe ich gut. Ich weiß nur nicht, ob Farben und Kontrast ausreichen, um mehrere Variablen gleichzeitig zu verfolgen, und der Bildschirm könnte dadurch unübersichtlich werden.
Als Kompromiss könnte man vielleicht manuell höchstens etwa drei Variablen einfärben. Allerdings kann es auch ein Zeichen dafür sein, dass der Code von vornherein schlecht lesbar ist, wenn man solche Hilfe braucht. Natürlich ist es ein legitimer Zweck, beim Umgang mit einer unordentlichen Codebasis zu helfen.
Es ist nicht spektakulär, aber wenn man nur mit Standard-
gitein halbwegs ordentliches wortweises Diff braucht, reicht oft schon Folgendes:git diff --color-words --word-diff-regex='\w+|.'.gitconfigstandardmäßig ein?Delta macht seine Aufgabe sehr gut, aber ich bin immer wieder über das Problem gestolpert, dass lange Zeilen abgeschnitten werden.
Nachdem ich diesen Artikel gesehen hatte, habe ich geprüft, ob sich daran etwas geändert hat, und tatsächlich: Es hat sich geändert. Wenn man jetzt
git config --global --replace-all delta.max-line-length 0setzt, werden Zeilen nicht mehr abgeschnitten.Warum das nicht der Standard ist, ist mir nicht ganz klar. Die Diskussion zur Änderung steht unter https://github.com/dandavison/delta/pull/290.
Sehr lange Zeilen, zum Beispiel minimierte
.js-Dateien, können beim Syntax-Highlighting sehr langsam werden, wenn sie nicht abgeschnitten werden.Wenn wir schon über Diffs sprechen: Was mich an der Diff-Ausgabe von Git nervt, ist, dass Dateipfade wie beim traditionellen Unix-diff mit zwei Dateinamen am Anfang ausgegeben werden.
--- a/some/path/to/file.c+++ b/some/path/to/file.cIn iTerm öffne ich Dateien oft per
cmd-Klick im Editor, aber hier funktioniert das wegen der Präfixea/undb/nicht. Gibt es eine Möglichkeit, Git Dateinamen besser formatieren zu lassen? Zwei Zeilen sind auch nicht unbedingt nötig.git config --global diff.noprefix trueWeitere Optionen zu Präfixen stehen im Handbuch.
Ich nutze delta und difftastic gemischt, und beide sind großartig.
Difftastic ist besonders stark bei tree-sitter-AST-Syntax und daher zwar etwas langsam, aber ein Diff, das den AST kennt, ist wirklich gut.
Delta ist sauber und sehr schnell.
Ein nützlicher Tipp, um Deltas side-by-side-Funktion je nach Fenstergröße ein- und auszuschalten. Das hier ist für bash; für andere Shells muss man es entsprechend anpassen.
function delta_sidebyside {if [[ COLUMNS -ge 120 ]]; thenDELTA_FEATURES='side-by-side'elseDELTA_FEATURES=''fi}trap delta_sidebyside WINCHCOLUMNSfehlt ein$, und wahrscheinlich braucht man vor dem Setzen vonDELTA_FEATURESauch einexport.Ich nutze sowohl delta als auch difftastic und kann sie gar nicht genug empfehlen.
Wenn man auch nur ein bisschen im Terminal arbeitet, sollte man sie installieren.
Beide werden in Emacs Magit unterstützt, ebenso in Lazygit.
tig ist ebenfalls einen Blick wert: https://jonas.github.io/tig/
Ich würde das gern mögen, weil ich bisher normales
git diffmit Farben genutzt habe, aber es wirkt zu kompliziert.Zur Einordnung: Das ist mein Projekt.
git diffnie wirklich als Problem empfunden.