local lsp = require('lsp-zero') local cmp = require('cmp') local luasnip = require('luasnip') require('mason').setup({}) require('mason-lspconfig').setup({}) lsp.preset({ name = 'recommended', }) lsp.ensure_installed({ 'tsserver', 'clangd', }) lsp.configure('clangd', { capabilities = { offsetEncoding = { "utf-16" } } }) local cmp_mode = { behavior = cmp.SelectBehavior.Replace } local cmp_mappings = lsp.defaults.cmp_mappings({ [""] = cmp.mapping(function(fallback) if (cmp.visible()) then cmp.select_next_item(cmp_mode) elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() else fallback() end cmp.mapping.select_next_item(cmp_mode) end, { 'i', 's' }), [""] = 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, }) 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', 'gR', 'lua vim.lsp.buf.references()', opts) -- action & rename vim.keymap.set('n', '', 'Lspsaga code_action', opts) vim.keymap.set('n', 'gr', 'Lspsaga rename', opts) -- overwrite the defaults vim.keymap.set('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) vim.keymap.set('n', 'K', 'Lspsaga hover_doc', opts) -- jump forward/backward up/down the call list vim.keymap.set('n', 'gI', 'Lspsaga incoming_calls', opts) vim.keymap.set('n', 'gO', 'Lspsaga outgoing_calls', opts) -- Sexy LSP vim.keymap.set('n', 'gd', 'Lspsaga peek_definition', opts) vim.keymap.set('n', 'gt', 'Lspsaga peek_type_definition', opts) vim.keymap.set('n', 'gr', 'Lspsaga lsp_finder', opts) -- CLANGFORMATTTTT vim.keymap.set('n', 'gf', 'lua vim.lsp.buf.format()', opts) vim.keymap.set('n', 'gw', 'StripWhitespace', opts) end) local rust_lsp = lsp.build_options('rust_analyzer', {}) require('rust-tools').setup({ server = rust_lsp }) lsp.setup() 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 = '' } }) local cmp_kinds = { 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 = "" } local cmp_config = { window = { completion = cmp.config.window.bordered(), documentation = cmp.config.window.bordered() }, formatting = { fields = { "kind", "abbr", "menu" }, format = function(entry, vim_item) vim_item.menu = ({ buffer = "", nvim_lsp = "", })[entry.source.name] -- add hints bc im stupid vim_item.menu = (vim_item.menu or ' ') .. ' ' .. vim_item.kind vim_item.kind = (cmp_kinds[vim_item.kind] or '') return vim_item end, } } cmp.setup(cmp_config) vim.api.nvim_set_hl(0, "CmpItemMenu", { italic = true }) vim.diagnostic.config({ virtual_text = true })