- Deltaは、Git、diff、grep 出力にシンタックスハイライトとページャー機能を追加し、diff をより効率的かつ見やすく読めるようにするツール
- ほとんどのパッケージマネージャーではパッケージ名は git-delta だが、実行ファイルは
delta で、~/.gitconfig に core.pager = delta と設定して Git の pager として使える
- 主な機能は、bat と同じシンタックスハイライトテーマ、Levenshtein 編集推定に基づく単語単位の diff 強調、左右比較表示、行番号、
n/N ナビゲーション、マージコンフリクト表示の改善
git blame、rg、git grep、grep の出力もシンタックスハイライトし、--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 間を n と N キーで移動できる
- 従来の 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
[delta]
line-numbers = true
Git の作業ごとの対応
- マージコンフリクト表示は改善された形式で提供され、関連文書は Merge conflicts user manual にある
- git blame 出力はシンタックスハイライトをサポートし、
--hyperlinks 使用時にはコミットをホスティングプロバイダーへのリンク形式にできる
rg、git grep、grep などの grep 出力もシンタックスハイライトする
- Git の
--color-moved 機能をサポートする
スタイリングと互換モード
- diff からコードをそのままコピーでき、
-/+ マーカーはデフォルトで削除される
diff-highlight と diff-so-fancy のエミュレーションモードを提供する
- コミットハッシュはターミナル hyperlinks 形式でホスティングプロバイダーのページにリンクできる
- ファイルパスも OS で開けるハイパーリンク形式にできる
- コミット、ファイル、hunk ヘッダーセクションに注目を集める ボックス/ライン装飾 をスタイリングできる
- 20 を超えるスタイル指定要素について、前景色、背景色、フォント属性を含むスタイル文字列をサポートする
- スタイル言語には Git と同じ色/スタイル言語を使う
1件のコメント
Hacker News のコメント
Delta は一度設定したらそのまま忘れて使えるツールで、しばらく「素の」
git grep/diff/blame出力を見ていません。Git リポジトリ外の通常の diff にもいつも使っていますが、今日
ripgrepと一緒にも使えることを知りました。https://dandavison.github.io/delta/grep.html
すでに言及されている bat も同じく、一度設定して忘れて使えるツールなので、
catをbatにエイリアスし、「素の cat」である/usr/bin/catは別途vcatというエイリアスにしています。https://github.com/sharkdp/bat
\catを使えばよいです。以前見た良い指摘がずっと頭に残っているのですが、現在の シンタックスハイライト は間違った対象を強調している、というものです。
構文は人間が十分見分けられるので、構文に色を付けるのではなく シンボル を強調すべきです。異なる変数名や関数名ごとに別の色を付ければ、「これはシンボルだ」と示すのではなく、「異なるシンボルをより速く区別する」という目的に合います。
ただし構文を装飾するよりはるかに難しいため、ツールは有用な方向より簡単な方向にとどまっているように見えます。構文ハイライトもかなり役には立ちますが、シンボルマッチングエンジンが実際にうまく機能するのか見てみたいです。
元の文章をどこで読んだのか覚えていないため、きちんと出典を付けることはできません。
探しているうちにこの記事を見つけました: https://www.wilfred.me.uk/blog/2014/09/27/the-definitive-gui...
これよりもっと早くからあったように思いますが、見つけられる最も古い解説記事は 2009 年の記事です: https://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from...
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 にあります。
非常に長い行、たとえば minify された
.jsファイルをシンタックスハイライトすると、切り捨てない場合に非常に遅くなる可能性があるためです。diff の話が出たついでに言うと、Git の diff 出力でいら立つ点は、ファイルパスを伝統的な Unix diff のように 2 つのファイル名で始めて出力することです。
--- a/some/path/to/file.c+++ b/some/path/to/file.ciTerm で
cmd-クリックしてファイルをエディタで開くことが多いのですが、ここではa/とb/の接頭辞のせいで動きません。Git にファイル名をもっと良くフォーマットさせる方法はあるでしょうか? 2 行が必ず必要なわけでもありません。git config --global diff.noprefix true接頭辞関連の他のオプションはマニュアルを見ればよいです。
delta と difftastic を組み合わせて使っていますが、どちらも素晴らしいです。
特に difftastic は tree-sitter AST 構文に強く、少し遅いとはいえ、AST を理解する diff は本当に良いです。
Delta はすっきりしていて非常に高速です。
ウィンドウサイズに応じて Delta の side-by-side 機能をオン・オフする便利な Tips です。ここでは bash 前提で、他のシェルでは自分で応用すればよいです。
function delta_sidebyside {if [[ COLUMNS -ge 120 ]]; thenDELTA_FEATURES='side-by-side'elseDELTA_FEATURES=''fi}trap delta_sidebyside WINCHCOLUMNSの前に$が抜けていて、DELTA_FEATURESの設定前にexportも必要な可能性が高いです。delta と difftastic の両方を使っていて、いくら勧めても足りないくらいです。
ターミナルを少しでも使うならインストールしたほうがよいです。
どちらも Emacs の Magit でサポートされており、Lazygit でもサポートされています。
tig も確認してみる価値があります: https://jonas.github.io/tig/
色付きの通常の
git diffを使ってきたので、これを好きになりたい気持ちはあるのですが、あまりに 複雑に見えます。ちなみに私のプロジェクトです。
git diffが特に問題だと感じたことはありませんでした。