diff options
Diffstat (limited to 'after/plugin/lsp.lua')
-rw-r--r-- | after/plugin/lsp.lua | 120 |
1 files changed, 71 insertions, 49 deletions
diff --git a/after/plugin/lsp.lua b/after/plugin/lsp.lua index cfb10e8..7722c1e 100644 --- a/after/plugin/lsp.lua +++ b/after/plugin/lsp.lua @@ -1,59 +1,81 @@ -local lsp = require("lsp-zero") +-- Setup autocomplete/LSP clients +local lspconfig = require('lspconfig') +local lsp_capabilities = require('cmp_nvim_lsp').default_capabilities() -lsp.preset("recommended") +local servers = {"clangd", "zls", "rust_analyzer", "lua_ls"} + for _, lsp in pairs(servers) do + lspconfig[lsp].setup { + capabilities = lsp_capabilities, + on_attach = onattach, + flags = {debounce_text_changes = 500} + } +end -lsp.setup_servers({ - 'clangd', - 'rust_analyzer', - 'lua_ls', -}) +vim.api.nvim_create_autocmd('LspAttach', { + desc = 'LSP actions', + callback = function() + local bufmap = function(mode, lhs, rhs) + local opts = {buffer = true} + vim.keymap.set(mode, lhs, rhs, opts) + end --- Fix Undefined global 'vim' -lsp.nvim_workspace() + bufmap('n', 'K', '<cmd>lua vim.lsp.buf.hover()<cr>') + bufmap('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<cr>') + bufmap('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<cr>') + bufmap('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<cr>') + bufmap('n', 'go', '<cmd>lua vim.lsp.buf.type_definition()<cr>') + bufmap('n', 'gr', '<cmd>lua vim.lsp.buf.references()<cr>') + bufmap('n', 'gs', '<cmd>lua vim.lsp.buf.signature_help()<cr>') + bufmap('n', '<F2>', '<cmd>lua vim.lsp.buf.rename()<cr>') + bufmap('n', '<F4>', '<cmd>lua vim.lsp.buf.code_action()<cr>') + bufmap('n', 'gl', '<cmd>lua vim.diagnostic.open_float()<cr>') + bufmap('n', '[d', '<cmd>lua vim.diagnostic.goto_prev()<cr>') + bufmap('n', ']d', '<cmd>lua vim.diagnostic.goto_next()<cr>') + end +}) +require('luasnip.loaders.from_vscode').lazy_load() local cmp = require('cmp') -local cmp_select = {behavior = cmp.SelectBehavior.Select} -local cmp_mappings = lsp.defaults.cmp_mappings({ - ['<C-p>'] = cmp.mapping.select_prev_item(cmp_select), - ['<C-n>'] = cmp.mapping.select_next_item(cmp_select), - ['<C-y>'] = cmp.mapping.confirm({ select = true }), - ["<C-Space>"] = cmp.mapping.complete(), -}) +local luasnip = require('luasnip') -cmp_mappings['<Tab>'] = nil -cmp_mappings['<S-Tab>'] = nil +local select_opts = {behavior = cmp.SelectBehavior.Select} +cmp.setup({ + formatting = { + fields = {'menu', 'abbr', 'kind'}, + format = function(entry, item) + local menu_icon = { + nvim_lsp = 'λ', + luasnip = '⋗', + buffer = 'Ω', + path = '🖫', + } + item.menu = menu_icon[entry.source.name] + return item + end, + }, + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end + }, + sources = { + {name = 'path'}, + {name = 'nvim_lsp', keyword_length = 1}, + {name = 'buffer', keyword_length = 3}, + {name = 'luasnip', keyword_length = 2}, + }, + mapping = { + ['<Up>'] = cmp.mapping.select_prev_item(select_opts), + ['<Down>'] = cmp.mapping.select_next_item(select_opts), -lsp.setup_nvim_cmp({ - mapping = cmp_mappings -}) + ['<C-p>'] = cmp.mapping.select_prev_item(select_opts), + ['<C-n>'] = cmp.mapping.select_next_item(select_opts), -lsp.set_preferences({ - suggest_lsp_servers = false, - sign_icons = { - error = 'E', - warn = 'W', - hint = 'H', - info = 'I' - } -}) + ['<C-u>'] = cmp.mapping.scroll_docs(-4), + ['<C-d>'] = cmp.mapping.scroll_docs(4), -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_next() end, opts) - vim.keymap.set("n", "]d", function() vim.diagnostic.goto_prev() end, opts) - vim.keymap.set("n", "<leader>vca", function() vim.lsp.buf.code_action() 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) - -lsp.setup() - -vim.diagnostic.config({ - virtual_text = true + ['<C-e>'] = cmp.mapping.abort(), + ['<C-y>'] = cmp.mapping.confirm({select = true}), + ['<CR>'] = cmp.mapping.confirm({select = false}), + }, }) |