local lsp = require('lsp-zero') require('mason').setup({}) require('mason-lspconfig').setup({}) lsp.preset({ name = 'recommended', }) local rust_lsp = lsp.build_options('rust_analyzer', {}) lsp.ensure_installed({ 'tsserver', 'clangd', }) -- Fix Undefined global 'vim' lsp.configure('lua-language-server', { settings = { Lua = { diagnostics = { globals = { 'vim' } } } } }) lsp.configure('clangd', { capabilities = { offsetEncoding = { "utf-16" } } }) local cmp = require('cmp') local cmp_mode = { behavior = cmp.SelectBehavior.Replace } local cmp_mappings = lsp.defaults.cmp_mappings({ [""] = cmp.mapping.select_next_item(cmp_mode), [""] = cmp.mapping.select_prev_item(cmp_mode), }) -- unmap arrow keys cmp_mappings[""] = nil cmp_mappings[""] = nil lsp.setup_nvim_cmp({ preselect = require('cmp').PreselectMode.None, completion = { completeopt = 'menu,menuone,noinsert,noselect' }, mapping = cmp_mappings, }) local cmp_config = lsp.defaults.cmp_config({ window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered() }, }) cmp.setup(cmp_config) cmp.setup.cmdline('/', { sources = { { name = 'buffer' } } }) cmp.setup.cmdline(':', { sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }) }) lsp.set_preferences({ suggest_lsp_servers = false, sign_icons = { error = '', warn = '', hint = '', info = '' } }) lsp.on_attach(function(_, bufnr) vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') local opts = { noremap = true, silent = true, buffer = bufnr } vim.keymap.set('n', 'gD', 'lua vim.lsp.buf.definition()', opts) vim.keymap.set('n', 'gT', 'lua vim.lsp.buf.type_definition()', opts) vim.keymap.set('n', 'gI', 'lua vim.lsp.buf.implementation()', opts) vim.keymap.set('n', 'gR', 'lua vim.lsp.buf.references()', opts) vim.keymap.set('n', '', 'lua vim.lsp.buf.code_action()', opts) -- Glance LSP vim.keymap.set('n', 'gd', 'Glance definitions', opts) vim.keymap.set('n', 'gt', 'Glance type_definitions', opts) vim.keymap.set('n', 'gi', 'Glance implementations', opts) vim.keymap.set('n', 'gr', 'Glance references', opts) end) lsp.setup() require('rust-tools').setup({server = rust_lsp}) vim.diagnostic.config({ virtual_text = true }) -- completion symbols vim.lsp.protocol.CompletionItemKind = { "  (Text) ", "  (Method)", "  (Function)", "  (Constructor)", " ﴲ (Field)", "[] (Variable)", "  (Class)", " ﰮ (Interface)", "  (Module)", " 襁 (Property)", "  (Unit)", "  (Value)", " 練 (Enum)", "  (Keyword)", "  (Snippet)", "  (Color)", "  (File)", "  (Reference)", "  (Folder)", "  (EnumMember)", " ﲀ (Constant)", " ﳤ (Struct)", "  (Event)", "  (Operator)", "  (TypeParameter)" }