简述

2022/11/13
原插件williamboman/nvim-lsp-installer停止更新,新项目地址williamboman/mason.nvim
,用法同原插件类似。
~/.config/nvim/lua/lsp/init.lua文件中,函数update_capabilities更新为default_capabilities

记录配置nvim LSP过程。nvim版本:v0.7.2。所需插件:neovim/nvim-lspconfig,williamboman/nvim-lsp-installer

目录结构:

与LSP相关的配置全部置于~/.config/nvim/lua/lsp文件夹中。

使用lua配置nvim,可将配置内容依据喜好放置在不同文件,只需要在~/.config/nvim/init.lua中指明有哪些配置文件即可。

安装LSP插件

packer

  use "williamboman/nvim-lsp-installer"use 'neovim/nvim-lspconfig'
  • nvim-lspconfig: 配置LSP服务器
  • nvim-lsp-installer: 下载对应语言所需要的LSP服务器

配置文件

~/.config/nvim/init.lua中导入自定义的lsp模块

require("lsp")

当一个文件夹中存在init.lua文件时,可在~/.config/nvim/init.lua中直接导入该文件夹。~/.config/nvim/lua文件夹是属于自动检索路径。

文件:~/.config/nvim/lua/lsp/init.lua

require("nvim-lsp-installer").setup{}-- Mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
local opts = { noremap=true, silent=true }
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist, opts)local lspconfig = require("lspconfig")
local function on_attach(client, bufnr) -- set up buffer keymaps, etc.-- Mappings.-- See `:help vim.lsp.*` for documentation on any of the below functionslocal bufopts = { noremap=true, silent=true, buffer=bufnr }vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, bufopts)vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, bufopts)vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
endlocal lsp_flags = {debounce_text_changes = 100,
}-- Setup lspconfig.
local capabilities = require('cmp_nvim_lsp').default_capabilities(vim.lsp.protocol.make_client_capabilities())

该部分主要是设置LSP信息提示时间,按键映射。来自nvim-config插件主页中的Suggested configuration部分。

安装LSP服务器

输入命令:LspInstallInfo调出插件nvim-lsp-installer界面。

i可安装当前光标下的LSP服务器。服务器是以zip文件形式下载的,需要确保本地环境有zip,unzip两个命令。 默认下载/安装路径为:~/.local/share/nvim/lsp_servers

启动LSP服务

~/.config/nvim/lua/lsp/init.lua文件尾添加启动配置。

-- after local capabilities = ....
-- start server
lspconfig.sumneko_lua.setup {on_attach = on_attach,flags = lsp_flags,capabilities = capabilities,settings = {Lua = {runtime = {version = 'LuaJIT',},diagnostics = {globals = {"vim", "packer_bootstrap"},},workspace = {library = vim.api.nvim_get_runtime_file("", true),},telemetry = {enable = false,},},},
}lspconfig.pyright.setup {on_attach = on_attach,flags = lsp_flags,capabilities = capabilities,settings = {python = {analysis = {autoSearchPaths = true,diagnosticMode = "workspace",useLibraryCodeForTypes = true,typeCheckingMode = "off",}}},
}

在这里可以查看所有nvim支持的LSP服务器默认设置。前三个参数是启动所有LSP服务器都需要填写的,就是将前面配置的内容传递给LSP服务器。后面的setting部分不一定需要修改。上面的配置启动了lua与python语言的LSP服务器。

到这里LSP已经配置完成,能够显示语法检查的错误信息等。

修改LSP提示信息风格

文件: ~/.config/nvim/lua/lsp/handlers.lua

-- Configure lsp information display style
local M = {}M.setup = function()-- replace the lsp info symbollocal signs = {{ name = "DiagnosticSignError", text = "" },{ name = "DiagnosticSignWarn", text = "" },{ name = "DiagnosticSignHint", text = "" },{ name = "DiagnosticSignInfo", text = "" },}for _, sign in ipairs(signs) dovim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = "" })end-- set the style of lsp infolocal config = {-- disable virtual text-- the message show after the current line.virtual_text = false,-- show signssigns = {active = signs,},update_in_insert = true,underline = true,severity_sort = true,float = {focusable = false,style = "minimal",border = "rounded",source = "always",header = "",prefix = "",},}vim.diagnostic.config(config)-- set the popup window bordervim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {border = "rounded",})vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, {border = "rounded",})
endreturn M

主要是将提示标志修改成nerd font字体符号,修改文档信息等呼出窗口为有边框模式等。其中virtual_text这一设置控制是否在有语法错误的那一行末显示错误信息的精简内容。

~/.config/nvim/lua/lsp/init.lua文件末导入该文件,使配置生效。

-- after start lsp server config....
-- change info style of lsp
require("lsp.handlers").setup()

效果

红色框中的内容便是最终LSP显示的信息样式。

LSP 是不怎么提供补全内容的,在nvim-lspconfig插件页面有启动默认补全的设置,这里没有使用,后续通过nvim-cmp插件来提过更加完善的补全效果。错误信息内容需要通过前面配置快捷键<space>+e呼出。

