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"), desc = "Previous hunk/diff" }, { "]c", utils.partial(nav_hunk, "next"), desc = "Next hunk/diff" }, -- Commands { "g", group = "Git" }, { "gb", gitsigns.toggle_current_line_blame, desc = "Toggle blame virtual text" }, { "gd", gitsigns.diffthis, desc = "Diff buffer" }, { "gD", utils.partial(gitsigns.diffthis, "~"), desc = "Diff buffer against last commit" }, { "gg", "Git", desc = "Git status" }, { "gh", gitsigns.toggle_deleted, desc = "Show deleted hunks" }, { "gL", ":spT:Gllog --follow -- %:p", desc = "Current buffer log" }, { "gm", "(git-messenger)", desc = "Current line blame" }, { "gp", gitsigns.preview_hunk, desc = "Preview hunk" }, { "gr", gitsigns.reset_hunk, desc = "Restore hunk" }, { "gR", gitsigns.reset_buffer, desc = "Restore buffer" }, { "gs", gitsigns.stage_hunk, desc = "Stage hunk" }, { "gS", gitsigns.stage_buffer, desc = "Stage buffer" }, { "gu", gitsigns.undo_stage_hunk, desc = "Undo stage hunk" }, { "g[", utils.partial(gitsigns.nav_hunk, "prev"), desc = "Previous hunk" }, { "g]", utils.partial(gitsigns.nav_hunk, "next"), desc = "Next hunk" }, } local objects = { mode = "o", { "ih", gitsigns.select_hunk, desc = "Git hunk" }, } -- Visual local visual = { mode = { "x" }, { "ih", gitsigns.select_hunk, desc = "Git hunk" }, { "g", group = "Git" }, { "gp", gitsigns.preview_hunk, desc = "Preview selection" }, { "gr", make_visual(gitsigns.reset_hunk), desc = "Restore selection" }, { "gs", make_visual(gitsigns.stage_hunk), desc = "Stage selection" }, { "gu", gitsigns.undo_stage_hunk, desc = "Undo stage selection" }, } wk.add(keys) wk.add(objects) wk.add(visual)