使用lsp-zero.nvim配置Neovim的LSP支持教程
【免费下载链接】lsp-zero.nvimA starting point to setup some lsp related features in neovim.项目地址: https://gitcode.com/gh_mirrors/ls/lsp-zero.nvim
前言
语言服务器协议(LSP)是现代代码编辑器的核心功能之一,它能提供智能代码补全、错误检查、重构等强大功能。本文将详细介绍如何使用lsp-zero.nvim插件为Neovim配置完整的LSP支持环境。
环境准备
在开始配置前,请确保满足以下条件:
- 熟悉Neovim基本操作:了解普通模式、插入模式和命令模式的切换
- 已安装Neovim v0.10或更高版本
- 系统已安装git工具
创建配置文件
Neovim的配置文件init.lua位置因操作系统而异,可通过以下命令查询:
nvim --headless -c 'echo stdpath("config")' -c 'echo ""' -c 'quit'创建该目录并新建init.lua文件。之后可通过命令快速访问配置文件:
nvim -c 'edit $MYVIMRC'插件管理器安装
我们将使用lazy.nvim作为插件管理器,它能极大简化插件管理流程。
添加以下代码实现自动安装:
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim' if not vim.uv.fs_stat(lazypath) then print('正在安装lazy.nvim...') vim.fn.system({ 'git', 'clone', '--filter=blob:none', 'https://gitcode.com/gh_mirrors/ls/lsp-zero.nvim', '--branch=stable', lazypath, }) print('安装完成。') end vim.opt.rtp:prepend(lazypath)添加主题插件
以tokyonight.nvim主题插件为例,在setup中添加插件:
require('lazy').setup({ {'folke/tokyonight.nvim'}, })在文件末尾添加主题设置:
vim.opt.termguicolors = true vim.cmd.colorscheme('tokyonight')LSP核心配置
添加必要插件
require('lazy').setup({ {'folke/tokyonight.nvim'}, {'neovim/nvim-lspconfig'}, {'hrsh7th/cmp-nvim-lsp'}, {'hrsh7th/nvim-cmp'}, })基础LSP设置
-- 保留侧边栏空间 vim.opt.signcolumn = 'yes' -- 配置LSP能力 local lspconfig_defaults = require('lspconfig').util.default_config lspconfig_defaults.capabilities = vim.tbl_deep_extend( 'force', lspconfig_defaults.capabilities, require('cmp_nvim_lsp').default_capabilities() ) -- LSP快捷键绑定 vim.api.nvim_create_autocmd('LspAttach', { desc = 'LSP操作', callback = function(event) local opts = {buffer = event.buf} vim.keymap.set('n', 'K', '<cmd>lua vim.lsp.buf.hover()<cr>', opts) vim.keymap.set('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<cr>', opts) vim.keymap.set('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<cr>', opts) vim.keymap.set('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<cr>', opts) vim.keymap.set('n', 'go', '<cmd>lua vim.lsp.buf.type_definition()<cr>', opts) vim.keymap.set('n', 'gr', '<cmd>lua vim.lsp.buf.references()<cr>', opts) vim.keymap.set('n', 'gs', '<cmd>lua vim.lsp.buf.signature_help()<cr>', opts) vim.keymap.set('n', '<F2>', '<cmd>lua vim.lsp.buf.rename()<cr>', opts) vim.keymap.set({'n', 'x'}, '<F3>', '<cmd>lua vim.lsp.buf.format({async = true})<cr>', opts) vim.keymap.set('n', '<F4>', '<cmd>lua vim.lsp.buf.code_action()<cr>', opts) end, })语言服务器配置
手动安装方式
按照语言服务器文档安装所需LSP,然后在配置中启用:
require('lspconfig').gopls.setup({}) require('lspconfig').rust_analyzer.setup({})使用mason.nvim自动管理
添加额外插件:
require('lazy').setup({ {'folke/tokyonight.nvim'}, {'williamboman/mason.nvim'}, {'williamboman/mason-lspconfig.nvim'}, {'neovim/nvim-lspconfig'}, {'hrsh7th/cmp-nvim-lsp'}, {'hrsh7th/nvim-cmp'}, })配置自动安装:
require('mason').setup({}) require('mason-lspconfig').setup({ handlers = { function(server_name) require('lspconfig')[server_name].setup({}) end, }, })使用:LspInstall命令安装语言服务器。
Lua语言服务器特殊配置
创建.luarc.json文件解决全局变量警告:
{ "runtime.version": "LuaJIT", "diagnostics.globals": ["vim"], "workspace.library": ["$VIMRUNTIME"] }自动补全配置
配置nvim-cmp实现代码补全:
local cmp = require('cmp') cmp.setup({ sources = { {name = 'nvim_lsp'}, }, mapping = cmp.mapping.preset.insert({ ['<C-p>'] = cmp.mapping.select_prev_item(), ['<C-n>'] = cmp.mapping.select_next_item(), ['<CR>'] = cmp.mapping.confirm({select = false}), ['<C-Space>'] = cmp.mapping.complete(), }), snippet = { expand = function(args) vim.snippet.expand(args.body) end, }, })完整配置示例
手动管理方案
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim' if not vim.uv.fs_stat(lazypath) then print('Installing lazy.nvim....') vim.fn.system({ 'git', 'clone', '--filter=blob:none', 'https://gitcode.com/gh_mirrors/ls/lsp-zero.nvim', '--branch=stable', lazypath, }) print('Done.') end vim.opt.rtp:prepend(lazypath) require('lazy').setup({ {'folke/tokyonight.nvim'}, {'neovim/nvim-lspconfig'}, {'hrsh7th/cmp-nvim-lsp'}, {'hrsh7th/nvim-cmp'}, }) vim.opt.termguicolors = true vim.cmd.colorscheme('tokyonight') vim.opt.signcolumn = 'yes' local lspconfig_defaults = require('lspconfig').util.default_config lspconfig_defaults.capabilities = vim.tbl_deep_extend( 'force', lspconfig_defaults.capabilities, require('cmp_nvim_lsp').default_capabilities() ) vim.api.nvim_create_autocmd('LspAttach', { desc = 'LSP actions', callback = function(event) local opts = {buffer = event.buf} vim.keymap.set('n', 'K', '<cmd>lua vim.lsp.buf.hover()<cr>', opts) vim.keymap.set('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<cr>', opts) vim.keymap.set('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<cr>', opts) vim.keymap.set('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<cr>', opts) vim.keymap.set('n', 'go', '<cmd>lua vim.lsp.buf.type_definition()<cr>', opts) vim.keymap.set('n', 'gr', '<cmd>lua vim.lsp.buf.references()<cr>', opts) vim.keymap.set('n', 'gs', '<cmd>lua vim.lsp.buf.signature_help()<cr>', opts) vim.keymap.set('n', '<F2>', '<cmd>lua vim.lsp.buf.rename()<cr>', opts) vim.keymap.set({'n', 'x'}, '<F3>', '<cmd>lua vim.lsp.buf.format({async = true})<cr>', opts) vim.keymap.set('n', '<F4>', '<cmd>lua vim.lsp.buf.code_action()<cr>', opts) end, }) require('lspconfig').gopls.setup({}) require('lspconfig').rust_analyzer.setup({}) local cmp = require('cmp') cmp.setup({ sources = { {name = 'nvim_lsp'}, }, mapping = cmp.mapping.preset.insert({ ['<CR>'] = cmp.mapping.confirm({select = false}), ['<C-Space>'] = cmp.mapping.complete(), ['<C-u>'] = cmp.mapping.scroll_docs(-4), ['<C-d>'] = cmp.mapping.scroll_docs(4), }), snippet = { expand = function(args) vim.snippet.expand(args.body) end, }, })自动管理方案
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim' if not vim.uv.fs_stat(lazypath) then print('Installing lazy.nvim....') vim.fn.system({ 'git', 'clone', '--filter=blob:none', 'https://gitcode.com/gh_mirrors/ls/lsp-zero.nvim', '--branch=stable', lazypath, }) print('Done.') end vim.opt.rtp:prepend(lazypath) require('lazy').setup({ {'folke/tokyonight.nvim'}, {'williamboman/mason.nvim'}, {'williamboman/mason-lspconfig.nvim'}, {'neovim/nvim-lspconfig'}, {'hrsh7th/cmp-nvim-lsp'}, {'hrsh7th/nvim-cmp'}, }) vim.opt.termguicolors = true vim.cmd.colorscheme('tokyonight') vim.opt.signcolumn = 'yes' local lspconfig_defaults = require('lspconfig').util.default_config lspconfig_defaults.capabilities = vim.tbl_deep_extend( 'force', lspconfig_defaults.capabilities, require('cmp_nvim_lsp').default_capabilities() ) vim.api.nvim_create_autocmd('LspAttach', { desc = 'LSP actions', callback = function(event) local opts = {buffer = event.buf} vim.keymap.set('n', 'K', '<cmd>lua vim.lsp.buf.hover()<cr>', opts) vim.keymap.set('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<cr>', opts) vim.keymap.set('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<cr>', opts) vim.keymap.set('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<cr>', opts) vim.keymap.set('n', 'go', '<cmd>lua vim.lsp.buf.type_definition()<cr>', opts) vim.keymap.set('n', 'gr', '<cmd>lua vim.lsp.buf.references()<cr>', opts) vim.keymap.set('n', 'gs', '<cmd>lua vim.lsp.buf.signature_help()<cr>', opts) vim.keymap.set('n', '<F2>', '<cmd>lua vim.lsp.buf.signature_help()<cr>', opts) vim.keymap.set('n', '<F2>', '<cmd>lua vim.lsp.buf.rename()<cr>', opts) vim.keymap.set({'n', 'x'}, '<F3>', '<cmd>lua vim.lsp.buf.format({async = true})<cr>', opts) vim.keymap.set('n', '<F4>', '<cmd>lua vim.lsp.buf.code_action()<cr>', opts) end, }) require('mason').setup({}) require('mason-lspconfig').setup({ handlers = { function(server_name) require('lspconfig')[server_name].setup({}) end, }, }) local cmp = require('cmp') cmp.setup({ sources = { {name = 'nvim_lsp'}, }, mapping = cmp.mapping.preset.insert({ ['<CR>'] = cmp.mapping.confirm({select = false}), ['<C-Space>'] = cmp.mapping.complete(), ['<C-u>'] = cmp.mapping.scroll_docs(-4), ['<C-d>'] = cmp.mapping.scroll_docs(4), }), snippet = { expand = function(args) vim.snippet.expand(args.body) end, }, })结语
通过本教程,您已完成了从零开始配置Neovim的LSP支持环境。这套配置提供了现代化的插件管理、完整的LSP支持、智能代码补全和便捷的快捷键操作。您可以根据实际需求进一步定制各语言服务器的配置参数,或添加更多插件来扩展功能。
【免费下载链接】lsp-zero.nvimA starting point to setup some lsp related features in neovim.项目地址: https://gitcode.com/gh_mirrors/ls/lsp-zero.nvim
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考