192 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			192 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,
 | 
						|
}
 |