1-- Adds git related signs to the gutter, as well as utilities for managing changes
2-- NOTE: gitsigns is already included in init.lua but contains only the base
3-- config. This will add also the recommended keymaps.
4
5return {
6 {
7 "lewis6991/gitsigns.nvim",
8 opts = {
9 on_attach = function(bufnr)
10 local gitsigns = require("gitsigns")
11
12 local function map(mode, l, r, opts)
13 opts = opts or {}
14 opts.buffer = bufnr
15 vim.keymap.set(mode, l, r, opts)
16 end
17
18 -- Navigation
19 map("n", "]c", function()
20 if vim.wo.diff then
21 vim.cmd.normal({ "]c", bang = true })
22 else
23 gitsigns.nav_hunk("next")
24 end
25 end, { desc = "Jump to next git [c]hange" })
26
27 map("n", "[c", function()
28 if vim.wo.diff then
29 vim.cmd.normal({ "[c", bang = true })
30 else
31 gitsigns.nav_hunk("prev")
32 end
33 end, { desc = "Jump to previous git [c]hange" })
34
35 -- Actions
36 -- visual mode
37 map("v", "<leader>hs", function()
38 gitsigns.stage_hunk({ vim.fn.line("."), vim.fn.line("v") })
39 end, { desc = "git [s]tage hunk" })
40 map("v", "<leader>hr", function()
41 gitsigns.reset_hunk({ vim.fn.line("."), vim.fn.line("v") })
42 end, { desc = "git [r]eset hunk" })
43 -- normal mode
44 map("n", "<leader>hs", gitsigns.stage_hunk, { desc = "git [s]tage hunk" })
45 map("n", "<leader>hr", gitsigns.reset_hunk, { desc = "git [r]eset hunk" })
46 map("n", "<leader>hS", gitsigns.stage_buffer, { desc = "git [S]tage buffer" })
47 map("n", "<leader>hu", gitsigns.stage_hunk, { desc = "git [u]ndo stage hunk" })
48 map("n", "<leader>hR", gitsigns.reset_buffer, { desc = "git [R]eset buffer" })
49 map("n", "<leader>hp", gitsigns.preview_hunk, { desc = "git [p]review hunk" })
50 map("n", "<leader>hb", gitsigns.blame_line, { desc = "git [b]lame line" })
51 map("n", "<leader>hd", gitsigns.diffthis, { desc = "git [d]iff against index" })
52 map("n", "<leader>hD", function()
53 gitsigns.diffthis("@")
54 end, { desc = "git [D]iff against last commit" })
55 -- Toggles
56 map("n", "<leader>tb", gitsigns.toggle_current_line_blame, { desc = "[T]oggle git show [b]lame line" })
57 map("n", "<leader>tD", gitsigns.preview_hunk_inline, { desc = "[T]oggle git show [D]eleted" })
58 end,
59 },
60 },
61}