{ config, inputs, ... }: let homeModules = config.flake.modules.homeManager; in { flake.modules.nixos.helix-cache = { nix.settings = { extra-substituters = [ "https://helix.cachix.org" ]; extra-trusted-public-keys = [ "helix.cachix.org-1:ejp9KQpR1FBI2onstMQ34yogDm4OgU2ru6lIwPvuCVs=" ]; }; }; flake.modules.homeManager.helix = { pkgs, ... }: let svelteLanguageServer = (import ./_svelte-language-server.nix { inherit pkgs; }).overrideAttrs ( _: previousAttrs: { postInstall = (previousAttrs.postInstall or "") + '' # @vscode/emmet-helper only enables JSX expansion for JSX syntax; # Helix's Svelte HTML regions also need it for HTML syntax. substituteInPlace \ "$out/lib/node_modules/svelte-language-server/packages/language-server/node_modules/@vscode/emmet-helper/lib/cjs/emmetHelper.js" \ --replace-fail \ "'jsx.enabled': syntax === 'jsx'," \ "'jsx.enabled': syntax === 'jsx' || syntax === 'html'," ''; } ); in { programs.helix = { enable = true; package = inputs.helix.packages.${pkgs.stdenv.hostPlatform.system}.default; extraPackages = with pkgs; [ vtsls svelteLanguageServer tailwindcss-language-server nixd nixfmt oxfmt simple-completion-language-server odin ols rust-analyzer rustfmt cargo zig zls lldb ]; settings = { theme = "kanagawa-custom"; editor = { soft-wrap.enable = true; lsp = { auto-document-highlight = true; display-inlay-hints = false; }; rainbow-brackets = true; line-number = "relative"; cursorline = true; gutters = [ "code-action-hint" "diagnostics" "spacer" "line-numbers" "spacer" "diff" ]; color-modes = true; cursor-shape = { insert = "bar"; normal = "block"; select = "underline"; }; }; }; themes.kanagawa-custom = { inherits = "kanagawa"; "ui.highlight".underline = { color = "dragonBlue"; style = "line"; }; }; languages = { language-server.scls = { command = "simple-completion-language-server"; environment.SNIPPETS_PATH = "${pkgs.vimPlugins.friendly-snippets}/snippets"; }; language-server.vtsls.config.vtsls.autoUseWorkspaceTsdk = true; language = [ { name = "javascript"; language-servers = [ "vtsls" "scls" ]; auto-format = true; } { name = "jsx"; language-servers = [ "vtsls" "scls" ]; auto-format = true; } { name = "typescript"; language-servers = [ "vtsls" "scls" ]; auto-format = true; } { name = "tsx"; language-servers = [ "vtsls" "scls" ]; auto-format = true; } { name = "svelte"; formatter = { command = "${pkgs.coreutils}/bin/env"; args = [ "NODE_PATH=%{workspace_directory}/node_modules" "oxfmt" "--stdin-filepath=%{buffer_name}" ]; }; auto-format = true; language-servers = [ "scls" "svelteserver" "tailwindcss-ls" ]; } { name = "nix"; auto-format = true; } { name = "rust"; auto-format = true; } ]; }; }; }; flake.modules.homeManager.primary-editor-helix = { imports = [ homeModules.helix ]; programs.helix.defaultEditor = true; }; }