From cefdf3bc5d4edfd05757c648000707ecc4f8bbf7 Mon Sep 17 00:00:00 2001 From: Ethan Reece Date: Wed, 9 Jul 2025 22:51:16 -0500 Subject: [PATCH] Separate each language into its own file --- README.md | 2 +- flake.nix | 173 +++++++---------------------------------- languages/en-us.nix | 28 +++++++ languages/markdown.nix | 33 ++++++++ languages/nix.nix | 26 +++++++ languages/toml.nix | 23 ++++++ languages/yaml.nix | 26 +++++++ 7 files changed, 163 insertions(+), 148 deletions(-) create mode 100644 languages/en-us.nix create mode 100644 languages/markdown.nix create mode 100644 languages/nix.nix create mode 100644 languages/toml.nix create mode 100644 languages/yaml.nix diff --git a/README.md b/README.md index cd152aa..7448c0a 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,6 @@ This repository has the Nix home-manager configuration for my laptop, allowing m - **`flake-parts`** - Makes the Flake modular and reusable - **`sops`** - Encrypts secrets - **`treefmt`** (with Helix integration) - Automatically formats this repository when modifying it, with features to check the flake for formatting consistency -- **Language Server Protocol (LSP)** - Has language servers for file formats used in this repository; integrates with Helix text editor and fully managed by Nix +- **Language Server Protocol (LSP)** - Has language servers for file formats used in this repository; integrates with Helix text editor and fully managed by Nix with each language's configuration in its own file - **AI** - Uses Nix home-manager integrations for Codex and `aichat` for querying Large Language Models (LLMs) in the CLI and in Git repositories - **Language tools** - Checks for grammatical and styling issues using Vale, Harper, LTeX, and Typos diff --git a/flake.nix b/flake.nix index ececfb5..45ed0cb 100644 --- a/flake.nix +++ b/flake.nix @@ -68,107 +68,30 @@ ]; }; treefmt = config.treefmt.build.wrapper; + langDir = ./languages; + langFiles = builtins.attrNames (builtins.readDir langDir); + nixFiles = builtins.filter (name: builtins.match ".*\\.nix" name != null) langFiles; + configs = map (file: import (langDir + "/${file}") { inherit pkgs treefmt; }) nixFiles; helixLanguages = { - language = [ - { - name = "markdown"; - language-servers = [ - "marksman" - "ltex-ls-plus" - "vale-ls" - ]; - formatter = { - command = "${treefmt}/bin/treefmt"; - args = [ - "--stdin" - ".md" - "--quiet" - ]; - }; - auto-format = true; - } - { - name = "nix"; - language-servers = [ - "nil" - "harper-ls" - ]; - formatter = { - command = "${treefmt}/bin/treefmt"; - args = [ - "--stdin" - ".nix" - "--quiet" - ]; - }; - auto-format = true; - } - { - name = "toml"; - language-servers = [ - "taplo" - "harper-ls" - ]; - formatter = { - command = "${treefmt}/bin/treefmt"; - args = [ - "--stdin" - ".toml" - "--quiet" - ]; - }; - auto-format = true; - } - { - name = "yaml"; - language-servers = [ - "yaml-language-server" - "harper-ls" - ]; - formatter = { - command = "${treefmt}/bin/treefmt"; - args = [ - "--stdin" - ".yaml" - "--quiet" - ]; - }; - auto-format = true; - } - ]; - language-server = { - ltex-ls-plus = { - command = "${pkgs.ltex-ls-plus}/bin/ltex-ls-plus"; - config = { - ltex.dictionary = { - en-US = [ - "Asahi" - "LLMs" - "LTeX" - ]; - }; - }; - }; - marksman = { - command = "${pkgs.marksman}/bin/marksman"; - }; - harper-ls = { - command = "${pkgs.harper}/bin/harper-ls"; - }; - nil = { - command = "${pkgs.nil}/bin/nil"; - }; - taplo = { - command = "${pkgs.taplo}/bin/taplo"; - }; - vale-ls = { - command = "${pkgs.vale-ls}/bin/vale-ls"; - }; - yaml-language-server = { - command = "${pkgs.yaml-language-server}/bin/yaml-language-server"; - }; - }; + language = map (cfg: cfg.helix.language) ( + (builtins.filter (cfg: builtins.hasAttr "language" cfg.helix) ( + builtins.filter (cfg: builtins.hasAttr "helix" cfg) configs + )) + ); + language-server = builtins.foldl' (acc: cfg: acc // (cfg.helix.language-server or { })) { } configs; }; + treefmtPrograms = builtins.foldl' (acc: cfg: acc // (cfg.treefmt.programs or { })) { } configs; + preCommitHooks = builtins.foldl' (acc: cfg: acc // (cfg.pre-commit or { })) { } configs; + devshellCommands = builtins.concatMap (cfg: cfg.devshell.commands) ( + (builtins.filter (cfg: builtins.hasAttr "commands" cfg.devshell) ( + builtins.filter (cfg: builtins.hasAttr "devshell" cfg) configs + )) + ); + devshellPackages = builtins.concatMap (cfg: cfg.devshell.packages) ( + (builtins.filter (cfg: builtins.hasAttr "packages" cfg.devshell) ( + builtins.filter (cfg: builtins.hasAttr "devshell" cfg) configs + )) + ); helixLanguagesFormat = pkgs.formats.toml { }; helixLanguagesFile = helixLanguagesFormat.generate "languages.toml" helixLanguages; in @@ -201,11 +124,6 @@ name = "_helix-grammars"; command = "${pkgs.helix}/bin/hx --grammar fetch && hx --grammar build"; } - { - help = "sync vale configuration"; - name = "vale-sync"; - command = "${pkgs.vale}/bin/vale sync"; - } { help = "generate age key"; name = "_age-generate-key"; @@ -216,7 +134,7 @@ name = "sops-edit"; command = "${pkgs.sops}/bin/sops edit ./home/secrets/secrets.yaml"; } - ]; + ] ++ devshellCommands; packages = [ pkgs.age pkgs.forgejo-cli @@ -228,8 +146,7 @@ pkgs.man pkgs.sops pkgs.uutils-coreutils-noprefix - pkgs.vale - ]; + ] ++ devshellPackages; devshell = { motd = '' {202}🔨 Nix Laptop Configuration{reset} @@ -247,49 +164,11 @@ }; }; pre-commit.settings = { - hooks = { - markdownlint = { - enable = true; - }; - vale = { - enable = true; - }; - treefmt = { - enable = true; - }; - }; + hooks = preCommitHooks; }; treefmt = { projectRootFile = "flake.nix"; - programs = { - nixfmt = { - enable = true; - strict = true; - }; - dprint = { - enable = true; - settings = { - plugins = ( - pkgs.dprint-plugins.getPluginList ( - plugins: with plugins; [ - dprint-plugin-markdown - g-plane-pretty_yaml - ] - ) - ); - }; - }; - taplo = { - enable = true; - }; - typos = { - enable = true; - locale = "en-us"; - }; - }; - settings.global = { - excludes = [ ".vale/*" ]; - }; + programs = treefmtPrograms; }; }; } diff --git a/languages/en-us.nix b/languages/en-us.nix new file mode 100644 index 0000000..b1af32c --- /dev/null +++ b/languages/en-us.nix @@ -0,0 +1,28 @@ +{ pkgs, treefmt }: +{ + helix.language-server = { + ltex-ls-plus = { + command = "${pkgs.ltex-ls-plus}/bin/ltex-ls-plus"; + config.ltex.dictionary.en-US = [ + "Asahi" + "LLMs" + "LTeX" + ]; + }; + vale-ls.command = "${pkgs.vale-ls}/bin/vale-ls"; + }; + treefmt.programs.typos = { + enable = true; + locale = "en-us"; + }; + devshell = { + commands = [ + { + help = "sync vale configuration"; + name = "vale-sync"; + command = "${pkgs.vale}/bin/vale sync"; + } + ]; + packages = [ pkgs.vale ]; + }; +} diff --git a/languages/markdown.nix b/languages/markdown.nix new file mode 100644 index 0000000..0dc2021 --- /dev/null +++ b/languages/markdown.nix @@ -0,0 +1,33 @@ +{ pkgs, treefmt }: +{ + helix = { + language = { + name = "markdown"; + language-servers = [ + "marksman" + "ltex-ls-plus" + "vale-ls" + ]; + formatter = { + command = "${treefmt}/bin/treefmt"; + args = [ + "--stdin" + ".md" + "--quiet" + ]; + }; + auto-format = true; + }; + language-server = { + marksman.command = "${pkgs.marksman}/bin/marksman"; + }; + }; + treefmt.programs.dprint = { + enable = true; + settings.plugins = [ "dprint-plugin-markdown" ]; + }; + pre-commit = { + markdownlint.enable = true; + vale.enable = true; + }; +} diff --git a/languages/nix.nix b/languages/nix.nix new file mode 100644 index 0000000..d34937c --- /dev/null +++ b/languages/nix.nix @@ -0,0 +1,26 @@ +{ pkgs, treefmt }: +{ + helix = { + language = { + name = "nix"; + language-servers = [ + "nil" + "harper-ls" + ]; + formatter = { + command = "${treefmt}/bin/treefmt"; + args = [ + "--stdin" + ".nix" + "--quiet" + ]; + }; + auto-format = true; + }; + language-server.nil.command = "${pkgs.nil}/bin/nil"; + }; + treefmt.programs.nixfmt = { + enable = true; + strict = true; + }; +} diff --git a/languages/toml.nix b/languages/toml.nix new file mode 100644 index 0000000..9a059a1 --- /dev/null +++ b/languages/toml.nix @@ -0,0 +1,23 @@ +{ pkgs, treefmt }: +{ + helix = { + language = { + name = "toml"; + language-servers = [ + "taplo" + "harper-ls" + ]; + formatter = { + command = "${treefmt}/bin/treefmt"; + args = [ + "--stdin" + ".toml" + "--quiet" + ]; + }; + auto-format = true; + }; + language-server.taplo.command = "${pkgs.taplo}/bin/taplo"; + }; + treefmt.programs.taplo.enable = true; +} diff --git a/languages/yaml.nix b/languages/yaml.nix new file mode 100644 index 0000000..75c306b --- /dev/null +++ b/languages/yaml.nix @@ -0,0 +1,26 @@ +{ pkgs, treefmt }: +{ + helix = { + language = { + name = "yaml"; + language-servers = [ + "yaml-language-server" + "harper-ls" + ]; + formatter = { + command = "${treefmt}/bin/treefmt"; + args = [ + "--stdin" + ".yaml" + "--quiet" + ]; + }; + auto-format = true; + }; + language-server.yaml-language-server.command = "${pkgs.yaml-language-server}/bin/yaml-language-server"; + }; + treefmt.programs.dprint = { + enable = true; + settings.plugins = [ "g-plane-pretty_yaml" ]; + }; +}