代码补全

所需插件

这里使用的是nvim-cmp搭配ultisnips进行补全与代码片段实现。所用到的插件都是nvim-cmp页面中Recommended Configuration部分所罗列的设置。核心插件是nvim-cmp, cmp-nvim-lsp提供LSP的语法补全,其他插件只是完善作用。

配置nvim-cmp

文件:~/.config/nvim/lua/lsp/cmp.lua

--   פּ ﯟ   some other good icons
local kind_icons = {Text = "",Method = "m",Function = "",Constructor = "",Field = "",Variable = "",Class = "",Interface = "",Module = "",Property = "",Unit = "",Value = "",Enum = "",Keyword = "",Snippet = "",Color = "",File = "",Reference = "",Folder = "",EnumMember = "",Constant = "",Struct = "",Event = "",Operator = "",TypeParameter = "",
}
-- find more here: https://www.nerdfonts.com/cheat-sheetlocal t = function(str)return vim.api.nvim_replace_termcodes(str, true, true, true)
end
local cmp = require('cmp')cmp.setup{snippet = {expand = function(args)vim.fn["UltiSnips#Anon"](args.body)end,},window = {completion = cmp.config.window.bordered(),documentation = cmp.config.window.bordered(),},mapping = {["<Tab>"] = cmp.mapping({c = function()if cmp.visible() thencmp.select_next_item({ behavior = cmp.SelectBehavior.Insert })elsecmp.complete()endend,i = function(fallback)if cmp.visible() thencmp.select_next_item({ behavior = cmp.SelectBehavior.Insert })elsefallback()endend}),["<S-Tab>"] = cmp.mapping({c = function()if cmp.visible() thencmp.select_prev_item({ behavior = cmp.SelectBehavior.Insert })elsecmp.complete()endend,i = function(fallback)if cmp.visible() thencmp.select_prev_item({ behavior = cmp.SelectBehavior.Insert })elsefallback()endend}),['<Down>'] = cmp.mapping(cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Select }), {'i'}),['<Up>'] = cmp.mapping(cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Select }), {'i'}),['<C-n>'] = cmp.mapping({c = function()if cmp.visible() thencmp.select_next_item({ behavior = cmp.SelectBehavior.Select })elsevim.api.nvim_feedkeys(t('<Down>'), 'n', true)endend,i = function(fallback)if cmp.visible() thencmp.select_next_item({ behavior = cmp.SelectBehavior.Select })elsefallback()endend}),['<C-p>'] = cmp.mapping({c = function()if cmp.visible() thencmp.select_prev_item({ behavior = cmp.SelectBehavior.Select })elsevim.api.nvim_feedkeys(t('<Up>'), 'n', true)endend,i = function(fallback)if cmp.visible() thencmp.select_prev_item({ behavior = cmp.SelectBehavior.Select })elsefallback()endend}),['<C-b>'] = cmp.mapping(cmp.mapping.scroll_docs(-4), {'i', 'c'}),['<C-f>'] = cmp.mapping(cmp.mapping.scroll_docs(4), {'i', 'c'}),--['<C-e>'] = cmp.mapping(cmp.mapping.complete(), {'i', 'c'}),--['<C-e>'] = cmp.mapping({ i = cmp.mapping.close(), c = cmp.mapping.close() }),['<CR>'] = cmp.mapping({i = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true }),c = function(fallback)if cmp.visible() thencmp.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true})elsefallback()endend}),},formatting = {fields = { "kind", "abbr", "menu" },format = function(entry, vim_item)-- Kind iconsvim_item.kind = string.format("%s", kind_icons[vim_item.kind])vim_item.menu = ({nvim_lsp = "[LSP]",ultisnips = "[Snippet]",buffer = "[Buffer]",path = "[Path]",})[entry.source.name]return vim_itemend,},sources = cmp.config.sources({{ name = 'nvim_lsp' },{ name = 'ultisnips' },}, {{ name = 'buffer' },{ name = 'path' },})
}-- Set configuration for specific filetype.
cmp.setup.filetype('gitcommit', {sources = cmp.config.sources({{ name = 'cmp_git' }, -- You can specify the `cmp_git` source if you were installed it.}, {{ name = 'buffer' },})
})-- Use buffer source foj `/` (if you enabled `native_menu`, this won't work anymore).
cmp.setup.cmdline('/', {completion = { autocomplete = false },sources = {{ name = 'buffer' }}
})-- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore).
cmp.setup.cmdline(':', {completion = { autocomplete = false },sources = cmp.config.sources({{ name = 'path' }}, {{ name = 'cmdline' }})
})

配置内容主要来自插件nvim-cmp主页Recommended Configuration部分。只是添加了一些nerd font图标,并根据Wiki部分做了部分修改。

主页中使用的代码片段插件不是ultisnips。上面提供了多种选择。

启动补全

在文件~/.config/nvim/lua/lsp/init.lua文件末添加如下内容。

-- after require("lsp.handlers").setup()...
-- start cmp
require("lsp.cmp")

