mini.nvim シリーズ #02 - mini.diff で変更行の可視化とhunk操作

mini.nvim シリーズ #02 - mini.diff で変更行の可視化とhunk操作

作成日:
更新日:

mini.nvimシリーズ第2回は mini.diff です。

このプラグインも素晴らしい。 gitsigns.nvim の代替として、よりシンプルに同じ機能を実現できます。

mini.diff とは

mini.diff は、バッファの差分を可視化し、操作するためのプラグインです。

主な機能:

  • 変更行のサインカラム表示(追加・変更・削除)
  • hunk間のジャンプ
  • hunk単位でのステージ(git add)
  • hunk単位でのリセット
  • diff overlayの表示

私が使っている機能

現在、以下の4つの機能をメインで使っています。

1. 変更行の色付け

ファイルを編集すると、左のサインカラムに変更状況が表示されます。

マーカー 意味
緑の縦線 追加された行
青の縦線 変更された行
赤の三角 削除された行

これだけでも、「どこを編集したか」が一目で分かって便利。

2. 次・前のhunkへ移動

-- 次のhunkへ
vim.keymap.set('n', 'gj', function()
  MiniDiff.goto_hunk('next')
end, { desc = 'Next hunk' })

-- 前のhunkへ
vim.keymap.set('n', 'gk', function()
  MiniDiff.goto_hunk('prev')
end, { desc = 'Prev hunk' })

gj / gk で変更箇所をサクサク移動できます。

大きなファイルで「さっきどこ変えたっけ?」というときに重宝します。

3. hunk単位でgit add / リセット

mini.diffの真骨頂はここ。hunk単位でのステージとリセットです。

-- hunk をステージ(git add)
vim.keymap.set('n', '<Space>ga', 'ghgh', { remap = true, desc = 'Apply (stage) hunk' })

-- hunk をリセット
vim.keymap.set('n', '<Space>gr', 'gHgh', { remap = true, desc = 'Reset hunk' })

ghとは?

mini.diffは gh をテキストオブジェクト(hunk)として提供しています。

  • gh : hunk をテキストオブジェクトとして選択
  • ghgh : 現在のhunkをステージ(apply)
  • gHgh : 現在のhunkをリセット

つまり、<Space>ga で「カーソル位置のhunkだけ」をgit addできます。

変更A  ← ステージしたい
変更B  ← まだステージしたくない
変更C  ← ステージしたい

こういう状況で、ファイル全体ではなく変更A、変更Cだけをステージできる。 コミットの粒度を細かくコントロールしたいときに最高です。

4. git diff overlayを表示

-- diff オーバーレイ表示
vim.keymap.set('n', '<Space>go', function()
  MiniDiff.toggle_overlay()
end, { desc = 'Toggle diff overlay' })

<Space>go でオーバーレイ表示をトグル。

現在のバッファに、元のファイル(HEADの状態)との差分がインラインで表示されます。 削除された行も確認できるので、「何を消したか」も把握できます。

設定全体

-- mini.diff の設定(差分表示用)
require('mini.diff').setup()

-- mini.diff キーマップ(hunk 操作)

-- hunk をステージ(ghを使ったテキストオブジェクト)
vim.keymap.set('n', '<Space>ga', 'ghgh', { remap = true, desc = 'Apply (stage) hunk' })

-- hunk をリセット
vim.keymap.set('n', '<Space>gr', 'gHgh', { remap = true, desc = 'Reset hunk' })

-- diff オーバーレイ表示
vim.keymap.set('n', '<Space>go', function()
  MiniDiff.toggle_overlay()
end, { desc = 'Toggle diff overlay' })

-- hunk 間を移動
vim.keymap.set('n', 'gj', function()
  MiniDiff.goto_hunk('next')
end, { desc = 'Next hunk' })

vim.keymap.set('n', 'gk', function()
  MiniDiff.goto_hunk('prev')
end, { desc = 'Prev hunk' })

setup()の引数は何も渡していません。デフォルト設定で十分使えます。

キーマップまとめ

キー 機能
gj 次のhunkへ移動
gk 前のhunkへ移動
<Space>ga カーソル位置のhunkをステージ
<Space>gr カーソル位置のhunkをリセット
<Space>go diff overlayをトグル

gitsigns.nvim との比較

以前は gitsigns.nvim を使っていました。機能的にはほぼ同等です。

機能 gitsigns.nvim mini.diff
変更行の表示 対応 対応
hunk移動 対応 対応
hunkステージ 対応 対応
hunkリセット 対応 対応
diff overlay 対応 対応
blame表示 対応 vim-fugitive等で対応

mini.diffを選んだ理由:

  1. mini.nvimで統一したい — 設定がシンプルになる
  2. 依存が少ない — mini.nvim単体で完結
  3. テキストオブジェクトとしてのhunkgh が直感的

gitsignsも素晴らしいプラグインですが、mini.nvimで揃えたい派なので乗り換えました。

vim-fugitive との連携

blame表示が必要な場合は、vim-fugitive を使用しています。

-- lazy.nvim での設定
{ 'tpope/vim-fugitive' }

:Git blame でblameが見られます。

vim-fugitiveはVim/Neovim界隈で長年使われている定番のGitプラグインです。 mini.diffとの棲み分けとしては:

プラグイン 用途
mini.diff 変更行の表示、hunk操作
vim-fugitive blame、:Git コマンド全般

mini.gitもありますが、vim-fugitiveの方が慣れているので併用しています。

使いどころ

コミット前のレビュー

gj → gj → gj ...

変更箇所を順番に確認。不要な変更があれば <Space>gr でリセット。

段階的なステージング

gj → <Space>ga → gj → <Space>ga → ...

必要なhunkだけを選んでステージ。 「この機能追加」と「このリファクタ」を別々のコミットにできる。

削除行の確認

<Space>go

overlayで「何を消したか」を確認。 うっかり消してしまった行がないかチェック。

まとめ

mini.diffで使っている機能:

  1. 変更行の色付け — 編集箇所が一目で分かる
  2. hunk移動gj / gk で変更箇所をジャンプ
  3. hunkステージ/リセット<Space>ga / <Space>gr で精密なコミット管理
  4. diff overlay<Space>go で削除行も確認

設定もシンプル、依存も少ない、それでいて十分な機能。 mini.nvimらしいプラグインです。


参考