📘

ovを使用してgit diffの表示を改善する

2023/10/03に公開

ovはターミナルページャーです。
UTF-8のみをサポートしています。

ov v0.32.0で追加した--section-headerオプションを使用してgit diffの操作を改善する方法を紹介します。

gitconfig設定

まずovを使用するgitconfigの推奨設定です。

[pager]
  diff = "ov -F --section-delimiter '^diff' --section-header --regexp-search --pattern '^@'"

以下では、この設定を使用して説明します。

ファイル間の移動

ovを使用するとgit diffでのファイル間の移動が簡単になります。

通常ページャーは中身に関係なく、行、ページ(端末の高さ)、またはページの半分移動ができますが、diffの出力では、ページや半ページの移動では、中途半端な位置に移動してしまい、行移動で調整するといったことが発生します。

ovでは中身に応じてセクションという単位を導入し、セクション単位で移動できるようになっています。

git diffでdiffを出力すると以下のようにdiffで始まる行にファイル名が表示されます。
この行を--section-delimiterの正規表現パターンに指定することで、ovはdiffの開始行をセクションの開始行として認識します。

diff --git a/src/common/Makefile b/src/common/Makefile
index 37b0070f1c..ec4eb49382 100644
--- a/src/common/base64.c
+++ b/src/common/base64.c
@@ -3,7 +3,7 @@

ovではデフォルトでSpaceキーを押すと次のセクションに移動します。
また、^キーを押すと前のセクションに移動します。

section

ファイル名の固定表示

ovでは--section-headerオプションを指定すると、セクションの開始行をヘッダーとして固定表示します。
検索等で大きく移動したときにはファイル名が表示されていると便利です。

これは現在表示している一番上の行より上のセクション開始行を探し、その行をヘッダーとして表示するというものです。
そのため、下にスクロールしたときにも常に表示されるようになります。
そして、次のセクションに到達したときに、そのセクションの開始行をヘッダーとして表示します。

section

差異のブロック移動

diffの出力では、差異がある行を@@ 行番号 @@という行で囲んでいます。
次の差異ブロックに移動するためには、検索を使用しますが--pattern '^@'をオプションで指定しておくとn/Nキーで移動できるようになります。

pattern

これにより、Spaceキーで次のセクションに移動し、nキーで次の差異ブロックに移動するという操作が可能になります。

sectionとpattern

deltaの使用

git diffの表示にdeltaを使用している方もいると思います。
deltaはgitのPagerとして指定しますが、厳密にはページャーではありません。deltaはgitのdiffを受け取り、その出力を変換してPagerを呼び出して表示しています。deltaが呼び出すPagerはデフォルトでlessになっていますが、変更することもできます。

deltaの設定はgitconfigに記述します。基本的にdeltaのページに記載されている設定をお好みで使用すれば良いのですが、navigate = trueは入れるようにします。

[core]
    pager = delta

[delta]
    navigate = true
    side-by-side = true
    file-style = yellow

navigate = true はPagerを起動したときの移動をしやすくするために表示にマークを追加して、lessを起動したときに、n\Nキー移動できるようにオプションを追加して起動します。

ovでは、その表示マークを使用してセクションと差異ブロックをを指定します。deltaのページャーを設定するには、環境変数DELTA_PAGERにPagerのコマンドを指定します。以下が推奨設定です。

 export DELTA_PAGER="ov --section-delimiter '^(commit|added:|removed:|renamed:|Δ)' --section-header --pattern '•'"

--section-delimiter'^(commit|added:|removed:|renamed:|Δ)'を設定することで、ファイル間の移動がSpace^で同様にできるようになります。また、ファイル名の固定表示も可能です。
--pattern'•'を指定することで、n/Nキーで差異ブロックの移動ができるようになります。

delta

Discussion