diff options
Diffstat (limited to 'lua/config/plugins/git.lua')
-rw-r--r-- | lua/config/plugins/git.lua | 50 |
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 + } +} |