{ lib, pkgs, config, ... }: let cfg = config.youthlic.programs.helix; defaultLanguagesSettings = config.programs.helix.package.passthru.languages.language; in { options = { youthlic.programs.helix = { enable = lib.mkEnableOption "helix"; languageSettings = lib.mkOption { type = lib.types.attrsOf (lib.types.submodule ({...}: { freeformType = lib.types.anything; options = { language-servers = lib.mkOption { type = lib.types.listOf (lib.types.either lib.types.str lib.types.anything); default = ["typos-lsp"]; example = ["rust-analyzer"]; apply = lib.unique; }; }; })); default = lib.pipe defaultLanguagesSettings [ (map (lang: lib.nameValuePair lang.name (lib.removeAttrs lang ["name"]))) lib.listToAttrs ]; apply = lib.mapAttrsToList (name: value: {inherit name;} // value); }; extraPackages = lib.mkOption { type = lib.types.listOf lib.types.package; default = []; example = ( with pkgs; [ deno ] ); description = '' extra packages for helix lsp and formatter ''; }; }; }; config = lib.mkMerge [ (lib.mkIf cfg.enable { programs.helix = { enable = true; defaultEditor = true; extraPackages = cfg.extraPackages; settings = ./config.toml |> builtins.readFile |> builtins.fromTOML; languages = lib.recursiveUpdate { language-server = { neocmakelsp = { command = "neocmakelsp"; args = [ "stdio" ]; }; fish-lsp = { command = "fish-lsp"; args = [ "start" ]; }; ty = { command = "ty"; args = [ "server" ]; }; typos-lsp = { command = "typos-lsp"; }; }; } {language = cfg.languageSettings;}; }; }) (lib.mkIf cfg.enable { youthlic.programs.helix.languageSettings = lib.pipe defaultLanguagesSettings [ (map ({name, ...}: lib.nameValuePair name {language-servers = ["typos-lsp"];})) lib.listToAttrs ]; }) (lib.mkIf cfg.enable { youthlic.programs.helix.languageSettings = lib.recursiveUpdate (lib.pipe defaultLanguagesSettings [(map (lang: lib.nameValuePair lang.name (lib.removeAttrs lang ["name"]))) lib.listToAttrs]) { cmake = { language-servers = [ "neocmakelsp" "cmake-language-server" ]; }; kdl = { formatter = { command = "kdlfmt"; args = [ "format" "-" ]; }; }; just = { formatter = { command = "just"; args = [ "--dump" ]; }; }; nix = { formatter = { command = "alejandra"; }; }; xml = { formatter = { command = "xmllint"; args = [ "--format" "-" ]; }; }; typst = { formatter = { command = "typstyle"; }; }; c = { formatter = { command = "clang-format"; }; }; cpp = { formatter = { command = "clang-format"; }; }; python = { formatter = { command = "ruff"; args = [ "format" "-s" "--line-length" "88" "-" ]; }; language-servers = [ "pyright" "ruff" "ty" ]; }; go = { formatter = { command = "goimports"; }; }; awk = { formatter = { command = "awk"; timeout = 5; args = [ "--file=/dev/stdin" "--pretty-print=/dev/stdout" ]; }; }; fish = { language-servers = [ "fish-lsp" ]; }; yaml = { formatter = { command = "deno"; args = [ "fmt" "-" "--ext" "yaml" ]; }; }; html = { formatter = { command = "deno"; args = [ "fmt" "-" "--ext" "html" ]; }; language-servers = [ "vscode-html-language-server" ]; }; css = { formatter = { command = "deno"; args = [ "fmt" "-" "--ext" "css" ]; }; language-servers = [ "vscode-css-language-server" ]; }; toml = { formatter = { command = "taplo"; args = [ "fmt" "-" ]; }; }; markdown = { formatter = { command = "deno"; args = [ "fmt" "-" "--ext" "md" ]; }; }; json = { language-servers = [ "vscode-json-language-server" ]; formatter = { command = "deno"; args = [ "fmt" "-" "--ext" "json" ]; }; }; jsonc = { language-servers = [ "vscode-json-language-server" ]; formatter = { command = "deno"; args = [ "fmt" "-" "--ext" "jsonc" ]; }; }; }; }) ]; }