From d1e7d5687c112d73a7d04e6a94744b80583a4399 Mon Sep 17 00:00:00 2001
From: Mora Unie Youer <mora_unie_youer@riseup.net>
Date: Sat, 29 Mar 2025 16:47:56 +0300
Subject: feat: use `gitsigns.nvim` instead of `mini.diff`

---
 lua/config/plugins/git.lua  | 50 +++++++++++++++++++++++++++++++++++++++++++++
 lua/config/plugins/mini.lua | 11 +++++-----
 2 files changed, 56 insertions(+), 5 deletions(-)
 create mode 100644 lua/config/plugins/git.lua

(limited to 'lua')

diff --git a/lua/config/plugins/git.lua b/lua/config/plugins/git.lua
new file mode 100644
index 0000000..027aa83
--- /dev/null
+++ b/lua/config/plugins/git.lua
@@ -0,0 +1,50 @@
+return {
+  {
+    -- NOTE: we could use mini.diff, but it doesn't show staged hunks
+    "gitsigns.nvim",
+    event = "DeferredUIEnter",
+    after = function(_)
+      local gs = require("gitsigns")
+
+      gs.setup({
+        on_attach = function(bufnr)
+
+          local function map(mode, l, r, desc, opts)
+            opts = opts or {}
+            opts.desc = desc
+            opts.buffer = bufnr
+            vim.keymap.set(mode, l, r, opts)
+          end
+
+          map("n", "[h", function()
+            if vim.wo.diff then
+              vim.cmd.normal({"[c", bang = true})
+            else
+              gs.nav_hunk("prev")
+            end
+          end, "Prev hunk")
+
+          map("n", "]h", function()
+            if vim.wo.diff then
+              vim.cmd.normal({"]c", bang = true})
+            else
+              gs.nav_hunk("next")
+            end
+          end, "Next hunk")
+
+          map("n", "]H", function() gs.nav_hunk("first") end, "First hunk")
+          map("n", "]H", function() gs.nav_hunk("last") end, "Last hunk")
+
+          map("n", "<leader>ghs", gs.stage_hunk, "Stage hunk")
+          map("n", "<leader>ghr", gs.reset_hunk, "Reset hunk")
+          map("n", "<leader>ghS", gs.stage_buffer, "Stage buffer")
+          map("n", "<leader>ghR", gs.reset_buffer, "Reset buffer")
+          map("n", "<leader>ghu", gs.undo_stage_hunk, "Undo stage hunk")
+
+          -- NOTE: if using <Cmd> here, we don't get full hunk in selection
+          map({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>", "Hunk")
+        end
+      })
+    end
+  }
+}
diff --git a/lua/config/plugins/mini.lua b/lua/config/plugins/mini.lua
index e842fa3..65e3f6e 100644
--- a/lua/config/plugins/mini.lua
+++ b/lua/config/plugins/mini.lua
@@ -15,17 +15,18 @@ return {
   },
   {
     "mini.diff",
+    enabled = false, -- NOTE: using gitsigns.nvim due to more features
     event = "DeferredUIEnter",
     keys = {
-      { "<leader>ht", function() require("mini.diff").toggle() end, mode = { "n" }, desc = "Toggle hunk processing" },
-      { "<leader>ho", function() require("mini.diff").toggle_overlay() end, mode = { "n" }, desc = "Toggle hunk overlay" },
+      { "<leader>ght", function() require("mini.diff").toggle() end, mode = { "n" }, desc = "Toggle hunk processing" },
+      { "<leader>gho", function() require("mini.diff").toggle_overlay() end, mode = { "n" }, desc = "Toggle hunk overlay" },
     },
     after = function (_)
       require("mini.diff").setup({
         mappings = {
-          apply = "<leader>ha",
-          reset = "<leader>hr",
-          textobject = "<leader>ha",
+          apply = "<leader>ghs",
+          reset = "<leader>ghr",
+          textobject = "<leader>ghs",
           goto_first = "[H",
           goto_prev = "[h",
           goto_next = "]h",
-- 
cgit v1.2.3-70-g09d2