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
:git diff
の結果をバッファに出力GinLog
:git log
の結果をバッファに出力GinPatch
: バッファのdiffを対話的にstage/unstageするUIを提供GinBrowse
: GitHubなどのホスティングサイトで管理されているバッファをブラウザで表示
どれもよく使いますが、イチ推しは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
はカラフルにできるしあちこちジャンプできて体験がいいぞ。