3 ポイント 投稿者 GN⁺ 2024-11-09 | 1件のコメント | WhatsAppで共有
  • Deltaは、Git、diff、grep 出力にシンタックスハイライトとページャー機能を追加し、diff をより効率的かつ見やすく読めるようにするツール
  • ほとんどのパッケージマネージャーではパッケージ名は git-delta だが、実行ファイルは delta で、~/.gitconfigcore.pager = delta と設定して Git の pager として使える
  • 主な機能は、bat と同じシンタックスハイライトテーマ、Levenshtein 編集推定に基づく単語単位の diff 強調、左右比較表示、行番号、n/N ナビゲーション、マージコンフリクト表示の改善
  • git blamerggit grepgrep の出力もシンタックスハイライトし、--hyperlinks により GitHub、GitLab、SourceHut、Codeberg などのホスティングプロバイダーへのリンク形式のコミットハッシュを作成できる
  • 標準の Git/diff 出力に近いまま使うことも、レイアウトやスタイルを大きく変えることもでき、ターミナル内で diff レビュー環境を細かく調整できる

Delta がすること

  • Deltaは、Git、diff、grep 出力向けのシンタックスハイライト付きページャー
  • コードが継続的に変化する環境で、diff を読む時間をより効率的で快適なものにすることを目指している
  • diff の レイアウトとスタイル を幅広く変更でき、必要なら標準の Git/diff 出力に非常に近い形のまま保つこともできる

インストールと基本設定

  • インストール文書は Install it で提供されている
  • ほとんどのパッケージマネージャーではパッケージ名は git-delta、実行ファイル名は delta
  • ~/.gitconfig に次の設定を追加すると、Git の pager およびインタラクティブ diff フィルターとして使える
