3 Punkte von GN⁺ 2024-11-09 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2024-11-09
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/blame mehr 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 ripgrep verwenden 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 cat als Alias auf bat gelegt und das „reine cat“, also /usr/bin/cat, separat als vcat aliasiert.
    https://github.com/sharkdp/bat

    • Um die Alias-Erweiterung zu verhindern, kann man \cat verwenden.
  • 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...

    • In KDevelop wurde das nicht Syntax-Highlighting, sondern semantisches Highlighting genannt.
      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...
    • Der Autor dieses Artikels hat auch difftastic gebaut, ein „strukturelles Diff, das Syntax versteht“ und treesitter verwendet.
      https://difftastic.wilfred.me.uk/
      https://github.com/Wilfred/difftastic
    • Stimme völlig zu. Am Anfang sah es ungewohnt aus, aber nachdem ich mich daran gewöhnt hatte, bevorzuge ich diese Art von Highlighting.
      Persönlich nutze ich in Emacs color-identifiers-mode.
      https://github.com/ankurdave/color-identifiers-mode
    • Variablennamen kann man ebenfalls ziemlich gut unterscheiden. Besonders wenn die Syntax selbst hervorgehoben ist, weiß man genau, wohin man schauen muss und wohin nicht.
      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-git ein halbwegs ordentliches wortweises Diff braucht, reicht oft schon Folgendes:
    git diff --color-words --word-diff-regex='\w+|.'

    • Wie schaltet man das in .gitconfig standardmäß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 0 setzt, 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.

    • Warum es nicht der Standard ist, steht genau in diesem PR:
      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.c
    In iTerm öffne ich Dateien oft per cmd-Klick im Editor, aber hier funktioniert das wegen der Präfixe a/ und b/ 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 true
      Weitere 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 ]]; then
    DELTA_FEATURES='side-by-side'
    else
    DELTA_FEATURES=''
    fi
    }
    trap delta_sidebyside WINCH

    • Vor COLUMNS fehlt ein $, und wahrscheinlich braucht man vor dem Setzen von DELTA_FEATURES auch ein export.
  • 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.

    • Difftastic und Delta funktionieren nicht nur im reinen Terminal.
      Beide werden in Emacs Magit unterstützt, ebenso in Lazygit.
    • Ich nutze difftastic seit einer Weile und frage mich, wie man beide zusammen verwendet.
  • tig ist ebenfalls einen Blick wert: https://jonas.github.io/tig/

  • Ich würde das gern mögen, weil ich bisher normales git diff mit Farben genutzt habe, aber es wirkt zu kompliziert.

    • diffr könnte dir gefallen: https://github.com/mookid/diffr
      Zur Einordnung: Das ist mein Projekt.
    • Hatte denselben Eindruck. Ich habe das unveränderte git diff nie wirklich als Problem empfunden.