local gitsigns = require("gitsigns") local utils = require("ambroisie.utils") local wk = require("which-key") --- Transform `f` into a function which acts on the current visual selection local function make_visual(f) return function() local first = vim.fn.line("v") local last = vim.fn.line(".") f({ first, last }) end end local function nav_hunk(dir) if vim.wo.diff then local map = { prev = "[c", next = "]c", } vim.cmd.normal({ map[dir], bang = true }) else gitsigns.nav_hunk(dir) end end gitsigns.setup({ current_line_blame_opts = { -- Show the blame quickly delay = 100, }, -- Work-around for https://github.com/lewis6991/gitsigns.nvim/issues/929 signs_staged_enable = false, }) local keys = { -- Navigation ["[c"] = { utils.partial(nav_hunk, "prev"), "Previous hunk/diff" }, ["]c"] = { utils.partial(nav_hunk, "next"), "Next hunk/diff" }, -- Commands ["g"] = { name = "Git", -- Actions b = { gitsigns.toggle_current_line_blame, "Toggle blame virtual text" }, d = { gitsigns.diffthis, "Diff buffer" }, -- stylua: ignore D = { utils.partial(gitsigns.diffthis, "~"), "Diff buffer against last commit" }, g = { "Git", "Git status" }, h = { gitsigns.toggle_deleted, "Show deleted hunks" }, L = { ":spT:Gllog --follow -- %:p", "Current buffer log" }, m = { "(git-messenger)", "Current line blame" }, p = { gitsigns.preview_hunk, "Preview hunk" }, r = { gitsigns.reset_hunk, "Restore hunk" }, R = { gitsigns.reset_buffer, "Restore buffer" }, s = { gitsigns.stage_hunk, "Stage hunk" }, S = { gitsigns.stage_buffer, "Stage buffer" }, u = { gitsigns.undo_stage_hunk, "Undo stage hunk" }, ["["] = { gitsigns.prev_hunk, "Previous hunk" }, ["]"] = { gitsigns.next_hunk, "Next hunk" }, }, } local objects = { ["ih"] = { gitsigns.select_hunk, "Git hunk" }, } local visual = { ["ih"] = { gitsigns.select_hunk, "Git hunk" }, ["g"] = { name = "Git", p = { gitsigns.preview_hunk, "Preview selection" }, r = { make_visual(gitsigns.reset_hunk), "Restore selection" }, s = { make_visual(gitsigns.stage_hunk), "Stage selection" }, u = { gitsigns.undo_stage_hunk, "Undo stage selection" }, }, } wk.register(keys, { buffer = bufnr }) wk.register(objects, { buffer = bufnr, mode = "o" }) wk.register(visual, { buffer = bufnr, mode = "x" })