diff --git a/init.lua b/init.lua index 99763667213..07df83c4e2f 100644 --- a/init.lua +++ b/init.lua @@ -362,43 +362,54 @@ do }, -- gitsigns.nvim's recommended keymaps: on_attach = function(bufnr) + local function map(mode, l, r, opts) + opts = opts or {} + -- opts.buf requires Neovim 0.12.1+; older versions use opts.buffer + if vim.version.ge and vim.version.ge(vim.version(), '0.12.1') then + opts.buf = bufnr + else + opts.buffer = bufnr + end + vim.keymap.set(mode, l, r, opts) + end + -- Navigation - vim.keymap.set('n', ']c', function() + map('n', ']c', function() if vim.wo.diff then vim.cmd.normal { ']c', bang = true } else gitsigns.nav_hunk 'next' end - end, { desc = 'Jump to next git [c]hange', buf = bufnr }) + end, { desc = 'Jump to next git [c]hange' }) - vim.keymap.set('n', '[c', function() + map('n', '[c', function() if vim.wo.diff then vim.cmd.normal { '[c', bang = true } else gitsigns.nav_hunk 'prev' end - end, { desc = 'Jump to previous git [c]hange', buf = bufnr }) + end, { desc = 'Jump to previous git [c]hange' }) -- Visual mode actions - vim.keymap.set('v', 'hs', function() gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'git [s]tage hunk', buf = bufnr }) - vim.keymap.set('v', 'hr', function() gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'git [r]eset hunk', buf = bufnr }) + map('v', 'hs', function() gitsigns.stage_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'git [s]tage hunk' }) + map('v', 'hr', function() gitsigns.reset_hunk { vim.fn.line '.', vim.fn.line 'v' } end, { desc = 'git [r]eset hunk' }) -- Normal mode actions - vim.keymap.set('n', 'hs', gitsigns.stage_hunk, { desc = 'git [s]tage hunk', buf = bufnr }) - vim.keymap.set('n', 'hr', gitsigns.reset_hunk, { desc = 'git [r]eset hunk', buf = bufnr }) - vim.keymap.set('n', 'hS', gitsigns.stage_buffer, { desc = 'git [S]tage buffer', buf = bufnr }) - vim.keymap.set('n', 'hR', gitsigns.reset_buffer, { desc = 'git [R]eset buffer', buf = bufnr }) - vim.keymap.set('n', 'hp', gitsigns.preview_hunk, { desc = 'git [p]review hunk', buf = bufnr }) - vim.keymap.set('n', 'hi', gitsigns.preview_hunk_inline, { desc = 'git preview hunk [i]nline', buf = bufnr }) - vim.keymap.set('n', 'hb', function() gitsigns.blame_line { full = true } end, { desc = 'git [b]lame line', buf = bufnr }) - vim.keymap.set('n', 'hd', gitsigns.diffthis, { desc = 'git [d]iff against index', buf = bufnr }) - vim.keymap.set('n', 'hD', function() gitsigns.diffthis '~' end, { desc = 'git [D]iff against last commit', buf = bufnr }) - vim.keymap.set('n', 'hQ', function() gitsigns.setqflist 'all' end, { desc = 'git hunk [Q]uickfix list (all files in repo)', buf = bufnr }) - vim.keymap.set('n', 'hq', gitsigns.setqflist, { desc = 'git hunk [q]uickfix list (all changes in this file)', buf = bufnr }) + map('n', 'hs', gitsigns.stage_hunk, { desc = 'git [s]tage hunk' }) + map('n', 'hr', gitsigns.reset_hunk, { desc = 'git [r]eset hunk' }) + map('n', 'hS', gitsigns.stage_buffer, { desc = 'git [S]tage buffer' }) + map('n', 'hR', gitsigns.reset_buffer, { desc = 'git [R]eset buffer' }) + map('n', 'hp', gitsigns.preview_hunk, { desc = 'git [p]review hunk' }) + map('n', 'hi', gitsigns.preview_hunk_inline, { desc = 'git preview hunk [i]nline' }) + map('n', 'hb', function() gitsigns.blame_line { full = true } end, { desc = 'git [b]lame line' }) + map('n', 'hd', gitsigns.diffthis, { desc = 'git [d]iff against index' }) + map('n', 'hD', function() gitsigns.diffthis '~' end, { desc = 'git [D]iff against last commit' }) + map('n', 'hQ', function() gitsigns.setqflist 'all' end, { desc = 'git hunk [Q]uickfix list (all files in repo)' }) + map('n', 'hq', gitsigns.setqflist, { desc = 'git hunk [q]uickfix list (all changes in this file)' }) -- Toggles - vim.keymap.set('n', 'tb', gitsigns.toggle_current_line_blame, { desc = '[T]oggle git show [b]lame line', buf = bufnr }) - vim.keymap.set('n', 'tw', gitsigns.toggle_word_diff, { desc = '[T]oggle git intra-line [w]ord diff', buf = bufnr }) + map('n', 'tb', gitsigns.toggle_current_line_blame, { desc = '[T]oggle git show [b]lame line' }) + map('n', 'tw', gitsigns.toggle_word_diff, { desc = '[T]oggle git intra-line [w]ord diff' }) -- Text object - vim.keymap.set({ 'o', 'x' }, 'ih', gitsigns.select_hunk, { desc = 'text object [i]nside [h]unk', buf = bufnr }) + map({ 'o', 'x' }, 'ih', gitsigns.select_hunk, { desc = 'text object [i]nside [h]unk' }) end, }