From 9c8121916cd7acb8a3d9059bef9f5720a0edd9a3 Mon Sep 17 00:00:00 2001 From: Minijackson Date: Wed, 21 Jun 2023 14:51:51 +0200 Subject: vim: new way of adding keymaps for gitsigns.nvim --- dotfiles/vim/lua/myConfig.lua | 62 ++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/dotfiles/vim/lua/myConfig.lua b/dotfiles/vim/lua/myConfig.lua index 3dc45ce..65753ea 100644 --- a/dotfiles/vim/lua/myConfig.lua +++ b/dotfiles/vim/lua/myConfig.lua @@ -160,25 +160,49 @@ end, mapopts) -- Gitsigns require("gitsigns").setup { - keymaps = { - noremap = true, - buffer = true, - silent = true, - - ["n ]c"] = { expr = true, "&diff ? ']c' : 'lua require\"gitsigns\".next_hunk()'" }, - ["n [c"] = { expr = true, "&diff ? '[c' : 'lua require\"gitsigns\".prev_hunk()'" }, - - ["n hs"] = 'lua require"gitsigns".stage_hunk()', - ["n hu"] = 'lua require"gitsigns".undo_stage_hunk()', - ["n hr"] = 'lua require"gitsigns".reset_hunk()', - ["n hR"] = 'lua require"gitsigns".reset_buffer()', - ["n hp"] = 'lua require"gitsigns".preview_hunk()', - ["n hb"] = 'lua require"gitsigns".blame_line()', - - -- Text objects - ["o ih"] = ':lua require"gitsigns".select_hunk()', - ["x ih"] = ':lua require"gitsigns".select_hunk()', - }, + on_attach = function(bufnr) + local gs = package.loaded.gitsigns + + local function map(mode, l, r, opts) + opts = vim.tbl_extend("force", { + noremap = true, + buffer = buffnr, + silent = true, + }, opts or {}) + vim.keymap.set(mode, l, r, opts) + end + + -- Navigation + map('n', ']c', function() + if vim.wo.diff then return ']c' end + vim.schedule(function() gs.next_hunk() end) + return '' + end, { expr = true }) + + map('n', '[c', function() + if vim.wo.diff then return '[c' end + vim.schedule(function() gs.prev_hunk() end) + return '' + end, { expr = true }) + + -- Actions + map('n', 'hs', gs.stage_hunk, { desc = "Stage Hunk" }) + map('n', 'hr', gs.reset_hunk, { desc = "reset Hunk" }) + map('v', 'hs', function() gs.stage_hunk { vim.fn.line('.'), vim.fn.line('v') } end, { desc = "Stage hunk" }) + map('v', 'hr', function() gs.reset_hunk { vim.fn.line('.'), vim.fn.line('v') } end, { desc = "Reset hunk" }) + map('n', 'hS', gs.stage_buffer, { desc = "Stage buffer" }) + map('n', 'hu', gs.undo_stage_hunk, { desc = "Undo stage hunk" }) + map('n', 'hR', gs.reset_buffer, { desc = "Reset buffer" }) + map('n', 'hp', gs.preview_hunk, { desc = "Preview hunk" }) + map('n', 'hb', function() gs.blame_line { full = true } end, { desc = "Blame line" }) + map('n', 'tb', gs.toggle_current_line_blame, { desc = "Toggle current line blame" }) + map('n', 'hd', gs.diffthis, { desc = "Diff this" }) + map('n', 'hD', function() gs.diffthis('~') end, { desc = "Diff this against ~" }) + map('n', 'td', gs.toggle_deleted, { desc = "Toggle deleted" }) + + -- Text object + map({ 'o', 'x' }, 'ih', ':Gitsigns select_hunk', { desc = "Select hunk" }) + end, } -- Treesitter -- cgit v1.2.3