{ inputs, ... }: { flake.modules.nixos.helix = { nix.settings = { extra-substituters = [ "https://helix.cachix.org" ]; extra-trusted-public-keys = [ "helix.cachix.org-1:ejp9KQpR1FBI2onstMQ34yogDm4OgU2ru6lIwPvuCVs=" ]; }; }; flake.modules.homeManager.helix = { pkgs, ... }: let svelteLanguageServer = pkgs.svelte-language-server.overrideAttrs ( finalAttrs: previousAttrs: { version = "0.18.3"; pnpmWorkspaces = [ "svelte-language-server..." "typescript-svelte-plugin..." ]; src = pkgs.fetchFromGitHub { owner = "sveltejs"; repo = "language-tools"; tag = "svelte-language-server@${finalAttrs.version}"; hash = "sha256-FTOkJPXbsG6R53yr4n0/IR2lzFCovrdV0+epOi07lBQ="; }; pnpmDeps = pkgs.fetchPnpmDeps { inherit (finalAttrs) pname version src pnpmWorkspaces ; pnpm = pkgs.pnpm_10; fetcherVersion = 3; hash = "sha256-fY3hrCkr/soJk1gp39/jec8lT2ZJI27xRBCZi006oWA="; }; buildPhase = builtins.replaceStrings [ "pnpm run --filter=svelte-language-server... build" ] [ '' pnpm run --filter=svelte-language-server... build pnpm --filter=typescript-svelte-plugin exec tsc \ -p ./ \ --pretty false \ --types node \ --typeRoots ../../node_modules/.pnpm/node_modules/@types '' ] previousAttrs.buildPhase; installPhase = builtins.replaceStrings [ "pnpm install --filter=svelte-language-server..." ] [ "pnpm install --filter=svelte-language-server... --filter=typescript-svelte-plugin..." ] previousAttrs.installPhase; postInstall = (previousAttrs.postInstall or "") + '' 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'," ln -s ../packages/typescript-plugin \ "$out/lib/node_modules/svelte-language-server/node_modules/typescript-svelte-plugin" ln -s ../packages/language-server/node_modules/svelte \ "$out/lib/node_modules/svelte-language-server/node_modules/svelte" ''; } ); in { programs.helix = { enable = true; defaultEditor = 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 ]; 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; tsserver.globalPlugins = [ { name = "typescript-svelte-plugin"; location = "${svelteLanguageServer}/lib/node_modules/svelte-language-server"; enableForWorkspaceTypeScriptVersions = 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; } ]; }; }; }; }