
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を選んだ理由:
- mini.nvimで統一したい — 設定がシンプルになる
- 依存が少ない — mini.nvim単体で完結
- テキストオブジェクトとしてのhunk —
ghが直感的
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で使っている機能:
- 変更行の色付け — 編集箇所が一目で分かる
- hunk移動 —
gj/gkで変更箇所をジャンプ - hunkステージ/リセット —
<Space>ga/<Space>grで精密なコミット管理 - diff overlay —
<Space>goで削除行も確認
設定もシンプル、依存も少ない、それでいて十分な機能。 mini.nvimらしいプラグインです。