VimPlugin: nvim-lspconfig
From wikinotes
Pre-Made configurations for various neovim lsps.
Documentation
Usage
:LspInfo " list LSP clients activated on current buffer, and all available :LspRestart " restart all started LSP clients :LspLog " stdout/stderr of lsp servers
Config
Plug 'neovim/nvim-lspconfig' Plug 'hrsh7th/nvim-cmp' Plug 'hrsh7th/cmp-nvim-lsp' Plug 'saadparwaiz1/cmp_luasnip' Plug 'L3MON4D3/LuaSnip' lua << EOF -- ============== -- Define Servers -- ============== local servers = { 'gopls' } -- ============== -- Setup Callback -- ============== local custom_lsp_attach = function(client) -- `:help nvim_buf_set_keymap()` vim.api.nvim_buf_set_keymap(0, 'n', 'K', '<cmd>lua vim.lsp.buf.hover()<CR>', {noremap = true}) vim.api.nvim_buf_set_keymap(0, 'n', '<c-]>', '<cmd>lua vim.lsp.buf.definition()<CR>', {noremap = true}) -- LSP omnifunc (`:h omnifunc, ins-completion`) vim.api.nvim_buf_set_option(0, 'omnifunc', 'v:lua.vim.lsp.omnifunc') -- LSP formatexpr (`:help formatexpr`) vim.api.nvim_buf_set_option(0, 'formatexpr', 'v:lua.vim.lsp.formatexpr()') end -- ========== -- LSP setups -- ========== -- Add additional capabilities supported by nvim-cmp local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) -- Enable LSPs local lspconfig = require('lspconfig') for _, lsp in ipairs(servers) do lspconfig[lsp].setup { on_attach = custom_lsp_attach, capatilities = capatilities, } end -- Customize Completion Behaviour local luasnip = require 'luasnip' local cmp = require 'cmp' cmp.setup { snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert({ ['<C-d>'] = cmp.mapping.scroll_docs(-4), ['<C-f>'] = cmp.mapping.scroll_docs(4), ['<C-Space>'] = cmp.mapping.complete(), ['<CR>'] = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true, }, ['<Tab>'] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() else fallback() end end, { 'i', 's' }), ['<S-Tab>'] = 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' }), }), sources = { { name = 'nvim_lsp' }, { name = 'luasnip' }, }, } EOF