gin.vimでgitの差分を快適に閲覧する

by
カテゴリ:

2023/11/29のVim駅伝記事です。
前回はyasunori0418さんによる「vimを切っ掛けにエンジニアになった話」でした。

gin.vimというVim上でGitを便利に扱うプラグインがあります。
水銀などのギンではなく、お酒のジンです。

ExコマンドのGinを通じて、gitコマンドを実行するのが素朴な使い方です(例:Gin commit)。
Ginの代わりにGinBufferを使うと、コマンドの実行結果をバッファに出力できます(例:GinBuffer log -n 1)。

この2つがあれば、:!git ...としていた操作を一通り賄えますが、gin.vimは他にも便利なExコマンドがたくさん用意しています。
以下は一部の例です。

どれもよく使いますが、イチ推しはGinDiffです。

シンタックスハイライトや単語の差分が見える

カスタマイズすると、以下のようにカラフルな差分を閲覧できます。

gin.vimの多くのExコマンドは++processor引数を通じて実行結果を後処理した結果を取得できます。
そこで、deltaという差分の見た目を調整してくれるプログラムを使うと、シンタックスハイライトや、単語単位の差分を可視化できるというわけです。

おすすめな実行方法は以下。

GinDiff ++processor=delta\ --no-gitconfig\ --color-only

単に++processor=deltaとしてもカラフルですが、unified diffというパース可能な差分フォーマットではなくなります。
後述の差分の指定箇所を元ファイルのバッファで開けるを実現するためには、--color-onlyオプションでunified diffフォーマットを維持するべきです。
また、deltaコマンドは設定をgitconfigファイルに記載可能ですが、同様の理由で邪魔な設定になりうるので、--no-gitconfigオプションでをつけておくといいです。

なお、Neovimユーザーであれば、tree-sitter-unifieddiffも適用すると、もっとカラフルにできます。

先の画像の1行目や2行目がハイライトされたのはまさにtree-sitter-unifieddiffの力です。
それから、gin.vimの限界なのかもしれませんが、差分発生箇所の背景色の付き方が不完全なケースがあります。
そこはtree-sitter-unifieddiffによるパース結果をtsnode-marker.nvimというプラグインを使って補正しています。

差分の指定箇所を元ファイルのバッファで開ける

差分(画像なら背景色が緑や赤になっている場所)で<CR>してみましょう。
addedな箇所で<CR>すると、差分が発生しているファイルの該当個所に飛びます。
deletedな箇所で<CR>すると、差分発生前のファイルの該当箇所に飛びます。

たとえば、以下の画像の"+ https://github.com/tpope/vim-repeat",となっている場所で<CR>すると、dot_config/nvim/lua/plugins.luaの15行目に飛ぶわけですね。

実体としては<Plug>(gin-diffjump-smart)というマッピングを利用しています。
従ってお好みのマッピングへの変更も可能です。

まだ模索中ですが、<Plug>(gin-diffjump-smart)をうまく使うと、diff上から定義ジャンプなんてことも可能です。とてもレビューが捗りそうですね。

-- Neovimの場合
vim.keymap.set(
  "n",
  "gd",
  "<Plug>(gin-diffjump-smart)<Cmd>lua vim.lsp.buf.definition()<CR>",
  { buffer = true, silent = true }
)

まとめ

gin.vimはいいぞ。
GinDiffはカラフルにできるしあちこちジャンプできて体験がいいぞ。