-- Setup nvim-cmp.lsp local hascmp, cmp = pcall(require, "cmp") if not hascmp then return end local feedkey = function(key, mode) vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true) end cmp.setup({ snippet = { -- REQUIRED - you must specify a snippet engine expand = function(args) vim.fn["vsnip#anonymous"](args.body) -- For `vsnip` users. -- require('luasnip').lsp_expand(args.body) -- For `luasnip` users. -- require('snippy').expand_snippet(args.body) -- For `snippy` users. -- vim.fn["UltiSnips#Anon"](args.body) -- For `ultisnips` users. end, }, window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered(), }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. [""] = cmp.mapping(function(fallback) if vim.fn["vsnip#jumpable"](1) == 1 then feedkey("(vsnip-jump-next)", "") elseif cmp.visible() then cmp.select_next_item() else fallback() -- The fallback function sends a already mapped key. In this case, it's probably ``. end end, { "i", "s" }), [''] = cmp.mapping(function() if vim.fn["vsnip#jumpable"](1) == 1 then feedkey("(vsnip-jump-next)", "") elseif cmp.visible() then cmp.select_next_item() end end, { "i", "s"}), }), sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'path' }, { name = 'vsnip' }, -- For vsnip users. -- { name = 'luasnip' }, -- For luasnip users. -- { name = 'ultisnips' }, -- For ultisnips users. -- { name = 'snippy' }, -- For snippy users. }, { { name = 'buffer' }, }) }) require('snippy').setup({ mappings = { is = { [''] = 'expand_or_advance', [''] = 'previous', }, }, }) -- 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 cmp_completion = require('nvim-autopairs.completion.cmp') cmp.event:on('confirm_done',cmp_completion.on_confirm_done()) -- Setup lspconfig. local capabilities = require('cmp_nvim_lsp').default_capabilities(vim.lsp.protocol.make_client_capabilities()) require("mason").setup { ui = { icons = { package_installed = "✓" } } } require("mason-lspconfig").setup { ensure_installed = { "pyright", "texlab", "clangd", "bashls", "cmake", "jsonls", "tsserver", "vuels", "dockerls", "vimls", "html", "yamlls", "cssls", "lua_ls", "ltex", "gopls", "rust_analyzer", "jdtls"}, } require('lspconfig').pyright.setup { capabilities = capabilities, settings = { python = { analysis = { typeCheckingMode = "off" } } } } require('lspconfig').texlab.setup { capabilities = capabilities } require('lspconfig').clangd.setup { capabilities = capabilities, -- root_dir = function() -- return require('lspconfig').util.root_pattern({'.clang-format', 'build/', 'compile_flags.txt'}) -- end, cmd = { "clangd", "--background-index", "--clang-tidy", "-j=8", "--clang-tidy-checks=*", "--all-scopes-completion", "--completion-style=bundled", "--cross-file-rename", "--completion-style=detailed", "--header-insertion-decorators", "--header-insertion=iwyu", "--pch-storage=memory" } } require('lspconfig').bashls.setup { capabilities = capabilities } require('lspconfig').cmake.setup { capabilities = capabilities } require('lspconfig').jsonls.setup { capabilities = capabilities } require('lspconfig').tsserver.setup { capabilities = capabilities } require('lspconfig').kotlin_language_server.setup { capabilities = capabilities } require('lspconfig').vuels.setup { capabilities = capabilities } require('lspconfig').dockerls.setup { capabilities = capabilities } require('lspconfig').vimls.setup { capabilities = capabilities } require('lspconfig').html.setup { capabilities = capabilities } require('lspconfig').yamlls.setup { capabilities = capabilities } require('lspconfig').cssls.setup { capabilities = capabilities } require('lspconfig').jdtls.setup { capabilities = capabilities } require('lspconfig').rust_analyzer.setup { capabilities = capabilities, } require('lspconfig').gopls.setup { capabilities = capabilities } require('lspconfig').lua_ls.setup { settings = { Lua = { runtime = { -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) version = 'LuaJIT', }, diagnostics = { -- Get the language server to recognize the `vim` global globals = {'vim', 'use', 'awesome', 'client', 'root'}, }, workspace = { -- Make the server aware of Neovim runtime files library = { ['/usr/share/nvim/runtime/lua'] = true, ['/usr/share/nvim/runtime/lua/lsp'] = true, ['/usr/share/awesome/lib'] = true } }, -- Do not send telemetry data containing a randomized but unique identifier telemetry = { enable = false, }, }, }, } require('lspconfig').ltex.setup { capabilities = capabilities, on_attach = function(_, _) require("ltex_extra").setup{ load_langs = {"nl-BE", "en-GB"}, init_check = true, } end, settings = { ltex = { enabled = true, language = "en-GB" } } } vim.diagnostic.config({ virtual_text = false }) -- Provides the Format, FormatWrite, FormatLock, and FormatWriteLock commands require("formatter").setup { filetype = { lua = { require("formatter.filetypes.lua").stylua, }, python = { require("formatter.filetypes.python").black, }, } } -- Show line diagnostics automatically in hover window vim.o.updatetime = 250 vim.cmd [[autocmd CursorHold,CursorHoldI * lua vim.diagnostic.open_float(nil, {focus=false})]] vim.keymap.set("n", "n", vim.diagnostic.goto_next, { silent = true }) vim.keymap.set("n", "p", vim.diagnostic.goto_prev, { silent = true }) vim.keymap.set("n", "f", vim.lsp.buf.code_action, { silent = true }) vim.keymap.set("n", "gd", vim.lsp.buf.definition, { silent = true }) vim.keymap.set("n", "gr", vim.lsp.buf.references, { silent = true }) vim.keymap.set("n", "", vim.lsp.buf.hover, { noremap = true, silent = true }) vim.keymap.set("n", "rn", vim.lsp.buf.rename, { noremap = true, silent = true })