aboutsummaryrefslogtreecommitdiffstats
path: root/modules/development/nixvim/plugins/gitsigns.nix
blob: d9bda2197b5d277fd416d69e415d2f46dee267fd (plain)
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
# Git integration: signs, blame, diffs and hunk operations
{
  config,
  lib,
  pkgs,
  ...
}:
let
  base16Colors = import ../../../colors/base16 { inherit config lib pkgs; };
in
{
  config.programs.nixvim = lib.mkIf config.development.nixvim.enable {
    plugins.gitsigns = {
      enable = true;

      settings = {
        signs = {
          add.text = "┃";
          change.text = "┃";
          delete.text = "▁";
          topdelete.text = "▔";
          changedelete.text = "~";
          untracked.text = "┆";
        };

        signcolumn = false;
        numhl = true;
        current_line_blame = false;
        current_line_blame_formatter = "<author>, <author_time:%Y-%m-%d> - <summary>";

        on_attach = ''
          function(bufnr)
            local gitsigns = require('gitsigns')
            local function map(mode, lhs, rhs, desc)
              vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, silent = true, desc = desc })
            end

            -- Navigation
            map('n', ']c', function() gitsigns.nav_hunk('next') end, 'Next hunk')
            map('n', '[c', function() gitsigns.nav_hunk('prev') end, 'Previous hunk')
            map('n', ']C', function() gitsigns.nav_hunk('last') end, 'Last hunk')
            map('n', '[C', function() gitsigns.nav_hunk('first') end, 'First hunk')

            -- Hunk actions
            map('n', '<leader>gs', gitsigns.stage_hunk, 'Stage hunk')
            map('v', '<leader>gs', function()
              gitsigns.stage_hunk({ vim.fn.line('.'), vim.fn.line('v') })
            end, 'Stage visual range hunk')
            map('n', '<leader>gr', gitsigns.reset_hunk, 'Reset hunk')
            map('v', '<leader>gr', function()
              gitsigns.reset_hunk({ vim.fn.line('.'), vim.fn.line('v') })
            end, 'Reset visual range hunk')
            map('n', '<leader>gS', gitsigns.stage_buffer, 'Stage buffer')
            map('n', '<leader>gR', gitsigns.reset_buffer, 'Reset buffer')
            map('n', '<leader>gi', gitsigns.reset_buffer_index, 'Unstage buffer (reset index)')
            map('n', '<leader>gu', gitsigns.undo_stage_hunk, 'Undo stage hunk')

            -- Preview
            map('n', '<leader>gp', gitsigns.preview_hunk, 'Preview hunk')
            map('n', '<leader>gP', gitsigns.preview_hunk_inline, 'Preview hunk inline')

            -- Blame
            map('n', '<leader>gb', gitsigns.blame_line, 'Blame line')
            map('n', '<leader>gB', function()
              gitsigns.blame_line({ full = true })
            end, 'Blame line (full)')

            -- Diffs / base
            map('n', '<leader>gd', gitsigns.diffthis, 'Diff this (index)')
            map('n', '<leader>gD', function()
              gitsigns.diffthis('~')
            end, 'Diff this (HEAD)')
            map('n', '<leader>gc', function()
              gitsigns.change_base(nil, true)
            end, 'Change diff base')

            -- Quickfix / location list
            map('n', '<leader>gq', gitsigns.setqflist, 'Hunks to quickfix')
            map('n', '<leader>gQ', function()
              gitsigns.setqflist('all')
            end, 'Repo hunks to quickfix')
            map('n', '<leader>gl', gitsigns.setloclist, 'Hunks to location list')

            -- Toggles
            map('n', '<leader>gts', gitsigns.toggle_signs, 'Toggle signs')
            map('n', '<leader>gtl', gitsigns.toggle_linehl, 'Toggle line highlight')
            map('n', '<leader>gtn', gitsigns.toggle_numhl, 'Toggle number highlight')
            map('n', '<leader>gtw', gitsigns.toggle_word_diff, 'Toggle word diff')
            map('n', '<leader>gtb', gitsigns.toggle_current_line_blame, 'Toggle current line blame')
            map('n', '<leader>gtd', gitsigns.toggle_deleted, 'Toggle deleted lines')

            -- Misc
            map('n', '<leader>gF', gitsigns.refresh, 'Refresh gitsigns')

            -- Text object
            map({ 'o', 'x' }, 'ih', gitsigns.select_hunk, 'Select hunk text object')
          end
        '';
      };
    };

    highlight = with base16Colors.colorsWithHashPrefix; {
      GitSignsAdd.fg = base0B;
      GitSignsChange.fg = base0A;
      GitSignsDelete.fg = base08;
      GitSignsTopdelete.fg = base08;
      GitSignsChangedelete.fg = base0A;
      GitSignsUntracked.fg = base0C;
      GitSignsCurrentLineBlame.fg = base04;
    };
  };
}