local map = require('my.functions').map local on_attach = function(client, bufnr) -- TODO: key mappings if client.server_capabilities.documentHighlightProvider then vim.api.nvim_create_augroup('config_lsp', { clear = false }) vim.api.nvim_clear_autocmds({ buffer = bufnr, group = 'config_lsp', }) vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { group = 'config_lsp', buffer = bufnr, callback = vim.lsp.buf.document_highlight, }) vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, { group = 'config_lsp', buffer = bufnr, callback = vim.lsp.buf.clear_references, }) end -- don't autoformat code like text vim.bo.formatoptions = vim.o.formatoptions:gsub('t', '') -- virtual text hint for parameters require ('lsp_signature').on_attach({ bind = true, handler_opts = { border = 'rounded' }, floating_window = false }, bufnr) require('lsp-status').on_attach(client) end -- add completion capabilities local capabilities = require('cmp_nvim_lsp').default_capabilities() -- add progress capabilities local lsp_status = require('lsp-status') lsp_status.register_progress() capabilities = vim.tbl_extend('keep', capabilities, lsp_status.capabilities) -- opens lsp.util.open_floating_preview() -> nvim_open_win() vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'rounded', width = 60, focusable = false, -- next 2 lines do nothing, overwritten by open_floating_preview() relative = 'win', anchor = 'NE', }) -- setup servers local lspconfig = require('lspconfig') -- set up language servers that don't need any special configuration local simple_ls = { ['vscode-html-language-server'] = 'html', ['vscode-css-language-server'] = 'cssls', ['vscode-json-language-server'] = 'jsonls', ['gopls'] = 'gopls', ['cmake-language-server'] = 'cmake', ['yaml-language-server'] = 'yamlls', ['docker-langserver'] = 'dockerls', } for exe, ls in pairs(simple_ls) do if vim.fn.executable(exe) == 1 then lspconfig[ls].setup({ on_attach = on_attach, capabilities = capabilities }) end end if vim.fn.executable('clangd') > 0 then require("clangd_extensions").setup({ server = { cmd = { 'clangd', '--compile-commands-dir=build', '--clang-tidy', -- needs >=clangd-9 '--ranking-model=decision_forest' -- needs >=clangd-12 }, init_options = { clangdFileStatus = true }, on_attach = on_attach, capabilities = capabilities, handlers = lsp_status.extensions.clangd.setup(), }, extensions = { inlay_hints = { show_parameter_hints = false } } }) end -- TODO: lua-language-server if vim.fn.executable('pylsp') == 1 then lspconfig.pylsp.setup({ settings = { pylsp = { } }, on_attach = on_attach, capabilities = capabilities }) end if vim.fn.executable('lemminx') == 1 then lspconfig.lemminx.setup({ filetypes = { 'xml', 'xsd', 'xsl', 'xslt', 'svg', 'gentoo-metadata' }, settings = { xml = { server = { -- path for cached XML Schemas workDir = vim.fn.stdpath('cache') .. '/lemminx' } } }, on_attach = on_attach, capabilities = capabilities }) end if vim.fn.glob('/usr/lib64/perl5/vendor_perl/5.*/Perl/LanguageServer.pm') ~= '' then lspconfig.perlls.setup({ on_attach = on_attach, capabilities = capabilities }) end if vim.fn.executable('qml-lsp') == 1 then lspconfig.qml_lsp.setup({ filetypes = { 'qml', 'qmljs' }, on_attach = on_attach, capabilities = capabilities }) end if vim.fn.executable('bash-language-server') > 0 then lspconfig.bashls.setup({ filetypes = { 'sh', 'bash', 'ebuild', 'gentoo-init-d.sh' }, on_attach = on_attach, capabilities = capabilities }) end if vim.fn.executable('typescript-language-server') > 0 then lspconfig.tsserver.setup({ cmd = { 'typescript-language-server', '--stdio', '--tsserver-path', 'tsserver' }, on_attach = on_attach, capabilities = capabilities }) end if vim.fn.executable('rust-analyzer') == 1 then require("rust-tools").setup({ server = { on_attach = on_attach, capabilities = capabilities, settings = { ["rust-analyzer"] = { -- checkOnSave = { -- command = "clippy", -- }, -- diagnostics = { -- enable = true, -- }, } } }, }) end