The purpose of this plugin is to bundle all the "boilerplate code" necessary to have nvim-cmp (a popular autocompletion plugin) and nvim-lspconfig working together. And if you opt in, it can use mason.nvim to let you install language servers from inside neovim.
If you have any question about a feature or configuration feel free to open a new discussion in this repository. Or join the chat #lsp-zero-nvim:matrix.org.
The branch v1.x has been created. lsp-zero
is oficially 1.0. I advise you use your favorite plugin manager to track the v1.x
branch. The code there will remain compatible with neovim v0.5. The next branch v2.x
will require neovim v0.8 and probably will move to a less opinionated model (which is already possible with v1). I have some ideas already, would love to know what you think.
If you are new to neovim go to the section Resources for new users.
If you know how to configure neovim go to Quickstart (for the impatient).
Also consider you might not need lsp-zero.
-
LSP
-
Autocompletion
-
How to customize lsp-zero
- Advance Usage
- API Reference (Available functions)
This section assumes you want enable every single feature lsp-zero offers. Optional and required plugins will be marked with a comment.
If you know your way around neovim and how to configure it, take a look at this examples:
I suggest you read the requirements of mason.nvim.
Make sure you have at least the minimum requirements listed in unix systems
or windows
.
Use your favorite plugin manager to install this plugin and all its lua dependencies.
With packer.nvim
:
use {
'VonHeikemen/lsp-zero.nvim',
branch = 'v1.x',
requires = {
-- LSP Support
{'neovim/nvim-lspconfig'}, -- Required
{'williamboman/mason.nvim'}, -- Optional
{'williamboman/mason-lspconfig.nvim'}, -- Optional
-- Autocompletion
{'hrsh7th/nvim-cmp'}, -- Required
{'hrsh7th/cmp-nvim-lsp'}, -- Required
{'hrsh7th/cmp-buffer'}, -- Optional
{'hrsh7th/cmp-path'}, -- Optional
{'saadparwaiz1/cmp_luasnip'}, -- Optional
{'hrsh7th/cmp-nvim-lua'}, -- Optional
-- Snippets
{'L3MON4D3/LuaSnip'}, -- Required
{'rafamadriz/friendly-snippets'}, -- Optional
}
}
With lazy.nvim
:
{
'VonHeikemen/lsp-zero.nvim',
branch = 'v1.x',
dependencies = {
-- LSP Support
{'neovim/nvim-lspconfig'}, -- Required
{'williamboman/mason.nvim'}, -- Optional
{'williamboman/mason-lspconfig.nvim'}, -- Optional
-- Autocompletion
{'hrsh7th/nvim-cmp'}, -- Required
{'hrsh7th/cmp-nvim-lsp'}, -- Required
{'hrsh7th/cmp-buffer'}, -- Optional
{'hrsh7th/cmp-path'}, -- Optional
{'saadparwaiz1/cmp_luasnip'}, -- Optional
{'hrsh7th/cmp-nvim-lua'}, -- Optional
-- Snippets
{'L3MON4D3/LuaSnip'}, -- Required
{'rafamadriz/friendly-snippets'}, -- Optional
}
}
With paq
:
{'VonHeikemen/lsp-zero.nvim', branch = 'v1.x'};
-- LSP Support
{'neovim/nvim-lspconfig'}; -- Required
{'williamboman/mason.nvim'}; -- Optional
{'williamboman/mason-lspconfig.nvim'}; -- Optional
-- Autocompletion Engine
{'hrsh7th/nvim-cmp'}; -- Required
{'hrsh7th/cmp-nvim-lsp'}; -- Required
{'hrsh7th/cmp-buffer'}; -- Optional
{'hrsh7th/cmp-path'}; -- Optional
{'saadparwaiz1/cmp_luasnip'}; -- Optional
{'hrsh7th/cmp-nvim-lua'}; -- Optional
-- Snippets
{'L3MON4D3/LuaSnip'}; -- Required
{'rafamadriz/friendly-snippets'}; -- Optional
With vim-plug
:
" LSP Support
Plug 'neovim/nvim-lspconfig' " Required
Plug 'williamboman/mason.nvim' " Optional
Plug 'williamboman/mason-lspconfig.nvim' " Optional
" Autocompletion Engine
Plug 'hrsh7th/nvim-cmp' " Required
Plug 'hrsh7th/cmp-nvim-lsp' " Required
Plug 'hrsh7th/cmp-buffer' " Optional
Plug 'hrsh7th/cmp-path' " Optional
Plug 'saadparwaiz1/cmp_luasnip' " Optional
Plug 'hrsh7th/cmp-nvim-lua' " Optional
" Snippets
Plug 'L3MON4D3/LuaSnip' " Required
Plug 'rafamadriz/friendly-snippets' " Optional
Plug 'VonHeikemen/lsp-zero.nvim', {'branch': 'v1.x'}
Inside your configuration file add this piece of lua code.
local lsp = require('lsp-zero').preset({
name = 'minimal',
set_lsp_keymaps = true,
manage_nvim_cmp = true,
suggest_lsp_servers = false,
})
-- (Optional) Configure lua language server for neovim
lsp.nvim_workspace()
lsp.setup()
If you want to install a language server for a particular file type use the command :LspInstall
. And when the installation is done restart neovim.
If you don't want to manage your language servers with mason.nvim
then you'll need to list the LSP servers you want to configure with .setup_servers().
local lsp = require('lsp-zero').preset({
name = 'minimal',
set_lsp_keymaps = true,
manage_nvim_cmp = true,
suggest_lsp_servers = false,
})
-- When you don't have mason.nvim installed
-- You'll need to list the servers installed in your system
lsp.setup_servers({'tsserver', 'eslint'})
-- (Optional) Configure lua language server for neovim
lsp.nvim_workspace()
lsp.setup()
When using vimscript you can wrap lua code in lua <<EOF ... EOF
.
lua <<EOF
local lsp = require('lsp-zero').preset({
name = 'minimal',
set_lsp_keymaps = true,
manage_nvim_cmp = true,
suggest_lsp_servers = false,
})
lsp.setup()
EOF
Remember to read the documentation for LSP and autocompletion for more details.
If you press gl
on a line with errors (or warnings) a popup window will show up, it will tell you every "diagnostic" on that line.
lsp-zero has a function that will configure the lua language server for you: nvim_workspace
That's neovim's default behavior. Modify the option signcolumn
, set it to "yes".
If you use lua.
vim.opt.signcolumn = 'yes'
If you use vimscript.
set signcolumn=yes
nvim-cmp is tricky. First check Advance usage - customize nvim-cmp, the solution you want might be there.
If the settings you want to modify are not supported by .setup_nvim_cmp() then follow this example: The current api is not enough?
I don't want to add anything to that function. If you have a good reason I will listen, but the answer will probably be no.
If you find this tool useful and want to support my efforts, buy me a coffee ☕.