local lspconfig = require("lspconfig") local saga = require("lspsaga") local cmp = require("cmp") cmp.setup({ snippet = { expand = function(args) require('luasnip').lsp_expand(args.body) -- For `luasnip` users. end, }, window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered(), }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), [''] = cmp.mapping.abort(), [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. }), sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'luasnip' }, -- For luasnip users. }, { { name = 'buffer' }, }) }) -- Set configuration for specific filetype. cmp.setup.filetype('gitcommit', { sources = cmp.config.sources({ { name = 'cmp_git' }, -- You can specify the `cmp_git` source if you were installed it. }, { { name = 'buffer' }, }) }) -- Use buffer source for `/` (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline('/', { mapping = cmp.mapping.preset.cmdline(), sources = { { name = 'buffer' } } }) -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }) }) local capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities()) local on_attach = function(client, bufnr) local opts = { noremap = true, silent = true } local function key(mode, keys, cmd) vim.api.nvim_buf_set_keymap(bufnr, mode, keys, cmd, opts) end local function opt(...) vim.api.nvim_buf_set_option(bufnr, ...) end -- Enable completion opt('omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings key('n', 'cD', 'lua vim.lsp.buf.declaration()') key('n', 'cd', 'lua vim.lsp.buf.definition()') key('n', 'cp', 'Lspsaga preview_definition') key('n', 'ch', 'Lspsaga hover_doc') key('n', 'ci', 'lua vim.lsp.buf.implementation()') key('n', 'sh', 'Lspsaga signature_help') key('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()') key('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()') key('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))') key('n', 'D', 'lua vim.lsp.buf.type_definition()') key('n', 'rn', 'lua vim.lsp.buf.rename()') key('n', 'ca', 'Lspsaga code_action') key('n', 'cr', 'lua vim.lsp.buf.references()') key('n', 'f', 'lua vim.lsp.buf.formatting()') key('n', 'cs', 'lua vim.diagnostic.open_float()') end lspconfig.ccls.setup { on_attach = on_attach, capabilities = capabilities, init_options = { cache = { directory = vim.fn.expand("$HOME/.cache/ccls") } } } lspconfig.rust_analyzer.setup { on_attach = on_attach, capabilities = capabilities, settings = { ["rust-analyzer"] = { checkOnSave = { command = "clippy" }, diagnostics = { disabled = { "mismatched-arg-count" } } } } } lspconfig.tsserver.setup { on_attach = on_attach, capabilities = capabilities, } lspconfig.java_language_server.setup { on_attach = on_attach, capabilities = capabilities, cmd = { "/usr/share/java/java-language-server/lang_server_linux.sh" } } lspconfig.racket_langserver.setup { on_attach = on_attach, capabilities = capabilities, } lspconfig.ocamllsp.setup { on_attach = on_attach, capabilities = capabilities, } saga.init_lsp_saga()