summaryrefslogtreecommitdiff
path: root/lua/config/plugins/git.lua
blob: 12d376bf185d18c2e6ae6d890be1663426255c05 (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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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({
				signs = {
					add = { text = "▎" },
					change = { text = "▎" },
					delete = { text = "" },
					topdelete = { text = "" },
					changedelete = { text = "▎" },
					untracked = { text = "▎" },
				},
				signs_staged = {
					add = { text = "▎" },
					change = { text = "▎" },
					delete = { text = "" },
					topdelete = { text = "" },
					changedelete = { text = "▎" },
				},

				numhl = true,

				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("v", "<leader>ghs", function()
						gs.stage_hunk({ vim.fn.line("."), vim.fn.line("v") })
					end, "Stage hunk")
					map("v", "<leader>ghr", function()
						gs.reset_hunk({ vim.fn.line("."), vim.fn.line("v") })
					end, "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,
	},
}