diff --git a/modules/plugins/languages/tailwind.nix b/modules/plugins/languages/tailwind.nix index da2a514e..f166980b 100644 --- a/modules/plugins/languages/tailwind.nix +++ b/modules/plugins/languages/tailwind.nix @@ -20,91 +20,6 @@ tailwindcss = { enable = true; cmd = [(getExe pkgs.tailwindcss-language-server) "--stdio"]; - filetypes = [ - # html - "aspnetcorerazor" - "astro" - "astro-markdown" - "blade" - "clojure" - "django-html" - "htmldjango" - "edge" - "eelixir" - "elixir" - "ejs" - "erb" - "eruby" - "gohtml" - "gohtmltmpl" - "haml" - "handlebars" - "hbs" - "html" - "htmlangular" - "html-eex" - "heex" - "jade" - "leaf" - "liquid" - "markdown" - "mdx" - "mustache" - "njk" - "nunjucks" - "php" - "razor" - "slim" - "twig" - # css - "css" - "less" - "postcss" - "sass" - "scss" - "stylus" - "sugarss" - # js - "javascript" - "javascriptreact" - "reason" - "rescript" - "typescript" - "typescriptreact" - # mixed - "vue" - "svelte" - "templ" - ]; - settings = { - tailwindCSS = { - validate = true; - lint = { - cssConflict = "warning"; - invalidApply = "error"; - invalidScreen = "error"; - invalidVariant = "error"; - invalidConfigPath = "error"; - invalidTailwindDirective = "error"; - recommendedVariantOrder = "warning"; - }; - classAttributes = [ - "class" - "className" - "class:list" - "classList" - "ngClass" - ]; - includeLanguages = { - eelixir = "html-eex"; - elixir = "phoenix-heex"; - eruby = "erb"; - heex = "phoenix-heex"; - htmlangular = "html"; - templ = "html"; - }; - }; - }; before_init = mkLuaInline '' function(_, config) if not config.settings then diff --git a/modules/plugins/lsp/presets/default.nix b/modules/plugins/lsp/presets/default.nix index 860081f6..bc87468a 100644 --- a/modules/plugins/lsp/presets/default.nix +++ b/modules/plugins/lsp/presets/default.nix @@ -3,6 +3,7 @@ ./deno.nix ./harper.nix ./lemminx.nix + ./tailwindcss-language-server.nix ./taplo.nix ./terraform-ls.nix ./texlab.nix diff --git a/modules/plugins/lsp/presets/tailwindcss-language-server.nix b/modules/plugins/lsp/presets/tailwindcss-language-server.nix new file mode 100644 index 00000000..e2dc37de --- /dev/null +++ b/modules/plugins/lsp/presets/tailwindcss-language-server.nix @@ -0,0 +1,150 @@ +{ + config, + lib, + pkgs, + ... +}: let + inherit (lib.meta) getExe; + inherit (lib.modules) mkIf; + inherit (lib.options) mkEnableOption; + inherit (lib.generators) mkLuaInline; + + cfg = config.vim.lsp.presets.tailwindcss-language-server; +in { + options.vim.lsp.presets.tailwindcss-language-server = { + enable = mkEnableOption "the Tailwind CSS Language Server"; + }; + + config = mkIf cfg.enable { + vim.lsp.servers.tailwindcss-language-server = { + enable = true; + cmd = [(getExe pkgs.tailwindcss-language-server) "--stdio"]; + root_markers = [".git"]; + filetypes = [ + # html + "aspnetcorerazor" + "astro" + "astro-markdown" + "blade" + "clojure" + "django-html" + "htmldjango" + "edge" + "eelixir" + "elixir" + "ejs" + "erb" + "eruby" + "gohtml" + "gohtmltmpl" + "haml" + "handlebars" + "hbs" + "html" + "htmlangular" + "html-eex" + "heex" + "jade" + "leaf" + "liquid" + "markdown" + "mdx" + "mustache" + "njk" + "nunjucks" + "php" + "razor" + "slim" + "twig" + # css + "css" + "less" + "postcss" + "sass" + "scss" + "stylus" + "sugarss" + # js + "javascript" + "javascriptreact" + "reason" + "rescript" + "typescript" + "typescriptreact" + # mixed + "vue" + "svelte" + "templ" + ]; + settings = { + tailwindCSS = { + validate = true; + lint = { + cssConflict = "warning"; + invalidApply = "error"; + invalidScreen = "error"; + invalidVariant = "error"; + invalidConfigPath = "error"; + invalidTailwindDirective = "error"; + recommendedVariantOrder = "warning"; + }; + classAttributes = [ + "class" + "className" + "class:list" + "classList" + "ngClass" + ]; + includeLanguages = { + eelixir = "html-eex"; + elixir = "phoenix-heex"; + eruby = "erb"; + heex = "phoenix-heex"; + htmlangular = "html"; + templ = "html"; + }; + }; + }; + workspace_required = true; + root_dir = mkLuaInline '' + function(bufnr, on_dir) + local root_files = { + -- Generic + 'tailwind.config.js', + 'tailwind.config.cjs', + 'tailwind.config.mjs', + 'tailwind.config.ts', + 'postcss.config.js', + 'postcss.config.cjs', + 'postcss.config.mjs', + 'postcss.config.ts', + -- Django + 'theme/static_src/tailwind.config.js', + 'theme/static_src/tailwind.config.cjs', + 'theme/static_src/tailwind.config.mjs', + 'theme/static_src/tailwind.config.ts', + 'theme/static_src/postcss.config.js', + } + local fname = vim.api.nvim_buf_get_name(bufnr) + root_files = util.insert_package_json(root_files, 'tailwindcss', fname) + root_files = util.root_markers_with_field(root_files, { 'mix.lock', 'Gemfile.lock' }, 'tailwind', fname) + on_dir(vim.fs.dirname(vim.fs.find(root_files, { path = fname, upward = true })[1])) + end + ''; + + before_init = mkLuaInline '' + function(_, config) + if not config.settings then + config.settings = {} + end + if not config.settings.editor then + config.settings.editor = {} + end + if not config.settings.editor.tabSize then + config.settings.editor.tabSize = vim.lsp.util.get_effective_tabstop() + end + end + ''; + }; + }; +}