return { "gitsigns.nvim", event = "BufEnter", after = function() require("gitsigns").setup({ on_attach = function(bufnr) local gitsigns = require("gitsigns") local function map(mode, l, r, opts) opts = opts or {} opts.buffer = bufnr vim.keymap.set(mode, l, r, opts) end -- Navigation map("n", "]c", function() if vim.wo.diff then vim.cmd.normal({ "]c", bang = true }) else gitsigns.nav_hunk("next") end end) map("n", "[c", function() if vim.wo.diff then vim.cmd.normal({ "[c", bang = true }) else gitsigns.nav_hunk("prev") end end) -- Actions map("n", "gs", gitsigns.stage_hunk) map("n", "gr", gitsigns.reset_hunk) map("v", "gs", function() gitsigns.stage_hunk({ vim.fn.line("."), vim.fn.line("v") }) end) map("v", "gr", function() gitsigns.reset_hunk({ vim.fn.line("."), vim.fn.line("v") }) end) map("n", "gS", gitsigns.stage_buffer) map("n", "gu", gitsigns.undo_stage_hunk) map("n", "gR", gitsigns.reset_buffer) map("n", "gp", gitsigns.preview_hunk) map("n", "gb", function() gitsigns.blame_line({ full = true }) end) map("n", "gb", gitsigns.toggle_current_line_blame) map("n", "gd", gitsigns.diffthis) map("n", "gD", function() gitsigns.diffthis("~") end) map("n", "gtd", gitsigns.toggle_deleted) -- Text object map({ "o", "x" }, "ih", ":Gitsigns select_hunk") end, }) end, }