require('plugins') require('keymaps') require('completion') packer.use { 'https://github.com/neovim/nvim-lspconfig', requires = { 'https://github.com/L3MON4D3/LuaSnip', 'https://github.com/hrsh7th/cmp-nvim-lsp' }, config = function() map('n', '', vim.diagnostic.goto_prev) map('n', '', vim.diagnostic.goto_next) -- Only map the following keys after the language server attaches to the -- current buffer local on_attach = function(client, bufnr) local function maplsp(mode, shortcut, command) vim.keymap.set(mode, shortcut, command, { noremap = true, silent = true, buffer=bufnr }) end maplsp('n', 'gD', vim.lsp.buf.declaration) maplsp('n', 'gd', vim.lsp.buf.definition) maplsp('n', 'K', vim.lsp.buf.hover) maplsp('n', 'gi', vim.lsp.buf.implementation) maplsp('n', '', vim.lsp.buf.signature_help) maplsp('n', 'wa', vim.lsp.buf.add_workspace_folder) maplsp('n', 'wr', vim.lsp.buf.remove_workspace_folder) maplsp('n', 'wl', function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end) maplsp('n', 'rn', vim.lsp.buf.rename) maplsp('n', 'a', vim.lsp.buf.code_action) maplsp('n', 'gr', vim.lsp.buf.references) maplsp('n', 'f', vim.lsp.buf.formatting) -- highlight symbol under cursor if client.resolved_capabilities.document_highlight then vim.cmd [[ hi! LspReferenceRead cterm=bold ctermbg=red guibg=#633466 hi! LspReferenceText cterm=bold ctermbg=red guibg=#633466 hi! LspReferenceWrite cterm=bold ctermbg=red guibg=#633466 ]] vim.api.nvim_create_augroup('lsp_document_highlight', { clear = false }) vim.api.nvim_clear_autocmds({ buffer = bufnr, group = 'lsp_document_highlight', }) vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { group = 'lsp_document_highlight', buffer = bufnr, callback = vim.lsp.buf.document_highlight, }) vim.api.nvim_create_autocmd('CursorMoved', { group = 'lsp_document_highlight', buffer = bufnr, callback = vim.lsp.buf.clear_references, }) end end -- setup servers local capabilities = require('cmp_nvim_lsp').update_capabilities( vim.lsp.protocol.make_client_capabilities()) if (vim.fn.executable('clangd') > 0) then require'lspconfig'.clangd.setup{ cmd = { 'clangd', '--compile-commands-dir=build', '--clang-tidy', -- needs >=clangd-9 '--ranking-model=decision_forest' -- needs >=clangd-12 }, on_attach = on_attach, capabilities = capabilities } end if (vim.fn.executable('lua-language-server') > 0) then require'lspconfig'.sumneko_lua.setup { settings = { Lua = { runtime = { version = 'LuaJIT', }, diagnostics = { globals = {'vim'}, }, workspace = { library = vim.api.nvim_get_runtime_file("", true), }, telemetry = { enable = false, }, }, }, on_attach = on_attach, capabilities = capabilities } end if (vim.fn.executable('pylsp') > 0) then require'lspconfig'.pylsp.setup{ settings = { pylsp = { } }, on_attach = on_attach, capabilities = capabilities } end if (vim.fn.executable('lemminx') > 0) then require'lspconfig'.lemminx.setup{ filetypes = { 'xml', 'xsd', 'xsl', 'xslt', 'svg', 'gentoo-metadata' }, on_attach = on_attach, capabilities = capabilities } end if (vim.fn.executable('vscode-html-language-server') > 0) then require'lspconfig'.html.setup{ on_attach = on_attach, capabilities = capabilities } end if (vim.fn.executable('vscode-css-language-server') > 0) then require'lspconfig'.cssls.setup{ on_attach = on_attach, capabilities = capabilities } end if (vim.fn.executable('vscode-eslint-language-server') > 0) then require'lspconfig'.eslint.setup{ on_attach = on_attach, capabilities = capabilities } end if (vim.fn.executable('vscode-json-language-server') > 0) then require'lspconfig'.jsonls.setup{ on_attach = on_attach, capabilities = capabilities } end end }