如何在Neovim nvim-cmp中显示自动导入的路径与来源库名
nvim-cmp 配置实现TS/JS补全项显示本地路径与第三方库来源
通过自定义nvim-cmp的formatting.format回调,直接读取LSP返回的补全项元数据即可实现需求,不需要额外安装专用插件。
完整配置代码
配置写入nvim-cmp的setup调用参数中即可生效:
local cmp = require('cmp') local lspkind = require('lspkind') -- 已安装lspkind图标插件的前提下使用,未安装可移除相关逻辑 cmp.setup({ -- 其余基础配置(快捷键、源配置等)保持原有内容不变 formatting = { format = function(entry, vim_item) -- 加载默认图标配置 vim_item.kind = lspkind.symbolic(vim_item.kind, { mode = 'symbol' }) -- 仅处理TS/JS类LSP返回的补全项 if entry.source.name == 'nvim_lsp' then local ok, ts_data = pcall(function() return entry.completion_item.data end) if ok and ts_data then -- 第三方npm包场景 if ts_data.packageName then -- 菜单展示包名,搭配专属图标和高亮 vim_item.menu = string.format("<%s>", ts_data.packageName) vim_item.kind_hl_group = "CmpThirdPartyModule" vim_item.kind = "📦 " .. vim_item.kind -- 本地模块场景 elseif ts_data.relativePath then -- 菜单展示本地路径,搭配专属图标和高亮 local short_path = ts_data.relativePath:match("([^/]+%.%w+)$") or ts_data.relativePath vim_item.menu = string.format("./%s", short_path) vim_item.kind_hl_group = "CmpLocalModule" vim_item.kind = "📂 " .. vim_item.kind end end end -- 其他来源补全项的默认菜单标识 vim_item.menu = vim_item.menu or ({ buffer = "[Buffer]", path = "[Path]", cmdline = "[Cmd]" })[entry.source.name] return vim_item end } }) -- 自定义两类补全项的高亮样式,可根据自身配色调整色值和字体属性 vim.api.nvim_set_hl(0, "CmpThirdPartyModule", { fg = "#f7768e", bold = true }) vim.api.nvim_set_hl(0, "CmpLocalModule", { fg = "#7aa2f7", italic = true })
配置说明
- 路径展示规则:默认本地模块仅展示文件名,需要展示完整相对路径时,移除
ts_data.relativePath:match(...)的截取逻辑,直接传入ts_data.relativePath即可。 - 视觉区分规则:示例中第三方库使用📦图标+红色加粗样式,本地模块使用📂图标+蓝色斜体样式,可自行修改图标内容、高亮参数匹配个人使用习惯。
- LSP兼容性:配置默认适配
tsserver、vtsls、typescript-tools.nvim三类主流TS/JS语言服务,若使用其他LSP实现,可在format回调中加print(vim.inspect(entry.completion_item))打印补全项结构,调整对应字段的取值逻辑即可。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