最终效果

[neovim/nvim] LSP 与代码补全配置笔记相关推荐

  1. 配置Eclipse支持java和xml文件的代码补全功能

    本文介绍如何配置Eclipse,使得在编写代码时无论是*.java还是*.xml文件都能够通过使用ALT+/快捷键实现代码不全的功能. 本文实验环境为:Windows 7 + Eclipse 一.配置 ...

  2. html没有代码补全 vscode_借助clangd实现VSCode C++代码补全

    YCM推荐选项 由于C++语言的复杂性,根据语义对C++进行代码补全并非易事.最近浏览YouCompleteMe项目,发现它已经开始向用户推荐使用clangd作为C++ Completer.与libc ...

  3. 国产 Java 代码补全神器,aiXcoder 2.0 实测

    来源 | 纯洁的微笑 国人的「代码补全工具」aiXcoder近期推出了「本地2.0新版」,笔者感觉试用一番... 发现新的2.0版一改之前1.0版对电脑性能的要求,在笔记本上运行也能保持稳.准.狠!而 ...

  4. 生命不息,折腾不止~Vim编辑器,插件,编译,补全配置(2018)

    ps:打算记录windows下gvim和linux下vim的配置.省的每次意外都到处找博客,重新配置. 一个古老强大的编辑器.单纯的喜欢在酷炫的终端下默默写着代码. (用过sublime, vscod ...

  5. Linux中 vim 实现代码补全

    Linux中 vim 实现代码补全 vim 中代码补全 步骤1:判断 步骤2:安装 `OmniCppComplete` 步骤3: 步骤4:些许其他操作 结果 利用 Tab 键进行补全 vim 中代码补 ...

  6. esplise自定义快捷代码补全_Ecplise更便捷的自动补全功能设置及改良

    最近遇到了一些需要用搜索引擎解决的问题,在专栏里我一般不会放出来,不会像CSDN那样将几十个人把一个答案复制到自己的CSDN下,我尽量不去污染搜索结果和影响有问题需要解决的人的体验 比如困扰我的一个问 ...

  7. jupyter 改注释字体_Jupyter Notebook主题字体设置及自动代码补全

    安装# Jupyter Notebook 用久了就离不开了,然而自带的主题真的不忍直视.为了视力着想,为了自己看起来舒服,于是折腾了一番..在 github 上发现了一个 jupyter-themes ...

  8. vscode插件快餐教程(5) - 代码补全

    vscode插件快餐教程(5) - 代码补全 上节我们介绍了lsp的基本框架和协议的三次握手. 下面我们先学习一个最简单的功能协议:给vscode发送一条通知. LSP窗口消息 在LSP协议中,跟窗口 ...

  9. Vim使用Vundle安装代码补全插件(YouCompleteMe)

    Vim使用Vundle安装代码补全插件(YouCompleteMe) 安装 Vundle 它的使用方法很简单,安装一个插件只需要在 ~/.vimrc 按照规则中添加 Plugin 的名称,某些需要添加 ...

最新文章

  1. go语言学习(二)——Gin 框架简介
  2. unity,standalone下自定义分辨率不起作用的解法
  3. Java多线程编程模式实战指南(二):Immutable Object模式--转载
  4. 使用xmlhttp结合asp,实现网页的异步调用_asp实例
  5. 在将计算机技术应用于会计工作的初期,所开发的会计核算软件主要用于,电算化考前试七.doc...
  6. AIM Tech Round 4 (Div. 2)ABCD
  7. 检测和语义分割_分割和对象检测-第5部分
  8. java enummap_Java EnumMap get()方法与示例
  9. java中 下列不合法的语句_在Java中,下列( )是不合法的赋值语句。_学小易找答案...
  10. 随想录(学校研究和公司研发)
  11. 如何分组Windows窗体单选按钮?
  12. Bailian4101 晶矿的个数【DFS】
  13. eclipse里面自动添加get和set方法
  14. 1.2、使用pip安装Python包
  15. systrace的使用
  16. 前端图片压缩(几乎无损)
  17. Android4.4r1(KitKat)源码下载地址
  18. 【机器人仿真Webots教程】-Webots安装
  19. JPA 中对象 set 属性时自动保存
  20. 2018全球机器学习技术大会7月27-28日就等你来!

热门文章

  1. 瀑布模型与“V”模式开发模型有何异同?
  2. Vue 2 即将成为过去
  3. 现实中的无人机也可以像蜘蛛侠一样“吐丝”了
  4. 计算机视觉的相关会议,计算机视觉相关会议
  5. 配置Visual Studio Code的SciLab开发环境
  6. 三跨考研浙江大学计算机,浙江大学交互设计考研经历分享(原来跨考这么受欢迎)...
  7. python--真气网监测站点数据的抓取
  8. unknown filesystem解决方案
  9. 【笔记】wlan - 基础概念(无线、wifi、常见协议、频谱、信道、ap部署、案例)
  10. 1、OpenCV——图片的读、改、显、存操作函数