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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
require("git-conflict").setup({
disable_diagnostics = true,
default_mappings = {
next = "]x",
prev = "[x",
},
})
require("neogit").setup({
disable_commit_confirmation = true,
kind = "split",
console_timeout = 5000,
auto_show_console = false,
})
vim.keymap.set("n", "<leader>go", function()
require("neogit").open()
end, { desc = "neo[G]it [O]pen" })
require("gitlinker").setup({
callbacks = {
["git.sommerfeld.dev"] = function(url_data)
local url = require("gitlinker.hosts").get_base_https_url(url_data)
url = url .. "/tree/" .. url_data.file .. "?id=" .. url_data.rev
if url_data.lstart then
url = url .. "#n" .. url_data.lstart
end
return url
end,
},
})
vim.keymap.set("n", "<leader>gy", function()
require("gitlinker").get_buf_range_url("n")
end)
vim.keymap.set("v", "<leader>gy", function()
require("gitlinker").get_buf_range_url("v")
end)
require("gitsigns").setup({
signs = {
change = { show_count = true },
delete = { show_count = true },
topdelete = { show_count = true },
changedelete = { show_count = true },
},
numhl = true,
on_attach = function(bufnr)
local gs = require("gitsigns")
local function map(mode, l, r, desc)
vim.keymap.set(mode, l, r, { buffer = bufnr, desc = desc })
end
local function nmap(l, r, desc)
map("n", l, r, desc)
end
local function vmap(l, r, desc)
map("v", l, r, desc)
end
-- Navigation
nmap("]c", function()
if vim.wo.diff then
vim.cmd.normal({ "]c", bang = true })
else
gs.nav_hunk("next")
end
end, "Jump to next git [c]hange")
nmap("[c", function()
if vim.wo.diff then
vim.cmd.normal({ "[c", bang = true })
else
gs.nav_hunk("prev")
end
end, "Jump to previous git [c]hange")
-- Actions
nmap("<leader>hs", gs.stage_hunk, "git [s]tage hunk")
nmap("<leader>hr", gs.reset_hunk, "git [r]eset hunk")
vmap("<leader>hs", function()
gs.stage_hunk({ vim.fn.line("."), vim.fn.line("v") })
end, "git [s]tage hunk")
vmap("<leader>hr", function()
gs.reset_hunk({ vim.fn.line("."), vim.fn.line("v") })
end, "git [r]eset hunk")
nmap("<leader>hS", gs.stage_buffer, "git [S]tage buffer")
nmap("<leader>hR", gs.reset_buffer, "git [R]eset buffer")
nmap("<leader>hp", gs.preview_hunk, "git [p]review hunk")
nmap("<leader>hb", function()
gs.blame_line({ full = true })
end, "git [b]lame line")
nmap(
"<leader>tb",
gs.toggle_current_line_blame,
"[T]oggle git show [b]lame line"
)
nmap("<leader>hd", gs.diffthis, "git [d]iff against index")
nmap("<leader>hD", function()
gs.diffthis("~")
end, "git [D]iff against last commit")
nmap("<leader>hc", gs.change_base, "git [C]hange base to index")
nmap("<leader>hC", function()
gs.change_base("~")
end, "git [C]hange base to HEAD")
nmap(
"<leader>tgd",
gs.preview_hunk_inline,
"[T]oggle [G]it show [D]eleted"
)
nmap("<leader>tgw", gs.toggle_word_diff, "[T]oggle [G]it [W]ord diff")
nmap(
"<leader>tgl",
gs.toggle_linehl,
"[T]oggle [G]it [L]ine highlighting"
)
-- Text object
map(
{ "o", "x" },
"ih",
":<C-U>Gitsigns select_hunk<CR>",
"git [H]unk text object"
)
end,
})
|