From b72a51a3ea4b268ab1ea78d79f1b8e69f46be962 Mon Sep 17 00:00:00 2001 From: Dennis Date: Fri, 13 Jun 2025 00:39:43 +0200 Subject: [PATCH] adds tailwind lsp config --- hosts/dnsc-air/default.nix | 1 + hosts/dnsc-work/default.nix | 1 + modules/nvim/config/lsp/tailwindcss.lua | 153 ++++++++++++++++++++ modules/nvim/config/lua/plugins/conform.lua | 3 +- 4 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 modules/nvim/config/lsp/tailwindcss.lua diff --git a/hosts/dnsc-air/default.nix b/hosts/dnsc-air/default.nix index 35d2804..5d0aea3 100644 --- a/hosts/dnsc-air/default.nix +++ b/hosts/dnsc-air/default.nix @@ -43,6 +43,7 @@ typescript-language-server vscode-langservers-extracted astro-language-server + tailwindcss-language-server lua-language-server prettierd eslint_d diff --git a/hosts/dnsc-work/default.nix b/hosts/dnsc-work/default.nix index f5e2466..2ad2d82 100644 --- a/hosts/dnsc-work/default.nix +++ b/hosts/dnsc-work/default.nix @@ -40,6 +40,7 @@ stylua typescript-language-server vscode-langservers-extracted + tailwindcss-language-server lua-language-server prettierd eslint_d diff --git a/modules/nvim/config/lsp/tailwindcss.lua b/modules/nvim/config/lsp/tailwindcss.lua new file mode 100644 index 0000000..d6a9383 --- /dev/null +++ b/modules/nvim/config/lsp/tailwindcss.lua @@ -0,0 +1,153 @@ +function root_markers_with_field(root_files, new_names, field, fname) + local path = vim.fn.fnamemodify(fname, ":h") + local found = vim.fs.find(new_names, { path = path, upward = true }) + + for _, f in ipairs(found or {}) do + -- Match the given `field`. + for line in io.lines(f) do + if line:find(field) then + root_files[#root_files + 1] = vim.fs.basename(f) + break + end + end + end + + return root_files +end + +function insert_package_json(root_files, field, fname) + return root_markers_with_field(root_files, { "package.json", "package.json5" }, field, fname) +end + +return { + cmd = { "tailwindcss-language-server", "--stdio" }, + -- filetypes copied and adjusted from tailwindcss-intellisense + filetypes = { + -- html + "aspnetcorerazor", + "astro", + "astro-markdown", + "blade", + "clojure", + "django-html", + "htmldjango", + "edge", + "eelixir", -- vim ft + "elixir", + "ejs", + "erb", + "eruby", -- vim ft + "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 = 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, + workspace_required = true, + root_dir = 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", + -- Phoenix + "assets/tailwind.config.js", + "assets/tailwind.config.cjs", + "assets/tailwind.config.mjs", + "assets/tailwind.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", + -- Rails + "app/assets/stylesheets/application.tailwind.css", + "app/assets/tailwind/application.css", + } + local fname = vim.api.nvim_buf_get_name(bufnr) + root_files = insert_package_json(root_files, "tailwindcss", fname) + root_files = root_markers_with_field(root_files, { "mix.lock" }, "tailwind", fname) + on_dir(vim.fs.dirname(vim.fs.find(root_files, { path = fname, upward = true })[1])) + end, +} diff --git a/modules/nvim/config/lua/plugins/conform.lua b/modules/nvim/config/lua/plugins/conform.lua index c7e01a1..b492904 100644 --- a/modules/nvim/config/lua/plugins/conform.lua +++ b/modules/nvim/config/lua/plugins/conform.lua @@ -3,6 +3,7 @@ return { opts = { formatters_by_ft = { typescriptreact = { "prettierd" }, + astro = { "prettierd" }, typescript = { "prettierd" }, javascript = { "prettierd" }, javascriptreact = { "prettierd" }, @@ -15,7 +16,7 @@ return { }, format_on_save = { -- These options will be passed to conform.format() - timeout_ms = 300, + timeout_ms = 500, lsp_format = "fallback", }, },