/ nvim / lua / plugins / git.lua
git.lua
 1  --- Gitsigns: \\g prefix, signs, blame, hunks. Customizations from original Lazy spec.
 2  return {
 3    specs = {
 4      { src = 'https://github.com/lewis6991/gitsigns.nvim', name = 'gitsigns.nvim' },
 5    },
 6    config = function()
 7      local gitsigns = require('gitsigns')
 8      if type(gitsigns) ~= 'table' or not gitsigns.setup then
 9        return
10      end
11      gitsigns.setup({
12        current_line_blame = true,
13        signs = {
14          add = { text = '┃' },
15          change = { text = '┃' },
16          delete = { text = '┃' },
17          topdelete = { text = '‾' },
18          changedelete = { text = '~' },
19          untracked = { text = '┆' },
20        },
21        signs_staged = {
22          add = { text = '┃' },
23          change = { text = '┃' },
24          delete = { text = '_' },
25          topdelete = { text = '‾' },
26          changedelete = { text = '~' },
27          untracked = { text = '┆' },
28        },
29        signs_staged_enable = true,
30        signcolumn = true,
31        numhl = false,
32        linehl = false,
33        word_diff = false,
34        watch_gitdir = { follow_files = true },
35        on_attach = function(bufnr)
36          local function map(mode, l, r, opts)
37            opts = opts or {}
38            opts.buffer = bufnr
39            vim.keymap.set(mode, l, r, opts)
40          end
41          map('n', ']c', function()
42            if vim.wo.diff then
43              vim.cmd.normal({ ']c', bang = true })
44            else
45              gitsigns.nav_hunk('next')
46            end
47          end, { desc = 'Next hunk' })
48          map('n', '[c', function()
49            if vim.wo.diff then
50              vim.cmd.normal({ '[c', bang = true })
51            else
52              gitsigns.nav_hunk('prev')
53            end
54          end, { desc = 'Previous hunk' })
55          map('n', '\\gs', gitsigns.stage_hunk, { desc = 'stage hunk' })
56          map('n', '\\gr', gitsigns.reset_hunk, { desc = 'reset hunk' })
57          map('v', '\\gs', function()
58            gitsigns.stage_hunk({ vim.fn.line('.'), vim.fn.line('v') })
59          end, { desc = 'stage hunk' })
60          map('v', '\\gr', function()
61            gitsigns.reset_hunk({ vim.fn.line('.'), vim.fn.line('v') })
62          end, { desc = 'reset hunk' })
63          map('n', '\\gS', gitsigns.stage_buffer, { desc = 'stage buffer' })
64          map('n', '\\gu', gitsigns.stage_hunk, { desc = 'stage hunk' })
65          map('n', '\\gR', gitsigns.reset_buffer, { desc = 'reset buffer' })
66          map('n', '\\gp', gitsigns.preview_hunk, { desc = 'preview hunk' })
67          map('n', '\\gP', gitsigns.preview_hunk_inline, { desc = 'review hunk inline' })
68          map('n', '\\gb', function()
69            gitsigns.blame_line({ full = true })
70          end, { desc = 'git blame line' })
71          map('n', '\\gtb', gitsigns.toggle_current_line_blame, { desc = 'toggle line blame' })
72          map('n', '\\gd', gitsigns.diffthis, { desc = 'diff this' })
73          map('n', '\\gD', function()
74            gitsigns.diffthis('~')
75          end, { desc = 'Diff this and stage changes' })
76          map('n', '\\gtd', gitsigns.toggle_deleted, { desc = 'toggle deleted' })
77          map({ 'o', 'x' }, 'ih', ':<C-U>Gitsigns select_hunk<CR>', { desc = 'Select hunk' })
78        end,
79      })
80    end,
81  }