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", "lua vim.lsp.buf.definition()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gD", "lua vim.lsp.buf.declaration()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "lua vim.lsp.buf.implementation()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "K", "lua vim.lsp.buf.hover()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "", "lua vim.lsp.buf.signature_help()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "lua vim.lsp.buf.references()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "[d", 'lua vim.diagnostic.goto_prev({border="rounded"})', opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "]d", 'lua vim.diagnostic.goto_next({border="rounded"})', opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "lr", "lua vim.lsp.buf.rename()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "q", "lua vim.diagnostic.setloclist()", opts) vim.api.nvim_buf_set_keymap( bufnr, "n", "td", "lua require 'telescope.builtin'.diagnostics()", opts ) vim.api.nvim_buf_set_keymap( bufnr, "n", "tr", "lua require 'telescope.builtin'.lsp_references()", 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/hrsh7th/vscode-langservers-extracted --- --- `css-languageserver` can be installed via `npm`: --- --- ```sh --- npm i -g vscode-langservers-extracted --- ``` --- --- Neovim does not currently include built-in snippets. `vscode-css-language-server` only provides completions when snippet support is enabled. To enable completion, install a snippet plugin and add the following override to your language client capabilities during setup. --- --- ```lua --- --Enable (broadcasting) snippet capability for completion --- local capabilities = vim.lsp.protocol.make_client_capabilities() --- capabilities.textDocument.completion.completionItem.snippetSupport = true --- --- vim.lsp.config('cssls', { --- capabilities = capabilities, --- }) --- ``` return { cmd = { 'vscode-css-language-server', '--stdio' }, filetypes = { 'css', 'scss', 'less' }, init_options = { provideFormatter = true }, -- needed to enable formatting capabilities root_markers = { 'package.json', '.git' }, settings = { css = { validate = true }, scss = { validate = true }, less = { validate = true }, }, capabilities = capabilities, on_attach = function(client, bufnr) lsp_keymaps(bufnr) lsp_highlight_document(client) if client.supports_method("textDocument/formatting") then vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) vim.api.nvim_create_autocmd("BufWritePre", { group = augroup, buffer = bufnr, callback = function() vim.lsp.buf.format() end, }) end end, }