lsp-setup.nvim icon indicating copy to clipboard operation
lsp-setup.nvim copied to clipboard

A simple wrapper for nvim-lspconfig and mason-lspconfig to easily setup LSP servers.

lsp-setup.nvim

A simple wrapper for nvim-lspconfig and mason-lspconfig to easily setup LSP servers.

Installation

  • Neovim >= 0.7
  • nvim-lspconfig
  • mason.nvim & mason-lspconfig.nvim

packer.nvim

use {
    'junnplus/lsp-setup.nvim',
    requires = {
        'neovim/nvim-lspconfig',
        'williamboman/mason.nvim',
        'williamboman/mason-lspconfig.nvim',
    }
}

vim-plug

Plug 'junnplus/lsp-setup.nvim'
Plug 'neovim/nvim-lspconfig'
Plug 'williamboman/mason.nvim'
Plug 'williamboman/mason-lspconfig.nvim'

Usage

require('lsp-setup').setup({
    servers = {
        pylsp = {}
    }
})

You can replace pylsp with the LSP server name you need, see available LSPs.

Also support installing custom versions of LSP servers, for example:

require('lsp-setup').setup({
    servers = {
        ['rust_analyzer@nightly'] = {}
    }
})

Setup structure

require('lsp-setup').setup({
    -- Default mappings
    -- gD = 'lua vim.lsp.buf.declaration()',
    -- gd = 'lua vim.lsp.buf.definition()',
    -- gt = 'lua vim.lsp.buf.type_definition()',
    -- gi = 'lua vim.lsp.buf.implementation()',
    -- gr = 'lua vim.lsp.buf.references()',
    -- K = 'lua vim.lsp.buf.hover()',
    -- ['<C-k>'] = 'lua vim.lsp.buf.signature_help()',
    -- ['<space>rn'] = 'lua vim.lsp.buf.rename()',
    -- ['<space>ca'] = 'lua vim.lsp.buf.code_action()',
    -- ['<space>f'] = 'lua vim.lsp.buf.formatting()',
    -- ['<space>e'] = 'lua vim.diagnostic.open_float()',
    -- ['[d'] = 'lua vim.diagnostic.goto_prev()',
    -- [']d'] = 'lua vim.diagnostic.goto_next()',
    default_mappings = true,
    -- Custom mappings, will overwrite the default mappings for the same key
    -- Example mappings for telescope pickers:
    -- gd = 'lua require"telescope.builtin".lsp_definitions()',
    -- gi = 'lua require"telescope.builtin".lsp_implementations()',
    -- gr = 'lua require"telescope.builtin".lsp_references()',
    mappings = {},
    -- Global on_attach
    on_attach = function(client, bufnr)
        -- Support custom the on_attach function for global
        -- Formatting on save as default
        require('lsp-setup.utils').format_on_save(client)
    end,
    -- Global capabilities
    capabilities = vim.lsp.protocol.make_client_capabilities(),
    -- Configuration of LSP servers 
    servers = {
        -- Install LSP servers automatically
        -- LSP server configuration please see: https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md
        -- pylsp = {},
        -- rust_analyzer = {
        --     settings = {
        --         ['rust-analyzer'] = {
        --             cargo = {
        --                 loadOutDirsFromCheck = true,
        --             },
        --             procMacro = {
        --                 enable = true,
        --             },
        --         },
        --     },
        -- },
    },
})

Integrations

cmp-nvim-lsp or coq_nvim

If installed, will auto advertise capabilities to LSP servers.

lua-dev

-- Setup sumneko_lua with lua-dev
require('lsp-setup').setup({
    servers = {
        sumneko_lua = require('lua-dev').setup({
            lspconfig = {
                settings = {
                    Lua = {
                        format = {
                            enable = true,
                        }
                    }
                }
            },
        }),
    }
})

rust-tools.nvim

Using require('lsp-setup.rust-tools').setup({}) instead of require('rust-tools').setup({}).

require('lsp-setup').setup({
    servers = {
        rust_analyzer = require('lsp-setup.rust-tools').setup({
            server = {
                settings = {
                    ['rust-analyzer'] = {
                        cargo = {
                            loadOutDirsFromCheck = true,
                        },
                        procMacro = {
                            enable = true,
                        },
                    },
                },
            },
        })
    }
})

clangd_extensions.nvim

Using require('lsp-setup.clangd_extensions').setup({}) instead of require('clangd_extensions').setup({}).

require('lsp-setup').setup({
    servers = {
        clangd = require('lsp-setup.clangd_extensions').setup({})
    }
})

Contributing

Bug reports and feature requests are welcome! PRs are doubly welcome!