VimPlugin: nvim-lspconfig

From wikinotes

Pre-Made configurations for various neovim lsps.

Documentation

github https://github.com/neovim/nvim-lspconfig
wiki: autocompletion https://github.com/neovim/nvim-lspconfig/wiki/Autocompletion
:h lspconfig https://github.com/neovim/nvim-lspconfig/blob/master/doc/lspconfig.txt
:h lspconfig-all https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md

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