diff --git a/home/hosts/andromache/default.nix b/home/hosts/andromache/default.nix index 050e904..f5da9fe 100644 --- a/home/hosts/andromache/default.nix +++ b/home/hosts/andromache/default.nix @@ -31,6 +31,7 @@ desktop.niri.enable = true; devenv.enable = true; direnv.enable = true; + docker.enable = true; gaming.enable = true; git = { enable = true; diff --git a/home/hosts/astyanax/default.nix b/home/hosts/astyanax/default.nix index 229a899..aff4e3e 100644 --- a/home/hosts/astyanax/default.nix +++ b/home/hosts/astyanax/default.nix @@ -30,6 +30,7 @@ desktop.niri.enable = true; devenv.enable = true; direnv.enable = true; + docker.enable = true; git = { enable = true; gitea.enable = true; diff --git a/home/modules/3d/modeling.nix b/home/modules/3d/modeling.nix index 9207635..9330468 100644 --- a/home/modules/3d/modeling.nix +++ b/home/modules/3d/modeling.nix @@ -13,7 +13,6 @@ blender ] ++ lib.optionals config.modules."3d".modeling.openscad.enable [ - openscad-lsp openscad-unstable ]; }; diff --git a/home/modules/go/default.nix b/home/modules/go/default.nix index 49a4816..a2f1ffc 100644 --- a/home/modules/go/default.nix +++ b/home/modules/go/default.nix @@ -13,10 +13,7 @@ config = lib.mkIf config.go.enable { home = { sessionVariables.GOPATH = "${config.xdg.dataHome}/go"; - packages = with pkgs; [ - go - gopls - ]; + packages = with pkgs; [ go ]; }; }; } diff --git a/home/modules/nvim/config/after/plugin/conform.lua b/home/modules/nvim/config/after/plugin/conform.lua index 1fbadfb..5193f2a 100644 --- a/home/modules/nvim/config/after/plugin/conform.lua +++ b/home/modules/nvim/config/after/plugin/conform.lua @@ -10,6 +10,7 @@ require("conform").setup({ cpp = { "clang-format" }, css = { "prettierd", "prettier", stop_after_first = true }, gdscript = { "gdformat" }, + go = { "gofmt" }, haskell = { "ormolu" }, html = { "prettierd", "prettier", stop_after_first = true }, javascript = { "eslint_d", "eslint", "prettierd", "prettier", stop_after_first = true }, diff --git a/home/modules/nvim/config/after/plugin/lspconfig.lua b/home/modules/nvim/config/after/plugin/lspconfig.lua index 92fce1d..ff167ae 100644 --- a/home/modules/nvim/config/after/plugin/lspconfig.lua +++ b/home/modules/nvim/config/after/plugin/lspconfig.lua @@ -4,159 +4,185 @@ local cmp_nvim_lsp = require("cmp_nvim_lsp") local capabilities = cmp_nvim_lsp.default_capabilities() local servers = { - bashls = {}, - eslint = { - settings = { - --Assuming prettier/prettierd will handle formatting, we don't need to see these errors - rulesCustomizations = { - { rule = "prettier/prettier", severity = "off" }, - }, - format = false, + c = { clangd = {} }, + docker = { dockerls = {} }, + gdscript = { gdscript = {} }, + go = { gopls = {} }, + haskell = { hls = { filetypes = { "haskell", "lhaskell", "cabal" } } }, + helm = { + helm_ls = { + filetypes = { "helm", "yaml.helm-values" }, }, }, - emmet_language_server = {}, - gdscript = {}, - helm_ls = { - filetypes = { "helm", "yaml.helm-values" }, + html = { + emmet_language_server = {}, + html = {}, }, - hls = { filetypes = { "haskell", "lhaskell", "cabal" } }, - html = {}, - jsonls = { - settings = { - json = { - schemas = require("schemastore").json.schemas(), - validate = { enable = true }, + json = { + jsonls = { + settings = { + json = { + schemas = require("schemastore").json.schemas(), + validate = { enable = true }, + }, }, }, }, - lua_ls = { - on_init = function(client) - if client.workspace_folders then - local path = client.workspace_folders[1].name - if - path ~= vim.fn.stdpath("config") - and (vim.uv.fs_stat(path .. "/.luarc.json") or vim.uv.fs_stat(path .. "/.luarc.jsonc")) - then - return + lua = { + lua_ls = { + on_init = function(client) + if client.workspace_folders then + local path = client.workspace_folders[1].name + if + path ~= vim.fn.stdpath("config") + and (vim.uv.fs_stat(path .. "/.luarc.json") or vim.uv.fs_stat(path .. "/.luarc.jsonc")) + then + return + end end - end - client.config.settings.Lua = vim.tbl_deep_extend("force", client.config.settings.Lua, { - runtime = { - version = "LuaJIT", - path = { - "lua/?.lua", - "lua/?/init.lua", + client.config.settings.Lua = vim.tbl_deep_extend("force", client.config.settings.Lua, { + runtime = { + version = "LuaJIT", + path = { + "lua/?.lua", + "lua/?/init.lua", + }, }, - }, - workspace = { - checkThirdParty = false, - library = { - vim.env.VIMRUNTIME, + workspace = { + checkThirdParty = false, + library = { + vim.env.VIMRUNTIME, + }, }, - }, - }) - end, - settings = { - Lua = {}, + }) + end, + settings = { + Lua = {}, + }, }, }, - nixd = { - settings = { - nixd = { - nixpkgs = { - expr = "import { }", - expr = 'import (builtins.getFlake ("git+file://" + toString ../../../../../.)).inputs.nixpkgs { }', + nix = { + nixd = { + settings = { + nixd = { + nixpkgs = { + expr = "import { }", + expr = 'import (builtins.getFlake ("git+file://" + toString ../../../../../.)).inputs.nixpkgs { }', + }, }, - }, - options = { - nixos = { - expr = '(builtins.getFlake ("git+file://" + toString ../../../../../.)).nixosConfigurations."' - .. vim.fn.hostname() - .. '".options', - }, - home_manager = { - expr = '(builtins.getFlake ("git+file://" + toString ../../../../../.)).homeConfigurations."' - .. vim.fn.expand("$USER") - .. "@" - .. vim.fn.hostname() - .. '".options', + options = { + nixos = { + expr = '(builtins.getFlake ("git+file://" + toString ../../../../../.)).nixosConfigurations."' + .. vim.fn.hostname() + .. '".options', + }, + home_manager = { + expr = '(builtins.getFlake ("git+file://" + toString ../../../../../.)).homeConfigurations."' + .. vim.fn.expand("$USER") + .. "@" + .. vim.fn.hostname() + .. '".options', + }, }, }, }, }, - openscad_ls = {}, - pyright = {}, + openscad = { openscad_ls = {} }, + python = { pyright = {} }, + shell = { bashls = {} }, svelte = { - plugin = { - svelte = { - defaultScriptLanguage = "ts", + svelte = { + plugin = { + svelte = { + defaultScriptLanguage = "ts", + }, }, }, }, - tailwindcss = {}, - ts_ls = {}, - vtsls = { - filetypes = { - "javascript", - "javascriptreact", - "javascript.jsx", - "typescript", - "typescriptreact", - "typescript.tsx", + tailwind = { tailwindcss = {} }, + typescript = { + eslint = { + settings = { + --Assuming prettier/prettierd will handle formatting, we don't need to see these errors + rulesCustomizations = { + { rule = "prettier/prettier", severity = "off" }, + }, + format = false, + }, }, - settings = { - vtsls = { - enableMoveToFileCodeAction = true, - autoUseWorkspaceTsdk = true, - experimental = { - completion = { - enableServerSideFuzzyMatch = true, + ts_ls = {}, + vtsls = { + filetypes = { + "javascript", + "javascriptreact", + "javascript.jsx", + "typescript", + "typescriptreact", + "typescript.tsx", + }, + settings = { + vtsls = { + enableMoveToFileCodeAction = true, + autoUseWorkspaceTsdk = true, + experimental = { + completion = { + enableServerSideFuzzyMatch = true, + }, + }, + }, + typescript = { + updateImportsOnFileMove = { enabled = "always" }, + tsserver = { maxTsServerMemory = 16384 }, + suggest = { + completeFunctionCalls = true, + }, + inlayHints = { + enumMemberValues = { enabled = true }, + functionLikeReturnTypes = { enabled = true }, + parameterNames = { enabled = "literals" }, + parameterTypes = { enabled = true }, + propertyDeclarationTypes = { enabled = true }, + variableTypes = { enabled = false }, }, }, }, - typescript = { - updateImportsOnFileMove = { enabled = "always" }, - tsserver = { maxTsServerMemory = 16384 }, - suggest = { - completeFunctionCalls = true, - }, - inlayHints = { - enumMemberValues = { enabled = true }, - functionLikeReturnTypes = { enabled = true }, - parameterNames = { enabled = "literals" }, - parameterTypes = { enabled = true }, - propertyDeclarationTypes = { enabled = true }, - variableTypes = { enabled = false }, - }, - }, }, }, - yamlls = { - settings = { - yaml = { - schemaStore = { - -- You must disable built-in schemaStore support if you want to use - -- this plugin and its advanced options like `ignore`. - enable = false, - -- Avoid TypeError: Cannot read properties of undefined (reading 'length') - url = "", + yaml = { + yamlls = { + settings = { + yaml = { + schemaStore = { + -- You must disable built-in schemaStore support if you want to use + -- this plugin and its advanced options like `ignore`. + enable = false, + -- Avoid TypeError: Cannot read properties of undefined (reading 'length') + url = "", + }, + schemas = require("schemastore").yaml.schemas(), }, - schemas = require("schemastore").yaml.schemas(), }, }, }, } -local typescript_server = require("nixCatsUtils").getCatOrDefault("typescriptServer", "ts_ls") -servers[typescript_server == "vtsls" and "ts_ls" or "vtsls"] = nil +local nixCatsUtils = require("nixCatsUtils") +local typescript_server = nixCatsUtils.getCatOrDefault("typescriptServer", "ts_ls") +servers.typescript[typescript_server == "vtsls" and "ts_ls" or "vtsls"] = nil -for server, config in pairs(servers) do - config.capabilities = capabilities - vim.lsp.config(server, config) +local enabled = {} +for language, language_servers in pairs(servers) do + if nixCatsUtils.enableForCategory("languages." .. language) then + for server, config in pairs(language_servers) do + config.capabilities = capabilities + vim.lsp.config(server, config) + table.insert(enabled, server) + end + end end -vim.lsp.enable(vim.tbl_keys(servers)) +vim.lsp.enable(enabled) vim.api.nvim_create_autocmd("LspAttach", { callback = function(e) diff --git a/home/modules/nvim/config/after/plugin/tailwind-fold.nvim.lua b/home/modules/nvim/config/after/plugin/tailwind-fold.nvim.lua index 83d1e46..d1f668a 100644 --- a/home/modules/nvim/config/after/plugin/tailwind-fold.nvim.lua +++ b/home/modules/nvim/config/after/plugin/tailwind-fold.nvim.lua @@ -1 +1,5 @@ +if not require("nixCatsUtils").enableForCategory("languages.tailwind") then + return +end + require("tailwind-fold").setup({ ft = { "html", "svelte", "tsx" } }) diff --git a/home/modules/nvim/config/flake.nix b/home/modules/nvim/config/flake.nix index bd769c7..e93402b 100644 --- a/home/modules/nvim/config/flake.nix +++ b/home/modules/nvim/config/flake.nix @@ -34,6 +34,7 @@ }@inputs: let inherit (nixCats) utils; + inherit (nixpkgs) lib; luaPath = ./.; forEachSystem = utils.eachSystem nixpkgs.lib.platforms.all; extra_pkg_config = { @@ -75,44 +76,23 @@ }: let themes = import ./themes.nix pkgs; + languages = import ./languages.nix { inherit pkgs categories; }; in { lspsAndRuntimeDeps = with pkgs; { general = [ nodejs_24 - black - clang - clang-tools curl # → plenary-nvim delta - emmet-language-server - eslint_d fd gawk - gdtoolkit_4 - hadolint - helm-ls inotify-tools - isort - lua-language-server - nixd - nixfmt prettier - ormolu prettierd - rust-analyzer - rustfmt - shellcheck-minimal - stylelint - stylua tree-sitter - tailwindcss-language-server - (if (categories.typescriptServer or "ts_ls") == "vtsls" then vtsls else typescript-language-server) - vscode-langservers-extracted - yaml-language-server - yamllint ]; github = [ gh ]; + languages = lib.mapAttrs (_: language: language.packages) languages; }; startupPlugins = { @@ -137,9 +117,7 @@ # TODO: tidalcycles/vim-tidal vim-glsl # TODO: timtro/glslView-nvim - # TODO: sirtaj/vim-openscad jupytext-nvim - vim-openscad ## paq eyeliner-nvim fzf-lua @@ -172,21 +150,19 @@ gitsigns-nvim pkgs.neovimPlugins.atlas-nvim nvim-highlight-colors - pkgs.neovimPlugins.tailwind-fold-nvim auto-session nvim-dbee image-nvim pkgs.neovimPlugins.beancount-nvim codecompanion-nvim - helm-ls-nvim kitty-scrollback-nvim fidget-nvim - rustaceanvim # pkgs.neovimPlugins.m-taskwarrior-d-nvim claudecode-nvim snacks-nvim ] ++ themes.${categories.colorscheme or "zenwritten"}; + languages = lib.mapAttrs (_: language: language.plugins or [ ]) languages; }; optionalPlugins = { @@ -202,7 +178,7 @@ }; packageDefinitions = { - nvim = _: { + nvim = { pkgs, ... }: { settings = { suffix-path = true; suffix-LD = true; @@ -214,6 +190,7 @@ github = false; colorscheme = "zenwritten"; typescriptServer = "ts_ls"; + languages = lib.mapAttrs (_: language: language.enable) (import ./languages.nix { inherit pkgs; }); }; }; }; diff --git a/home/modules/nvim/config/languages.nix b/home/modules/nvim/config/languages.nix new file mode 100644 index 0000000..ff2311c --- /dev/null +++ b/home/modules/nvim/config/languages.nix @@ -0,0 +1,133 @@ +{ + pkgs, + categories ? { }, +}: + +with pkgs; +{ + c = { + enable = false; + packages = [ + clang + clang-tools + ]; + }; + css = { + enable = false; + packages = [ + stylelint + vscode-langservers-extracted + ]; + }; + docker = { + enable = false; + packages = [ + dockerfile-language-server + hadolint + ]; + }; + gdscript = { + enable = false; + packages = [ gdtoolkit_4 ]; + }; + go = { + enable = false; + packages = [ + go + gopls + ]; + }; + haskell = { + enable = false; + packages = [ + haskell-language-server + hlint + ormolu + ]; + }; + helm = { + enable = false; + packages = [ helm-ls ]; + plugins = [ vimPlugins.helm-ls-nvim ]; + }; + html = { + enable = false; + packages = [ + emmet-language-server + vscode-langservers-extracted + ]; + }; + json = { + enable = false; + packages = [ vscode-langservers-extracted ]; + }; + lua = { + enable = true; + packages = [ + lua-language-server + stylua + ]; + }; + nix = { + enable = true; + packages = [ + nixd + nixfmt + ]; + }; + openscad = { + enable = false; + packages = [ openscad-lsp ]; + plugins = [ vimPlugins.vim-openscad ]; + }; + python = { + enable = false; + packages = [ + black + isort + pyright + ]; + }; + rust = { + enable = false; + packages = [ + rust-analyzer + rustfmt + ]; + plugins = [ vimPlugins.rustaceanvim ]; + }; + shell = { + enable = true; + packages = [ + bash-language-server + shellcheck-minimal + ]; + }; + svelte = { + enable = false; + packages = [ + eslint_d + svelte-language-server + ]; + }; + tailwind = { + enable = false; + packages = [ tailwindcss-language-server ]; + plugins = [ neovimPlugins.tailwind-fold-nvim ]; + }; + typescript = { + enable = false; + packages = [ + eslint_d + (if (categories.typescriptServer or "ts_ls") == "vtsls" then vtsls else typescript-language-server) + vscode-langservers-extracted + ]; + }; + yaml = { + enable = false; + packages = [ + yaml-language-server + yamllint + ]; + }; +} diff --git a/home/modules/nvim/default.nix b/home/modules/nvim/default.nix index c98470e..590b332 100644 --- a/home/modules/nvim/default.nix +++ b/home/modules/nvim/default.nix @@ -25,14 +25,29 @@ in "vtsls" ]; }; + languages = lib.mapAttrs ( + _: language: + lib.mkOption { + default = language.enable; + type = lib.types.bool; + } + ) (import "${inputs.nvim}/languages.nix" { inherit pkgs; }); }; config = lib.mkIf config.nvim.enable { + nvim.languages = { + docker = lib.mkDefault config.docker.enable; + go = lib.mkDefault config.go.enable; + helm = lib.mkDefault config.k8s.helm.enable; + openscad = lib.mkDefault config.modules."3d".modeling.openscad.enable; + typescript = lib.mkDefault config.nodejs.enable; + }; + nvim.packageDefinitions.merge.nvim = _: { categories = { colorscheme = config.nvim.colorscheme; github = config.git.github.enable; - inherit (config.nvim) typescriptServer; + inherit (config.nvim) languages typescriptServer; }; };