diff options
| author | Omar Elhawary <oedotme@gmail.com> | 2026-04-05 16:33:03 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-05 10:33:03 -0400 |
| commit | 8caef47d1ddcdf0fef4c3ebb863e6591ed312b54 (patch) | |
| tree | d60b95ede51080fd393dfbb2669a25887871af10 /lsp/tailwindcss.lua | |
| parent | docs: update configs.md (diff) | |
| download | nvim-lspconfig-8caef47d1ddcdf0fef4c3ebb863e6591ed312b54.tar nvim-lspconfig-8caef47d1ddcdf0fef4c3ebb863e6591ed312b54.tar.gz nvim-lspconfig-8caef47d1ddcdf0fef4c3ebb863e6591ed312b54.tar.bz2 nvim-lspconfig-8caef47d1ddcdf0fef4c3ebb863e6591ed312b54.tar.lz nvim-lspconfig-8caef47d1ddcdf0fef4c3ebb863e6591ed312b54.tar.xz nvim-lspconfig-8caef47d1ddcdf0fef4c3ebb863e6591ed312b54.tar.zst nvim-lspconfig-8caef47d1ddcdf0fef4c3ebb863e6591ed312b54.zip | |
fix(tailwindcss): revert broken config detection #4376
Problem:
`find_tailwind_global_css` attempted to address #4204, where `experimental.configFile` was set using the return value of `vim.fs.find()`.
The language server rejected this with `Invalid experimental.configFile
configuration, not initializing` because `configFile` expects either a string or
a key-value record (object), not an array/list. This was a syntax issue, not
a detection issue.
Using the correct syntax for `configFile` in Lua should be
sufficient to address the original issue. Right now, `find_tailwind_global_css`
always runs for users who haven't explicitly set `configFile` — overriding the
LSP's native detection and **forcing anyone who wants to opt out to manually set
all entry-points by hand.**
Solution:
- Remove `find_tailwind_global_css` entirely and restores `configFile` to its
default `nil` so the `tailwindcss` LSP handles project detection natively.
- Simplify `before_init` based on [this suggestion from the initial
PR](https://github.com/neovim/nvim-lspconfig/pull/4222#discussion_r3018499628).
The following syntax worked for me while testing to explicitly set the
`configFile` based on the [official
docs](https://github.com/tailwindlabs/tailwindcss-intellisense#tailwindcssexperimentalconfigfile)
for single entry-point:
> [!NOTE]
> Single entry-point is resolved relative to the workspace root (`root_dir` — verify with `:checkhealth vim.lsp`)
```lua
vim.lsp.config('tailwindcss', {
settings = {
tailwindCSS = {
experimental = {
-- v3: config file
configFile = 'tailwind.config.js',
-- v4: CSS entry-point
-- configFile = 'src/styles/app.css',
},
},
},
})
```
For projects with multiple entry-points, or different projects, the following
syntax can be used for multiple entry-points:
> [!NOTE]
> Keys are relative to `root_dir` as above, but from my testing on macOS, absolute paths worked better
```lua
vim.lsp.config('tailwindcss', {
settings = {
tailwindCSS = {
experimental = {
configFile = {
['tailwind.config.js'] = '/Users/username/path/to/project-a/**',
['src/main.css'] = '/Users/username/path/to/project-b/**',
},
},
},
},
})
```
#### Project or Local Configuration
For project-specific settings without modifying your global Neovim config:
1. Enable in your Neovim config:
```lua
vim.o.exrc = true
```
2. Create `.nvim.lua` in the project root:
```lua
vim.lsp.config('tailwindcss', {
settings = {
tailwindCSS = {
experimental = {
configFile = 'tailwind.config.ts',
},
},
},
})
```
3. Open `.nvim.lua` and run `:trust` to allow the file, then restart Neovim.
4. Verify with `:checkhealth vim.lsp`.
Diffstat (limited to 'lsp/tailwindcss.lua')
| -rw-r--r-- | lsp/tailwindcss.lua | 52 |
1 files changed, 7 insertions, 45 deletions
diff --git a/lsp/tailwindcss.lua b/lsp/tailwindcss.lua index 397a5859..03d52e3c 100644 --- a/lsp/tailwindcss.lua +++ b/lsp/tailwindcss.lua @@ -4,39 +4,11 @@ --- Tailwind CSS Language Server can be installed via npm: --- --- npm install -g @tailwindcss/language-server -local util = require 'lspconfig.util' - -local function find_tailwind_global_css() - local target = [[%@import ['"]tailwindcss['"]%;]] - -- Find project root using `.git` - local buf = vim.api.nvim_get_current_buf() - local root = vim.fs.root(buf, function(name) - return name == '.git' - end) - - if not root then - return nil -- no project root found - end - - -- Find stylesheet files in the project root (recursively) - local files = vim.fs.find(function(name) - return name:match('%.css$') or name:match('%.scss$') or name:match('%.pcss$') - end, { - path = root, - type = 'file', - limit = math.huge, -- search full tree - }) - - for _, path in ipairs(files) do - local content = vim.fn.readblob(path) - - if content:find(target, 1, true) then - return path -- return first match - end - end +--- +--- To manually set the config file or CSS entry-point, see: +--- https://github.com/tailwindlabs/tailwindcss-intellisense#tailwindcssexperimentalconfigfile - return nil -end +local util = require('lspconfig.util') ---@type vim.lsp.Config return { @@ -136,19 +108,9 @@ return { }, }, 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 - config.settings.tailwindCSS = config.settings.tailwindCSS or {} - config.settings.tailwindCSS.experimental = config.settings.tailwindCSS.experimental or {} - config.settings.tailwindCSS.experimental.configFile = config.settings.tailwindCSS.experimental.configFile - or find_tailwind_global_css() + config.settings = vim.tbl_deep_extend('keep', config.settings, { + editor = { tabSize = vim.lsp.util.get_effective_tabstop() }, + }) end, workspace_required = true, root_dir = function(bufnr, on_dir) |
