summaryrefslogtreecommitdiffstats
path: root/modules/plugins/git/gitsigns/config.nix
blob: 3c9e61b832737f90fc202b97f5671f04f5c477f4 (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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
{
  config,
  lib,
  options,
  ...
}: let
  inherit (builtins) toJSON;
  inherit (lib.modules) mkIf mkMerge;
  inherit (lib.generators) mkLuaInline;
  inherit (lib.nvim.binds) mkKeymap pushDownDefault;

  cfg = config.vim.git.gitsigns;

  inherit (options.vim.git.gitsigns) mappings;
in {
  config = mkIf cfg.enable (mkMerge [
    {
      vim = {
        lazy.plugins.gitsigns-nvim = {
          package = "gitsigns-nvim";
          setupModule = "gitsigns";
          inherit (cfg) setupOpts;
          event = [
            {
              event = "User";
              pattern = "LazyFile";
            }
          ];
          cmd = ["Gitsigns"];
          keys = [
            (mkKeymap "n" cfg.mappings.nextHunk ''
                function()
                  if vim.wo.diff then return ${toJSON cfg.mappings.nextHunk} end

                  vim.schedule(function() package.loaded.gitsigns.next_hunk() end)

                  return '<Ignore>'
                end
              '' {
                desc = mappings.nextHunk.description;
                lua = true;
                expr = true;
              })

            (mkKeymap "n" cfg.mappings.previousHunk ''
                function()
                  if vim.wo.diff then return ${toJSON cfg.mappings.previousHunk} end

                  vim.schedule(function() package.loaded.gitsigns.prev_hunk() end)

                  return '<Ignore>'
                end
              '' {
                desc = mappings.previousHunk.description;
                lua = true;
                expr = true;
              })

            (mkKeymap "n" cfg.mappings.stageHunk "function() package.loaded.gitsigns.stage_hunk() end" {
              desc = mappings.stageHunk.description;
              lua = true;
            })
            (mkKeymap "n" cfg.mappings.resetHunk "function() package.loaded.gitsigns.reset_hunk() end" {
              desc = mappings.resetHunk.description;
              lua = true;
            })
            (mkKeymap "n" cfg.mappings.undoStageHunk "function() package.loaded.gitsigns.undo_stage_hunk() end" {
              desc = mappings.undoStageHunk.description;
              lua = true;
            })

            (mkKeymap "n" cfg.mappings.stageBuffer "function() package.loaded.gitsigns.stage_buffer() end" {
              desc = mappings.stageBuffer.description;
              lua = true;
            })
            (mkKeymap "n" cfg.mappings.resetBuffer "function() package.loaded.gitsigns.reset_buffer() end" {
              desc = mappings.resetBuffer.description;
              lua = true;
            })

            (mkKeymap "n" cfg.mappings.previewHunk "function() package.loaded.gitsigns.preview_hunk() end" {
              desc = mappings.previewHunk.description;
              lua = true;
            })

            (mkKeymap "n" cfg.mappings.blameLine "function() package.loaded.gitsigns.blame_line{full=true} end" {
              desc = mappings.blameLine.description;
              lua = true;
            })
            (mkKeymap "n" cfg.mappings.toggleBlame "function() package.loaded.gitsigns.toggle_current_line_blame() end" {
              desc = mappings.toggleBlame.description;
              lua = true;
            })

            (mkKeymap "n" cfg.mappings.diffThis "function() package.loaded.gitsigns.diffthis() end" {
              desc = mappings.diffThis.description;
              lua = true;
            })
            (mkKeymap "n" cfg.mappings.diffProject "function() package.loaded.gitsigns.diffthis('~') end" {
              desc = mappings.diffProject.description;
              lua = true;
            })

            (mkKeymap "n" cfg.mappings.toggleDeleted "function() package.loaded.gitsigns.toggle_deleted() end" {
              desc = mappings.toggleDeleted.description;
              lua = true;
            })

            (mkKeymap "v" cfg.mappings.stageHunk "function() package.loaded.gitsigns.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end" {
              desc = mappings.stageHunk.description;
              lua = true;
            })
            (mkKeymap "v" cfg.mappings.resetHunk "function() package.loaded.gitsigns.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end" {
              desc = mappings.resetHunk.description;
              lua = true;
            })
          ];
        };

        binds.whichKey.register = pushDownDefault {
          "<leader>h" = "+Gitsigns";
        };
      };
    }

    (mkIf cfg.codeActions.enable {
      vim.lsp.null-ls = {
        enable = true;
        setupOpts.sources = [
          (mkLuaInline ''
            require("null-ls").builtins.code_actions.gitsigns
          '')
        ];
      };
    })
  ]);
}