{ lib, pkgs, sources, ... }: let inherit (lib.attrsets) mapAttrs' nameValuePair; helix = pkgs.helix.overrideAttrs ( finalAttrs: previousAttrs: { version = "25.07.2"; src = pkgs.fetchzip { url = "https://github.com/bloxx12/helix/releases/download/${finalAttrs.version}/helix-${finalAttrs.version}-source.tar.xz"; hash = "sha256-ZNsQwFfPXe6oewajx1tl68W60kVo7q2SuvTgy/o1HKk="; stripRoot = false; }; doInstallCheck = false; cargoDeps = pkgs.rustPlatform.fetchCargoVendor { inherit (helix) src; hash = "sha256-3poZSvIrkx8lguxxDeNfngW6+4hH8TV/LHcZx5W5aXg="; }; } ); helix-with-plugins = pkgs.helix.overrideAttrs ( finalAttrs: previousAttrs: { name = "helix-with-plugins"; version = "25.07.2"; src = pkgs.fetchzip { url = "https://github.com/bloxx12/helix/releases/download/${finalAttrs.version}/helix-${finalAttrs.version}-source.tar.xz"; hash = "sha256-ZNsQwFfPXe6oewajx1tl68W60kVo7q2SuvTgy/o1HKk="; stripRoot = false; }; doInstallCheck = false; cargoDeps = pkgs.rustPlatform.fetchCargoVendor { inherit (helix) src; hash = "sha256-3poZSvIrkx8lguxxDeNfngW6+4hH8TV/LHcZx5W5aXg="; }; postInstall = '' mv $out/bin/hx $out/bin/hxp ''; } ); toml = pkgs.formats.toml { }; languages = let inherit (lib.meta) getExe getExe'; nixfmt = pkgs.callPackage "${sources.nixfmt}/default.nix" { }; nil = pkgs.rustPlatform.buildRustPackage { pname = "nil"; version = "unstable"; src = sources.nil; cargoLock = { lockFile = "${sources.nil}/Cargo.lock"; allowBuiltinFetchGit = false; }; nativeBuildInputs = [ pkgs.nixVersions.latest ]; doInstallCheck = false; meta.mainProgram = "nil"; }; new-deadnix = pkgs.deadnix.overrideAttrs ( finalAttrs: previousAttrs: { version = "unstable-15-07-2025"; src = pkgs.fetchFromGitHub { owner = "astro"; repo = "deadnix"; rev = "d75457b95d7cfa82fcd60970939f76fccfce19e5"; hash = "sha256-O/z2neAXL8JNkGosvxC+DyZnnJ8zYP9XHApxHVmlzfY="; }; doInstallCheck = false; cargoDeps = pkgs.rustPlatform.fetchCargoVendor { inherit (new-deadnix) src; hash = "sha256-O8yhqyPflOvQXAA19k1XpbrHysgV5VNWLBX0l5Q5GkM="; }; meta.mainProgram = "nil"; } ); in { language = let mark = lang: { command = getExe pkgs.deno; args = [ "fmt" "-" "--ext" lang ]; }; in [ { name = "bash"; auto-format = true; formatter = { command = getExe pkgs.shfmt; args = [ "-i" "2" ]; }; } { name = "clojure"; injection-regex = "(clojure|clj|edn|boot|yuck)"; file-types = [ "clj" "cljs" "cljc" "clje" "cljr" "cljx" "edn" "boot" "yuck" ]; } { name = "cmake"; auto-format = true; language-servers = [ "cmake-language-server" ]; formatter = { command = getExe pkgs.cmake-format; args = [ "-" ]; }; } { name = "javascript"; auto-format = true; language-servers = [ "dprint" "typescript-language-server" ]; } { name = "json"; formatter = mark "json"; } { name = "markdown"; auto-format = true; formatter = mark "md"; language-servers = [ "taplo" ]; } { name = "nix"; language-servers = [ "nil" ]; } { name = "qml"; language-servers = [ "qmlls" ]; } { name = "python"; auto-format = true; language-servers = [ "basedpyright" "ruff" ]; } { name = "typescript"; auto-format = true; language-servers = [ "dprint" "typescript-language-server" ]; } { name = "rust"; } { name = "c"; auto-format = true; language-servers = [ "clangd" ]; } { name = "zig"; auto-format = true; } { name = "c"; } ]; language-server = { bash-language-server = { command = getExe pkgs.bash-language-server; args = [ "start" ]; }; rust-analyzer = { command = getExe pkgs.rust-analyzer; config.rust-analyzer = { checkOnSave.command = "clippy"; procMacro.enable = true; cargo = { loadOutDirsFromCheck = true; features = "all"; }; assist = { preferSelf = true; }; check = { command = "clippy"; extraArgs = [ "--" "-W" "clippy::pedantic" "-W" "clippy::nursery" "-W" "clippy::perf" ]; }; lens = { references = true; methodReferences = true; }; completion.autoimport.enable = true; experimental.procAttrMacros = true; interpret.tests = true; }; }; clangd = { command = "${pkgs.clang-tools}/bin/clangd"; clangd.fallbackFlags = [ "-std=c++2b" ]; }; cmake-language-server = { command = getExe pkgs.cmake-language-server; }; deno-lsp = { command = getExe pkgs.deno; args = [ "lsp" ]; environment.NO_COLOR = "1"; config.deno = { enable = true; lint = true; unstable = true; suggest = { completeFunctionCalls = false; imports = { hosts."https://deno.land" = true; }; }; inlayHints = { enumMemberValues.enabled = true; functionLikeReturnTypes.enabled = true; parameterNames.enabled = "all"; parameterTypes.enabled = true; propertyDeclarationTypes.enabled = true; variableTypes.enabled = true; }; }; }; dprint = { command = getExe pkgs.dprint; args = [ "lsp" ]; }; nil = { command = getExe nil; config.nil = { formatting.command = [ "${getExe nixfmt}" ]; diagnostics = { bindingEndHintMinLines = 3; }; nix.flake = { autoArchive = true; # autoEvalInputs = true; nixpkgsInputName = "nixpkgs"; }; }; }; deadnix = { command = getExe new-deadnix; }; typescript-language-server = { command = getExe pkgs.typescript-language-server; args = [ "--stdio" ]; config = { typescript-language-server.source = { addMissingImports.ts = true; fixAll.ts = true; organizeImports.ts = true; removeUnusedImports.ts = true; sortImports.ts = true; }; }; }; ruff = { command = getExe pkgs.ruff; args = [ "server" ]; }; qmlls = { command = getExe' pkgs.kdePackages.qtdeclarative "qmlls"; args = [ "-E" ]; }; basedpyright.command = "${pkgs.basedpyright}/bin/basedpyright-langserver"; vscode-css-language-server = { command = "${pkgs.vscode-langservers-extracted}/bin/vscode-css-language-server"; args = [ "--stdio" ]; config = { provideFormatter = true; css.validate.enable = true; scss.validate.enable = true; }; }; zls = { command = getExe pkgs.zls; config = { enable_build_on_save = true; build_on_save_args = [ "check" "-fincremental" "--watch" ]; enable_autofix = false; warn_style = true; highlight_global_var_declarations = true; }; }; }; }; themes = { rose_pine_transparent = { inherits = "rose_pine"; "ui.background" = { }; }; rose_pine_dawn_transparent = { inherits = "rose_pine_dawn"; "ui.background" = { }; }; nightfox_transparent = { inherits = "nightfox"; "ui.background" = { }; }; nord_transparent = { inherits = "nord"; "ui.background" = { }; }; }; settings = { theme = "nord"; editor = { cursorline = true; color-modes = true; true-color = true; indent-guides.render = true; lsp = { enable = true; auto-signature-help = true; display-inlay-hints = false; display-messages = true; snippets = true; }; file-picker = { hidden = true; }; line-number = "relative"; auto-format = true; completion-timeout = 5; mouse = true; bufferline = "multiple"; soft-wrap.enable = true; word-completion = { enable = true; trigger-length = 2; }; cursor-shape = { insert = "bar"; normal = "block"; select = "underline"; }; statusline = { left = [ "spinner" "version-control" "diagnostics" "file-name" ]; right = [ "file-base-name" "file-type" "position" "file-encoding" ]; }; gutters.layout = [ "diff" "diagnostics" "line-numbers" "spacer" ]; inline-diagnostics = { cursor-line = "hint"; other-lines = "error"; }; }; keys = { normal = { space = { g = [ ":new" ":buffer-close!" ":redraw" ]; i = ":toggle lsp.display-inlay-hints"; }; esc = [ "collapse_selection" "keep_primary_selection" "normal_mode" ]; A-H = "goto_previous_buffer"; A-L = "goto_next_buffer"; A-w = ":buffer-close"; A-f = ":format"; A-r = ":reload"; A-x = "extend_to_line_bounds"; X = [ "extend_line_up" "extend_to_line_bounds" ]; ";" = "flip_selections"; "A-;" = "collapse_selection"; # Kakoune-like config H = "extend_char_left"; J = "extend_line_down"; K = "extend_line_up"; L = "extend_char_right"; }; select = { A-x = "extend_to_line_bounds"; X = [ "extend_line_up" "extend_to_line_bounds" ]; g = { e = "goto_file_end"; }; }; }; }; in { packages = builtins.attrValues { inherit helix; inherit (pkgs) tinymist taplo kdlfmt gopls ; }; files = { ".config/helix/config.toml".source = toml.generate "helix-config.toml" settings; ".config/helix/languages.toml".source = toml.generate "helix-languages.toml" languages; } // mapAttrs' ( name: value: nameValuePair ".config/helix/themes/${name}.toml" { source = toml.generate "helix-theme-${name}.toml" value; } ) themes; }