git と mercurial の diff を美しく表示するために必要なたった 1つの設定 (原題: diff-highlight 1.0.0 をリリースしました)

Git の diff を美しく表示するために必要なたった 1 つの設定 #git にインスパイアされて作り始めた
diff-highlight にあれこれ手を入れ、1.0.0 として正式リリースしました。

diff-highlight と git-contrib/diff-highlight の違い

差分の中で +/- の行数が一致していないときのハイライトの扱い

git-contrib/diff-highlight での表示
f:id:tk0miya:20131218221141p:plain
+/- の行が一致していないとハイライトされません。

diff-highlight では、マッチする行を認識してハイライトします。
f:id:tk0miya:20131218223714p:plain

+/- の行数が一致しても、文字単位でのハイライトをしてくれないケースがある

git-contrib/diff-highlight での表示
f:id:tk0miya:20131218221849p:plain
差分の 1行目同士を比較しているため、pager の行がハイライトされていません。

diff-highlight では、マッチする行を認識するよう改良されています。
f:id:tk0miya:20131218223716p:plain

一行で 2箇所書き換えた場合は、ハイライト幅がとても大きくなる

git-contrib/diff-highlight での表示
f:id:tk0miya:20131218222313p:plain
変更箇所は 2箇所(クオートのみ)ですが、それをまたがるように長くハイライトされてしまいます。

diff-highlight では、変更箇所とその周辺だけをハイライトするよう改良しました。
f:id:tk0miya:20131218223718p:plain

インストール方法

pip コマンドでインストールします。

$ sudo pip install diff-highlight

pip コマンドが見つからない場合は yum や apt で python-pip パッケージをインストールしてください*1

git で使う場合

$HOME/.gitconfig に pager の設定を追加するだけです。

[pager]
    log = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

色を付ける場合は color.ui を設定しておくと幸せになれるでしょう :-)

[color]
    ui = true

mercurial で使う場合

$HOME/.hgrc に color, diff_highlight 拡張を追加してください。

[extensions]
color =
diff_highlight =

その他の場合

diff-highlight をフィルタとして利用すると diff コマンドの出力をハイライトさせることができます。
ただし、対応しているのは unified diff 形式だけなので、diff には -u オプションを付けてください。

$ diff -u file1 file2 | diff-highlight

もし less や lv を使う場合はエスケープシーケンスを表示するオプションを付ける必要があります。

$ diff -u file1 file2 | diff-highlight | less -r
$ diff -u file1 file2 | diff-highlight | lv -c

まとめ

ついカッとなって diff-highlight を python で実装しなおしてしまいました。
これで git や mercurial で幸せな diff ハイライト生活を送ることができると思います。

もしきれいに表示されないところなどがあれば、@tk0miya までお知らせください。

*1:CentOS 5.x の場合は setuptools パッケージを入れ、easy_install コマンドを使ってください