summaryrefslogtreecommitdiff
path: root/lua/config/plugins/git.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/config/plugins/git.lua')
-rw-r--r--lua/config/plugins/git.lua50
1 files changed, 50 insertions, 0 deletions
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
+ }
+}