local lsp = require('lsp-zero') lsp.preset('recommended') lsp.on_attach(function(client, bufnr) local opts = { buffer = bufnr, remap = false } vim.keymap.set('n', 'gd', function() vim.lsp.buf.definition() end, opts) vim.keymap.set('n', 'K', function() vim.lsp.buf.hover() end, opts) vim.keymap.set('n', '<leader>vws', function() vim.lsp.buf.workspace_symbol() end, opts) vim.keymap.set('n', '<leader>vd', function() vim.diagnostic.open_float() end, opts) vim.keymap.set('n', '[d', function() vim.diagnostic.goto_prev() end, opts) vim.keymap.set('n', ']d', function() vim.diagnostic.goto_next() end, opts) vim.keymap.set('n', '<leader>vca', function() vim.lsp.buf.code_actions() end, opts) vim.keymap.set('n', '<leader>vrr', function() vim.lsp.buf.references() end, opts) vim.keymap.set('n', '<leader>vrn', function() vim.lsp.buf.rename() end, opts) vim.keymap.set('i', '<C-h>', function() vim.lsp.buf.signature_help() end, opts) end) require('mason').setup({ servers = { 'clangd', }, }) require('mason-lspconfig').setup({ ensure_installed = { 'eslint', 'rust_analyzer', 'lua_ls', 'gopls', 'arduino_language_server', 'bashls', 'perlnavigator', 'clangd', 'yamlls', }, handlers = { lsp.default_setup, }, }) -- langs require('lspconfig').gopls.setup({ settings = { gopls = { analyses = { unreachable = true, unusedparams = true, }, codelenses = { generate = true, gc_details = true, }, annotations = { bounds = true, escape = true, inline = true, }, gofumpt = true, }, }, }) require('lspconfig').clangd.setup({ settings = { clangd = { mason = false, }, }, }) require'lspconfig'.perlnavigator.setup{ cmd = { "perlnavigator" }, settings = { perlnavigator = { perlPath = 'perl', enableWarnings = true, perltidyProfile = '', perlcriticProfile = '', perlcriticEnabled = true, } } } require'lspconfig'.terraformls.setup{} vim.api.nvim_create_autocmd({"BufWritePre"}, { pattern = {"*.tf", "*.tfvars"}, callback = function() vim.lsp.buf.format() end, }) -- cmp local cmp = require('cmp') local cmp_select = { behavior = cmp.SelectBehavior.Select } cmp.setup({ window = { -- completion = cmp.config.window.bordered(), -- documentation = cmp.config.window.bordered(), }, mapping = cmp.mapping.preset.insert({ ['<C-j>'] = cmp.mapping.select_next_item(cmp_select), ['<C-k>'] = cmp.mapping.select_prev_item(cmp_select), ['<C-b>'] = cmp.mapping.scroll_docs(-4), ['<C-f>'] = cmp.mapping.scroll_docs(4), ['<C-Space>'] = cmp.mapping.complete(), ['<C-e>'] = cmp.mapping.abort(), ['<CR>'] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. ['<C-i>'] = 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 = 'vsnip' }, -- For vsnip users. -- { name = 'luasnip' }, -- For luasnip users. -- { name = 'ultisnips' }, -- For ultisnips users. -- { name = 'snippy' }, -- For snippy users. }, { { name = 'buffer' }, }) }) -- Set configuration for specific filetype. cmp.setup.filetype('gitcommit', { sources = cmp.config.sources({ { name = 'git' }, -- You can specify the `git` source if [you were installed it](https://github.com/petertriho/cmp-git). }, { { name = 'buffer' }, }) }) -- Use buffer source for `/` and `?` (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_mappings = lsp.defaults.cmp_mappings({ }) lsp.set_preferences({ -- sign_icons = { } sign_icons = { 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 lspkind = require('lspkind') cmp.setup { formatting = { format = lspkind.cmp_format({ mode = 'symbol', -- show only symbol annotations maxwidth = 50, -- prevent the popup from showing more than provided characters (e.g 50 will not show more than 50 characters) ellipsis_char = '...', -- when popup menu exceed maxwidth, the truncated part would show ellipsis_char instead (must define maxwidth first) -- The function below will be called before any actual modifications from lspkind -- so that you can provide more controls on popup customization. (See [#30](https://github.com/onsails/lspkind-nvim/pull/30)) before = function (entry, vim_item) return vim_item end }) } } -- local lspconfig = require'lspconfig' -- lspconfig.ccls.setup { -- init_options = { -- compilationDatabaseDirectory = "build"; -- index = { -- threads = 0; -- }; -- clang = { -- excludeArgs = { "-frounding-math" }; -- }; -- } -- } lsp.setup()