local gitsigns = require("gitsigns") 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 gitsigns.setup({ current_line_blame_opts = { -- Show the blame quickly delay = 100, }, }) local keys = { -- Navigation ["[c"] = { "&diff ? '[c' : 'Gitsigns prev_hunk'", "Previous hunk/diff", expr = true }, ["]c"] = { "&diff ? ']c' : 'Gitsigns next_hunk'", "Next hunk/diff", expr = true }, -- Commands ["g"] = { name = "Git", -- Actions b = { gitsigns.toggle_current_line_blame, "Toggle blame virtual text" }, d = { gitsigns.diffthis, "Diff buffer" }, -- stylua: ignore D = { function() gitsigns.diffthis("~") end, "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" }, -- Only the actual command can make use of the visual selection... ["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" })