193 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
		
		
			
		
	
	
			193 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| 
								 | 
							
								local function lsp_highlight_document(client)
							 | 
						||
| 
								 | 
							
								    if client.server_capabilities.document_highlight then
							 | 
						||
| 
								 | 
							
								        vim.api.nvim_create_augroup("lsp_document_highlight", { clear = true })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        vim.api.nvim_create_autocmd("CursorHold", {
							 | 
						||
| 
								 | 
							
								            group = "lsp_document_highlight",
							 | 
						||
| 
								 | 
							
								            buffer = 0,
							 | 
						||
| 
								 | 
							
								            callback = function()
							 | 
						||
| 
								 | 
							
								                vim.lsp.buf.document_highlight()
							 | 
						||
| 
								 | 
							
								            end,
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        vim.api.nvim_create_autocmd("CursorMoved", {
							 | 
						||
| 
								 | 
							
								            group = "lsp_document_highlight",
							 | 
						||
| 
								 | 
							
								            buffer = 0,
							 | 
						||
| 
								 | 
							
								            callback = function()
							 | 
						||
| 
								 | 
							
								                vim.lsp.buf.clear_references()
							 | 
						||
| 
								 | 
							
								            end,
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								    end
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local function lsp_keymaps(bufnr)
							 | 
						||
| 
								 | 
							
								    local opts = { noremap = true, silent = true }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "<cmd>lua vim.lsp.buf.definition()<CR>", opts)
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(bufnr, "n", "gD", "<cmd>lua vim.lsp.buf.declaration()<CR>", opts)
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", opts)
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(bufnr, "n", "K", "<cmd>lua vim.lsp.buf.hover()<CR>", opts)
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(bufnr, "n", "<C-k>", "<cmd>lua vim.lsp.buf.signature_help()<CR>", opts)
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", opts)
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(bufnr, "n", "[d", '<cmd>lua vim.diagnostic.goto_prev({border="rounded"})<CR>', opts)
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(bufnr, "n", "]d", '<cmd>lua vim.diagnostic.goto_next({border="rounded"})<CR>', opts)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>lr", "<cmd>lua vim.lsp.buf.rename()<cr>", opts)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>q", "<cmd>lua vim.diagnostic.setloclist()<CR>", opts)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(
							 | 
						||
| 
								 | 
							
								        bufnr,
							 | 
						||
| 
								 | 
							
								        "n",
							 | 
						||
| 
								 | 
							
								        "<leader>td",
							 | 
						||
| 
								 | 
							
								        "<cmd>lua require 'telescope.builtin'.diagnostics()<cr>",
							 | 
						||
| 
								 | 
							
								        opts
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    vim.api.nvim_buf_set_keymap(
							 | 
						||
| 
								 | 
							
								        bufnr,
							 | 
						||
| 
								 | 
							
								        "n",
							 | 
						||
| 
								 | 
							
								        "<leader>tr",
							 | 
						||
| 
								 | 
							
								        "<cmd>lua require 'telescope.builtin'.lsp_references()<CR>",
							 | 
						||
| 
								 | 
							
								        opts
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp")
							 | 
						||
| 
								 | 
							
								if not status_ok then
							 | 
						||
| 
								 | 
							
								    print("Failed to require cmp_nvim_lsp")
							 | 
						||
| 
								 | 
							
								    return
							 | 
						||
| 
								 | 
							
								end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								local client_capabilities = vim.lsp.protocol.make_client_capabilities()
							 | 
						||
| 
								 | 
							
								local capabilities = cmp_nvim_lsp.default_capabilities(client_capabilities)
							 | 
						||
| 
								 | 
							
								capabilities.offsetEncoding = { "utf-8", "utf-16" }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								---@brief
							 | 
						||
| 
								 | 
							
								--- https://github.com/tailwindlabs/tailwindcss-intellisense
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								--- Tailwind CSS Language Server can be installed via npm:
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								--- npm install -g @tailwindcss/language-server
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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',
							 | 
						||
| 
								 | 
							
								                eruby = 'erb',
							 | 
						||
| 
								 | 
							
								                templ = 'html',
							 | 
						||
| 
								 | 
							
								                htmlangular = '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 = {
							 | 
						||
| 
								 | 
							
								            'tailwind.config.js',
							 | 
						||
| 
								 | 
							
								            'tailwind.config.cjs',
							 | 
						||
| 
								 | 
							
								            'tailwind.config.mjs',
							 | 
						||
| 
								 | 
							
								            'tailwind.config.ts',
							 | 
						||
| 
								 | 
							
								            'postcss.config.js',
							 | 
						||
| 
								 | 
							
								            'postcss.config.cjs',
							 | 
						||
| 
								 | 
							
								            'postcss.config.mjs',
							 | 
						||
| 
								 | 
							
								            'postcss.config.ts',
							 | 
						||
| 
								 | 
							
								            'package.json',
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        local fname = vim.api.nvim_buf_get_name(bufnr)
							 | 
						||
| 
								 | 
							
								        on_dir(vim.fs.dirname(vim.fs.find(root_files, { path = fname, upward = true })[1]))
							 | 
						||
| 
								 | 
							
								    end,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    capabilities = capabilities,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    on_attach = function(client, bufnr)
							 | 
						||
| 
								 | 
							
								        lsp_keymaps(bufnr)
							 | 
						||
| 
								 | 
							
								        lsp_highlight_document(client)
							 | 
						||
| 
								 | 
							
								    end,
							 | 
						||
| 
								 | 
							
								}
							 |