local lsp = require("lsp-zero") lsp.preset("recommended") lsp.ensure_installed({ 'tsserver', 'eslint', 'sumneko_lua', 'rust_analyzer', 'pylsp', 'nimls', 'bashls', 'jsonls', 'clangd' }) local cmp = require('cmp') local luasnip = require('luasnip') local cmp_select = {behavior = cmp.SelectBehavior.Select} local cmp_mappings = lsp.defaults.cmp_mappings({ ['K'] = cmp.mapping.select_prev_item(cmp_select), ['J'] = cmp.mapping.select_next_item(cmp_select), [''] = cmp.mapping.confirm({select =true}), [''] = cmp.mapping.complete(), -- the next two mappings are for usin Tab and S-Tab for -- navigating inside of snippets [''] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() elseif has_words_before() then cmp.complete() else fallback() end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end end, { "i", "s" }), }) lsp.set_preferences({ sign_icons = {} }) lsp.on_attach(function(client, bufnr) local opts = {buffer = bufnr, remap = false} vim.keymap.set("n", "K", function() vim.lsp.buf.hover() end, opts) vim.keymap.set("n", "gd", function() vim.lsp.buf.definition() end, opts) vim.keymap.set("n", "gt", function() vim.lsp.buf.type_definition() end, opts) vim.keymap.set("n", "gi", function() vim.lsp.buf.implementation() end, opts) vim.keymap.set("n", "r", function() vim.lsp.buf.rename() end, opts) end) -- Enable the custom keymappings lsp.setup_nvim_cmp({ mapping = cmp_mappings }) lsp.setup()