summaryrefslogtreecommitdiff
path: root/lua/config/plugins/git.lua
blob: 73807a93929b9c9f7831291ff0d620e2e03c7738 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
return {
  {
    -- NOTE: we could use mini.diff, but it doesn't show staged hunks
    "gitsigns.nvim",
    event = "DeferredUIEnter",
    after = function(_)
      local gs = require("gitsigns")

      gs.setup({
        sign_priority = 999,

        on_attach = function(bufnr)

          local function map(mode, l, r, desc, opts)
            opts = opts or {}
            opts.desc = desc
            opts.buffer = bufnr
            vim.keymap.set(mode, l, r, opts)
          end

          map("n", "[h", function()
            if vim.wo.diff then
              vim.cmd.normal({"[c", bang = true})
            else
              gs.nav_hunk("prev")
            end
          end, "Prev hunk")

          map("n", "]h", function()
            if vim.wo.diff then
              vim.cmd.normal({"]c", bang = true})
            else
              gs.nav_hunk("next")
            end
          end, "Next hunk")

          map("n", "]H", function() gs.nav_hunk("first") end, "First hunk")
          map("n", "]H", function() gs.nav_hunk("last") end, "Last hunk")

          map("n", "<leader>ghs", gs.stage_hunk, "Stage hunk")
          map("n", "<leader>ghr", gs.reset_hunk, "Reset hunk")
          map("n", "<leader>ghS", gs.stage_buffer, "Stage buffer")
          map("n", "<leader>ghR", gs.reset_buffer, "Reset buffer")
          map("n", "<leader>ghu", gs.undo_stage_hunk, "Undo stage hunk")

          -- NOTE: if using <Cmd> here, we don't get full hunk in selection
          map({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>", "Hunk")
        end
      })
    end
  }
}