当前位置: 首页 > news >正文

使用lsp-zero.nvim配置Neovim的LSP支持教程

使用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),仅供参考

http://www.cnnetsun.cn/news/146078.html

相关文章:

  • AI写论文哪个软件最好?让数字学伴照亮知识的长夜
  • FaceFusion支持时间轴编辑,精确到每一帧
  • Kotaemon能否替代传统CRM客服模块?答案是肯定的
  • 3步搞定Beszel大版本升级:告别数据丢失和兼容性恐慌
  • 对比传统try-catch与现代化retry库的效率差异
  • 5分钟让你的终端告别单调:Oh-My-Bash终极美化指南
  • 传统vsAI:雨滴插件开发效率对比
  • 5分钟快速验证函数式接口设计思路
  • 我用AI生成的C++八股文拿到了大厂offer
  • AI如何优化Hystrix熔断策略?智能调参实战
  • 3D感知系统中的坐标变换技术终极指南:从原理到实战应用
  • 14天速成LLM高手!大佬开源学习笔记,GitHub狂揽700星
  • 揭秘Open-AutoGLM自动回复机制:如何用3步实现社交平台智能应答
  • 1小时验证创意:用快马平台打造游戏下载加速器原型
  • Kotaemon西医诊断辅助:循证医学知识即时调用
  • 零基础玩转Nginx WebSocket:从安装到上线
  • 提示词定制化革命来临,Open-AutoGLM如何实现90%以上任务准确率?
  • UUID生成效率对比:传统编程 vs AI自动生成
  • Faceniff实战:企业如何防范内部网络攻击
  • 口碑好的冲孔打桩机企业
  • FaceFusion镜像通过ISO安全认证,合规性强
  • 1小时打造在线协作白板:Nginx+WebSocket速成
  • AI如何解决VSCode文件切换卡顿问题
  • Gboard词库Magisk模块终极指南:彻底解决中文输入痛点
  • AI帮你诊断:为什么BAT文件一闪而过?
  • 从金融到医疗,Open-AutoGLM 覆盖的50+领域你了解几个?
  • Buildbot自动化部署实战:5步构建企业级CI/CD流水线
  • Kotaemon提供SDK开发包,加快二次开发速度
  • YOLOv13技术突破:从传统关联建模到超图计算范式革新
  • Caddy证书自动化终极指南:5大核心机制深度解析