/ modules / programs / helix.nix
helix.nix
  1  {
  2    pkgs,
  3    inputs,
  4    lib,
  5    ...
  6  }: {
  7    inputs.helix.url = "github:helix-editor/helix";
  8  
  9    hm = {
 10      home.sessionVariables.EDITOR = "hx";
 11  
 12      home.packages = with pkgs; [
 13        nodePackages.vscode-css-languageserver-bin
 14        nodePackages.vscode-langservers-extracted
 15        nodePackages.prettier
 16      ];
 17      programs.helix = {
 18        enable = true;
 19  
 20        defaultEditor = true;
 21  
 22        package = inputs.helix.packages.${pkgs.system}.default.overrideAttrs (self: {
 23          makeWrapperArgs = with pkgs;
 24            self.makeWrapperArgs
 25            or []
 26            ++ [
 27              "--suffix"
 28              "PATH"
 29              ":"
 30              (lib.makeBinPath [
 31                clang-tools
 32                markdown-oxide
 33                ltex-ls
 34                nil
 35                luajitPackages.lua-lsp
 36                nodePackages.bash-language-server
 37                nodePackages.vscode-css-languageserver-bin
 38                nodePackages.vscode-langservers-extracted
 39                nodePackages.prettier
 40                rustfmt
 41                rust-analyzer
 42                black
 43                alejandra
 44                shellcheck
 45                zig
 46                zls
 47                # kdePackages.qtdeclarative
 48              ])
 49            ];
 50        });
 51  
 52        settings = {
 53          theme = "oxocarbon";
 54          # icons = "nerdfonts";
 55  
 56          editor = {
 57            true-color = true;
 58            cursorline = true;
 59            mouse = false;
 60            completion-replace = true;
 61            auto-format = true;
 62            auto-save = true;
 63            auto-info = true;
 64            color-modes = true;
 65            idle-timeout = 250;
 66            indent-guides.render = true;
 67            rulers = [100];
 68            cursor-shape = {
 69              insert = "bar";
 70              select = "block";
 71              normal = "block";
 72            };
 73            lsp = {
 74              display-inlay-hints = true;
 75              display-messages = true;
 76            };
 77          };
 78  
 79          # cursor-shape = {
 80          #   insert = "bar";
 81          # };
 82        };
 83  
 84        themes = {
 85          oxocarbon = let
 86            base00 = "#161616";
 87            base01 = "#262626";
 88            base02 = "#393939";
 89            base03 = "#525252";
 90            base04 = "#dde1e6";
 91            base05 = "#f2f4f8";
 92            base06 = "#ffffff";
 93            base07 = "#08bdba";
 94            base08 = "#3ddbd9";
 95            base09 = "#be95ff";
 96            base0A = "#ee5396";
 97            base0B = "#33b1ff";
 98            base0C = "#ff7eb6";
 99            base0D = "#42be65";
100            base0E = "#78a9ff";
101            base0F = "#82cfff";
102          in {
103            "ui.background" = {bg = base00;};
104            "ui.virtual.whitespace" = base03;
105            "ui.menu" = {
106              fg = base05;
107              bg = base01;
108            };
109            "ui.menu.selected" = {
110              fg = base01;
111              bg = base04;
112            };
113            "ui.linenr" = {
114              fg = base03;
115              bg = base00;
116            };
117            "ui.popup" = {bg = base01;};
118            "ui.window" = {bg = base01;};
119            "ui.linenr.selected" = {
120              fg = base04;
121              bg = base01;
122              modifiers = ["bold"];
123            };
124            "ui.selection" = {bg = base02;};
125            "comment" = {
126              fg = base03;
127              modifiers = ["italic"];
128            };
129            "ui.statusline" = {
130              fg = base04;
131              bg = base01;
132            };
133            "ui.cursor" = {
134              fg = base04;
135              modifiers = ["reversed"];
136            };
137            "ui.cursor.primary" = {
138              fg = base05;
139              modifiers = ["reversed"];
140            };
141            "ui.text" = base05;
142            "operator" = base0B;
143            "ui.text.focus" = base05;
144            "variable" = base04;
145            "constant.numeric" = base09;
146            "constant" = base09;
147            "attribute" = base09;
148            "type" = base07;
149            "ui.cursor.match" = {
150              fg = base0A;
151              modifiers = ["underlined"];
152            };
153            "string" = base09;
154            "variable.other.member" = base04;
155            "constant.character.escape" = base0C;
156            "function" = base0A;
157            "constructor" = base0D;
158            "special" = base0D;
159            "keyword" = base0E;
160            "label" = base08;
161            "namespace" = base0E;
162            "punctuation" = base08;
163            "ui.help" = {
164              fg = base06;
165              bg = base01;
166            };
167  
168            "markup.heading" = base0D;
169            "markup.list" = base08;
170            "markup.bold" = {
171              fg = base0A;
172              modifiers = ["bold"];
173            };
174            "markup.italic" = {
175              fg = base0E;
176              modifiers = ["italic"];
177            };
178            "markup.link.url" = {
179              fg = base09;
180              modifiers = ["underlined"];
181            };
182            "markup.link.text" = base08;
183            "markup.quote" = base0C;
184            "markup.raw" = base0B;
185  
186            "diff.plus" = base0B;
187            "diff.delta" = base09;
188            "diff.minus" = base08;
189  
190            "diagnostic" = {
191              modifiers = ["underlined"];
192              underline = {
193                color = base0A;
194                style = "curl";
195              };
196            };
197            "ui.gutter" = {bg = base00;};
198            "info" = base0D;
199            "hint" = base03;
200            "debug" = base03;
201            "warning" = base09;
202            "error" = base0A;
203  
204            "ui.bufferline" = {
205              fg = base04;
206              bg = base00;
207            };
208            "ui.bufferline.active" = {
209              fg = base06;
210              bg = base01;
211            };
212          };
213        };
214  
215        languages = {
216          language = let
217            withLangServers = lang: servers:
218              lang
219              // {
220                language-servers = (lang.language-servers or []) ++ servers;
221              };
222            mkPrettier = name: ext: {
223              inherit name;
224              auto-format = true;
225              formatter = {
226                command = "${pkgs.prettierd}/bin/prettierd";
227                args = ["file.${ext}"];
228              };
229            };
230          in [
231            # {
232            # name = "markdown";
233            # auto-format = true;
234            # language-servers = ["markdown-oxide" "ltex-ls"];
235            # }
236  
237            {
238              name = "nix";
239              auto-format = true;
240              formatter = {command = lib.getExe pkgs.alejandra;};
241              roots = ["flake.nix"];
242            }
243            {
244              name = "html";
245              auto-format = true;
246              language-servers = ["emmet-ls" "vscode-html-server"];
247            }
248            (withLangServers (mkPrettier "markdown" "md") ["markdown-oxide" "emmet-ls" "ltex-ls"])
249          ];
250  
251          language-server = {
252            ltex-ls = {
253              command = lib.getExe pkgs.ltex-ls;
254            };
255            emmet-ls = {
256              command = lib.getExe pkgs.emmet-language-server;
257              args = ["--stdio"];
258            };
259            markdown-oxide = {
260              command = lib.getExe pkgs.markdown-oxide;
261            };
262            #stolen from n3oney
263            typescript-language-server = {
264              command = lib.getExe pkgs.nodePackages.typescript-language-server;
265              args = ["--stdio"];
266              config.hostInfo = "helix";
267              config.documentFormatting = false;
268            };
269  
270            vscode-langservers-extracted = {
271              command = lib.getExe pkgs.nodePackages.vscode-langservers-extracted;
272            };
273  
274            vscode-css-language-server = {
275              command = lib.getExe pkgs.nodePackages.vscode-css-languageserver-bin;
276              args = ["--stdio"];
277              config.provideFormatter = true;
278            };
279  
280            vscode-html-language-server = {
281              command = lib.getExe pkgs.nodePackages.vscode-html-languageserver-bin;
282              args = ["--stdio"];
283            };
284            zig-language-server = {
285              command = lib.getExe pkgs.zls;
286            };
287  
288            # qml-lamguage-server = {
289            # command = lib.getExe pkgs.kdePackages.qtdeclarative;
290            # args = ["--stdio"];
291            # conifg.provideFormatter = true;
292            # };
293  
294            nil = {
295              command = lib.getExe pkgs.nil;
296              config.nil.formatting.command = ["${lib.getExe pkgs.alejandra}" "-q"];
297            };
298          };
299        };
300      };
301    };
302  }