return { 'lewis6991/gitsigns.nvim', event = 'BufReadPre', opts = { signs = { add = { text = '+' }, change = { text = '~' }, delete = { text = '_' }, topdelete = { text = '‾' }, changedelete = { text = '~' }, }, on_attach = function(bufnr) local gs = package.loaded.gitsigns local function map(mode, keys, func, desc) vim.keymap.set(mode, keys, func, { buffer = bufnr, desc = 'Git: ' .. desc }) end -- Navigation map({ 'n', 'v' }, ']c', function() if vim.wo.diff then return ']c' end vim.schedule(gs.next_hunk) return '' end, 'Next hunk') map({ 'n', 'v' }, '[c', function() if vim.wo.diff then return '[c' end vim.schedule(gs.prev_hunk) return '' end, 'Prev hunk') -- Hunks map('n', 'hs', gs.stage_hunk, 'Stage hunk') map('n', 'hr', gs.reset_hunk, 'Reset hunk') map('n', 'hp', gs.preview_hunk, 'Preview hunk') map('n', 'hu', gs.undo_stage_hunk, 'Undo stage hunk') map('n', 'hb', function() gs.blame_line({ full = true }) end, 'Blame line') map('n', 'hd', gs.diffthis, 'Diff this') -- Visual stage/reset map('v', 'hs', function() gs.stage_hunk({ vim.fn.line('.'), vim.fn.line('v') }) end, 'Stage hunk') map('v', 'hr', function() gs.reset_hunk({ vim.fn.line('.'), vim.fn.line('v') }) end, 'Reset hunk') end, }, }