[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
  • 同じ設定は git config --global コマンドでも適用できる
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
  • ヘルプは delta -h、完全なマニュアルは delta --help、オンライン文書は user manual で確認できる

diff を読むための機能

  • シンタックスハイライトbat と同じシンタックスハイライトテーマを使う
  • 単語単位の diff 強調には Levenshtein 編集推定アルゴリズム を使う
  • 左右比較表示と折り返しをサポートする
  • 行番号表示をサポートする
  • 大きな diff のファイル間や、log -p 表示内の diff 間を nN キーで移動できる
    • この機能は --navigate で有効化される
  • 従来の unified diff 出力も Git 出力とあわせて処理する
  • 明るい/暗いターミナル背景を自動検出できる

表示方法とテーマ

  • シンタックスハイライトテーマ は bat が提供するすべてのテーマを Delta でも利用できる
    • delta --show-syntax-themes --dark
    • delta --show-syntax-themes --light
  • 左右比較表示は Side-by-side view user manual に文書化されている
[delta]
    side-by-side = true
  • 左右比較表示ではデフォルトで行番号が有効で、左側と右側の両パネルにシンタックスハイライトが適用される
  • 左右比較表示は長い行を自動で折り返す
  • 行番号機能は Line numbers user manual に文書化されている
[delta]
    line-numbers = true

Git の作業ごとの対応

  • マージコンフリクト表示は改善された形式で提供され、関連文書は Merge conflicts user manual にある
  • git blame 出力はシンタックスハイライトをサポートし、--hyperlinks 使用時にはコミットをホスティングプロバイダーへのリンク形式にできる
    • 対応ホスティングプロバイダー: GitHub、GitLab、SourceHut、Codeberg
    • 関連文書: Git blame user manual
  • rggit grepgrep などの grep 出力もシンタックスハイライトする
  • Git の --color-moved 機能をサポートする

スタイリングと互換モード

  • diff からコードをそのままコピーでき、-/+ マーカーはデフォルトで削除される
  • diff-highlightdiff-so-fancy のエミュレーションモードを提供する
  • コミットハッシュはターミナル hyperlinks 形式でホスティングプロバイダーのページにリンクできる
  • ファイルパスも OS で開けるハイパーリンク形式にできる
  • コミット、ファイル、hunk ヘッダーセクションに注目を集める ボックス/ライン装飾 をスタイリングできる
  • 20 を超えるスタイル指定要素について、前景色、背景色、フォント属性を含むスタイル文字列をサポートする
    • スタイル言語には Git と同じ色/スタイル言語を使う

1件のコメント

 
GN⁺ 2024-11-09
Hacker News のコメント
  • Delta は一度設定したらそのまま忘れて使えるツールで、しばらく「素の」git grep/diff/blame 出力を見ていません。
    Git リポジトリ外の通常の diff にもいつも使っていますが、今日 ripgrep と一緒にも使えることを知りました。
    https://dandavison.github.io/delta/grep.html
    すでに言及されている bat も同じく、一度設定して忘れて使えるツールなので、catbat にエイリアスし、「素の cat」である /usr/bin/cat は別途 vcat というエイリアスにしています。
    https://github.com/sharkdp/bat

    • エイリアス展開を防ぐには \cat を使えばよいです。
  • 以前見た良い指摘がずっと頭に残っているのですが、現在の シンタックスハイライト は間違った対象を強調している、というものです。
    構文は人間が十分見分けられるので、構文に色を付けるのではなく シンボル を強調すべきです。異なる変数名や関数名ごとに別の色を付ければ、「これはシンボルだ」と示すのではなく、「異なるシンボルをより速く区別する」という目的に合います。
    ただし構文を装飾するよりはるかに難しいため、ツールは有用な方向より簡単な方向にとどまっているように見えます。構文ハイライトもかなり役には立ちますが、シンボルマッチングエンジンが実際にうまく機能するのか見てみたいです。
    元の文章をどこで読んだのか覚えていないため、きちんと出典を付けることはできません。
    探しているうちにこの記事を見つけました: https://www.wilfred.me.uk/blog/2014/09/27/the-definitive-gui...

    • KDevelop ではこれをシンタックスハイライトではなく セマンティックハイライト と呼んでいました。
      これよりもっと早くからあったように思いますが、見つけられる最も古い解説記事は 2009 年の記事です: https://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from...
    • その記事の著者は、treesitter を使った「構文を理解する構造的 diff」である difftastic も作っています。
      https://difftastic.wilfred.me.uk/
      https://github.com/Wilfred/difftastic
    • 完全に同意します。最初は見慣れない感じがしましたが、慣れてからはこの強調方式のほうを好むようになりました。
      個人的には Emacs で color-identifiers-mode を使っています。
      https://github.com/ankurdave/color-identifiers-mode
    • 変数名もかなりよく区別できます。特に構文自体が強調されていれば、どこを見るべきで、どこは見なくてもよいのかが正確に分かります。
      その論理に完全に納得したわけではありませんが、少し気にはなります。
      ときどき変数を追うために自分で強調して、見落とした使用箇所がないか確認することがありますが、その用途は十分理解できます。ただ、複数の変数を同時に追えるほど色とコントラストが十分なのかは分かりませんし、画面がごちゃつく可能性もあります。
      妥協案としては、手動で最大 3 個程度の変数だけに色を付ける方式が考えられそうです。ただ、そうした助けが必要な場合は、そもそもコードの可読性が低いというサインかもしれません。もちろん、汚いコードベースを扱う助けになるのは正当な用途です。
  • 派手ではありませんが、標準の git だけでも、それなりに使える 単語単位 diff が必要なら、この程度で十分な場合が多いです。
    git diff --color-words --word-diff-regex='\w+|.'

    • これを .gitconfig でデフォルトとして有効にするにはどうすればよいですか?
  • Delta は役割を非常にうまく果たしますが、長い行を切り捨ててしまう問題にずっと引っかかっていました。
    この記事を見て状況が変わったのか確認してみたところ、実際に変わっていました。今は git config --global --replace-all delta.max-line-length 0 を設定すれば、行をもう切り捨てません。
    なぜこれがデフォルトではないのかはよく分かりません。変更の議論は https://github.com/dandavison/delta/pull/290 にあります。

    • なぜデフォルトではないのかは、その PR にそのまま書かれています。
      非常に長い行、たとえば minify された .js ファイルをシンタックスハイライトすると、切り捨てない場合に非常に遅くなる可能性があるためです。
  • diff の話が出たついでに言うと、Git の diff 出力でいら立つ点は、ファイルパスを伝統的な Unix diff のように 2 つのファイル名で始めて出力することです。
    --- a/some/path/to/file.c
    +++ b/some/path/to/file.c
    iTerm で cmd-クリックしてファイルをエディタで開くことが多いのですが、ここでは a/b/ の接頭辞のせいで動きません。Git にファイル名をもっと良くフォーマットさせる方法はあるでしょうか? 2 行が必ず必要なわけでもありません。

    • git config --global diff.noprefix true
      接頭辞関連の他のオプションはマニュアルを見ればよいです。
  • deltadifftastic を組み合わせて使っていますが、どちらも素晴らしいです。
    特に difftastic は tree-sitter AST 構文に強く、少し遅いとはいえ、AST を理解する diff は本当に良いです。
    Delta はすっきりしていて非常に高速です。

  • ウィンドウサイズに応じて Delta の side-by-side 機能をオン・オフする便利な Tips です。ここでは bash 前提で、他のシェルでは自分で応用すればよいです。
    function delta_sidebyside {
    if [[ COLUMNS -ge 120 ]]; then
    DELTA_FEATURES='side-by-side'
    else
    DELTA_FEATURES=''
    fi
    }
    trap delta_sidebyside WINCH

    • COLUMNS の前に $ が抜けていて、DELTA_FEATURES の設定前に export も必要な可能性が高いです。
  • deltadifftastic の両方を使っていて、いくら勧めても足りないくらいです。
    ターミナルを少しでも使うならインストールしたほうがよいです。

    • Difftastic と Delta は純粋なターミナル上でしか動作しないわけではありません。
      どちらも Emacs の Magit でサポートされており、Lazygit でもサポートされています。
    • difftastic をしばらく使っていますが、2 つを一緒に使うにはどう使うのか気になります。
  • tig も確認してみる価値があります: https://jonas.github.io/tig/

  • 色付きの通常の git diff を使ってきたので、これを好きになりたい気持ちはあるのですが、あまりに 複雑に見えます

    • diffr が気に入るかもしれません: https://github.com/mookid/diffr
      ちなみに私のプロジェクトです。
    • 同じ印象を受けました。素の git diff が特に問題だと感じたことはありませんでした。