summaryrefslogtreecommitdiffstats
path: root/modules/plugins/assistant/neocodeium/neocodeium.nix
blob: fe3f3388a9e21cc76812ca3a2a0df55db15f1911 (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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
{
  config,
  lib,
  ...
}: let
  inherit
    (lib.types)
    nullOr
    str
    bool
    int
    attrsOf
    listOf
    enum
    ;
  inherit (lib.options) mkOption mkEnableOption;
  inherit (lib.nvim.types) mkPluginSetupOption luaInline;
  inherit (config.vim.lib) mkMappingOption;
in {
  options.vim.assistant.neocodeium = {
    enable = mkEnableOption "NeoCodeium AI completion";

    setupOpts = mkPluginSetupOption "NeoCodeium" {
      enabled = mkOption {
        type = nullOr bool;
        default = null;
        description = "Whether to start windsurf server. Can be manually enabled with `:NeoCodeium enable`";
      };

      bin = mkOption {
        type = nullOr str;
        default = null;
        description = "Path to custom windsurf server binary";
      };

      manual = mkOption {
        type = nullOr bool;
        default = null;
        description = "When true, autosuggestions are disabled. Use `require'neocodeium'.cycle_or_complete()` to show suggestions manually";
      };

      server = {
        api_url = mkOption {
          type = nullOr str;
          default = null;
          description = "API URL to use (for Enterprise mode)";
        };
        portal_url = mkOption {
          type = nullOr str;
          default = null;
          description = "Portal URL to use (for registering a user and downloading the binary)";
        };
      };

      show_label = mkOption {
        type = nullOr bool;
        default = null;
        description = "Whether to show the number of suggestions label in the line number column";
      };

      debounce = mkOption {
        type = nullOr bool;
        default = null;
        description = "Whether to enable suggestions debounce";
      };

      max_lines = mkOption {
        type = nullOr int;
        default = null;
        example = 10000;
        description = ''
          Maximum number of lines parsed from loaded buffers (current buffer always fully parsed).
          Set to `0` to disable parsing non-current buffers.
          Set to `-1` to parse all lines
        '';
      };

      silent = mkOption {
        type = nullOr bool;
        default = null;
        description = "Whether to disable non-important messages";
      };

      disable_in_special_buftypes = mkOption {
        type = nullOr bool;
        default = null;
        description = "Whether to disable suggestions in special buftypes like `nofile`";
      };

      log_level = mkOption {
        type = nullOr (enum [
          "trace"
          "debug"
          "info"
          "warn"
          "error"
        ]);
        default = null;
        example = "warn";
        description = "Log level";
      };

      single_line = {
        enabled = mkOption {
          type = nullOr bool;
          default = null;
          description = "Whether to enable single line mode. Multi-line suggestions collapse into a single line";
        };
        label = mkOption {
          type = nullOr str;
          default = null;
          example = "...";
          description = "Label indicating that there is multi-line suggestion";
        };
      };

      filter = mkOption {
        type = nullOr luaInline;
        default = null;
        description = ''
          Function that returns `true` if a buffer should be enabled and `false` if disabled.
          You can still enable disabled buffer with `:NeoCodeium enable_buffer`
        '';
      };

      filetypes = mkOption {
        type = nullOr (attrsOf bool);
        default = null;
        example = {
          help = false;
          gitcommit = false;
        };
        description = ''
          Filetypes to disable suggestions in.
          You can still enable disabled buffer with `:NeoCodeium enable_buffer`
        '';
      };

      root_dir = mkOption {
        type = nullOr (listOf str);
        default = null;
        example = [
          ".git"
          "package.json"
        ];
        description = "List of directories and files to detect workspace root directory for Windsurf Chat";
      };
    };

    keymaps = {
      accept = mkMappingOption "Accept suggestion" "<A-f>";
      accept_word = mkMappingOption "Accept word" "<A-w>";
      accept_line = mkMappingOption "Accept line" "<A-a>";
      cycle_or_complete = mkMappingOption "Cycle or complete" "<A-e>";
      cycle_or_complete_reverse = mkMappingOption "Cycle or complete (reverse)" "<A-r>";
      clear = mkMappingOption "Clear suggestion" "<A-c>";
    };
  };
}