From e9f70800eabd40d90e4a5c94d53a9d9b39961ac5 Mon Sep 17 00:00:00 2001 From: Martin Larsson Date: Sat, 19 Jul 2025 12:42:40 +0200 Subject: [PATCH] Add tailwind and ts lsps --- nvim/lsp/tailwindcss-language-server.lua | 36 ++++++++++++ nvim/lsp/typescript-language-server.lua | 74 ++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 nvim/lsp/tailwindcss-language-server.lua create mode 100644 nvim/lsp/typescript-language-server.lua diff --git a/nvim/lsp/tailwindcss-language-server.lua b/nvim/lsp/tailwindcss-language-server.lua new file mode 100644 index 0000000..7a7ab90 --- /dev/null +++ b/nvim/lsp/tailwindcss-language-server.lua @@ -0,0 +1,36 @@ +return { + cmd = { + "tailwindcss-language-server", + "--stdio" + }, + filetypes = { + "html", + "css", + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + }, + root_markers = { + "tailwind.config.js", + "tailwind.config.ts", + "vite.config.ts", + "package.json", + ".eslintrc.js", + ".gitignore", + ".prettierrc", + "tsconfig.json", + }, + settings = { + tailwindCSS = { + validate = true, + classAttributes = { + "class", + "className", + "class:list", + "classList", + "ngClass", + }, + }, + }, +} diff --git a/nvim/lsp/typescript-language-server.lua b/nvim/lsp/typescript-language-server.lua new file mode 100644 index 0000000..d142e7b --- /dev/null +++ b/nvim/lsp/typescript-language-server.lua @@ -0,0 +1,74 @@ +return { + init_options = { hostInfo = "neovim" }, + cmd = { "typescript-language-server", "--stdio" }, + filetypes = { + "javascript", + "javascriptreact", + "javascript.jsx", + "typescript", + "typescriptreact", + "typescript.tsx", + }, + root_markers = { + "tsconfig.json", + "jsconfig.json", + "package.json", + ".git" + }, + handlers = { + ["_typescript.rename"] = function(_, result, ctx) + local client = assert(vim.lsp.get_client_by_id(ctx.client_id)) + vim.lsp.util.show_document({ + uri = result.textDocument.uri, + range = { + start = result.position, + ["end"] = result.position, + }, + }, client.offset_encoding) + vim.lsp.buf.rename() + return vim.NIL + end, + }, + commands = { + ["editor.action.showReferences"] = function(command, ctx) + local client = assert(vim.lsp.get_client_by_id(ctx.client_id)) + local file_uri, position, references = unpack(command.arguments) + + local quickfix_items = vim.lsp.util.locations_to_items(references, client.offset_encoding) + vim.fn.setqflist({}, ' ', { + title = command.title, + items = quickfix_items, + context = { + command = command, + bufnr = ctx.bufnr, + }, + }) + + vim.lsp.util.show_document({ + uri = file_uri, + range = { + start = position, + ["end"] = position, + }, + }, client.offset_encoding) + + vim.cmd('botright copen') + end, + }, + on_attach = function(client, bufnr) + -- ts_ls provides `source.*` code actions that apply to the whole file. These only appear in + -- `vim.lsp.buf.code_action()` if specified in `context.only`. + vim.api.nvim_buf_create_user_command(bufnr, "LspTypescriptSourceAction", function() + local source_actions = vim.tbl_filter(function(action) + return vim.startswith(action, "source.") + end, client.server_capabilities.codeActionProvider.codeActionKinds) + + vim.lsp.buf.code_action({ + context = { + only = source_actions, + diagnostics = {} + }, + }) + end, {}) + end, +}