Neovim下nvim-cmp的cmp-buffer源支持扩展字符的补全配置问题
解决方案1:基于iskeyword配置(推荐,和原生ctrl-p补全行为一致)
Neovim不存在旧版Vim中iskeyword无法添加编码大于255字符的限制,原生ctrl-p补全就是基于iskeyword识别单词,你可以按以下步骤配置:
- 先将你需要识别的特殊字符添加到iskeyword中,可选择全局生效或者仅针对asciidoc文件生效:
-- 仅针对asciidoc文件添加特殊字符到iskeyword vim.api.nvim_create_autocmd('FileType', { pattern = 'asciidoc', callback = function() -- 按需在列表中添加你需要支持的字符,包括带重音的Unicode字符 vim.opt_local.iskeyword:append({ 'ɔ', 'ɛ', 'ɲ', 'á', 'é', 'í', 'ó', 'ú' }) end })
- 修正nvim-cmp的配置,除了设置
keyword_pattern = [[\k\+]],可以适当调高buffer源的优先级,确保补全项不会被snippet完全覆盖:
sources = { { name = "nvim_lsp", priority = 1000 }, { name = "ultisnips", priority = 750 }, -- 缓冲区源优先级调整到低于snippet,不会影响snippet触发,同时会出现在补全列表中 { name = "buffer", priority = 500, keyword_pattern = [[\k\+]] } }
解决方案2:直接修改keyword_pattern正则(无需改动iskeyword)
如果不想修改iskeyword配置,可以直接将需要支持的特殊字符写入cmp-buffer的提取正则:
sources = { { name = "nvim_lsp" }, { name = "ultisnips" }, { name = "buffer", -- 正则中直接加入你需要识别的特殊字符,也可以用\p{L}匹配所有Unicode字母类字符 keyword_pattern = [[\%(-\?\d\+\%(\.\d\+\)\?\|\p{L}*\%([\-.]\p{L}*\)*)]], priority = 500 } }
排查验证步骤
- 打开asciidoc文件后执行
:set iskeyword?,确认你添加的特殊字符已经在输出列表中 - 执行
:CmpStatus确认buffer源处于激活状态 - 若补全列表仍无缓冲区项,可临时注释ultisnips源测试,排除优先级过低导致的过滤问题
关于你提到的iskeyword限制疑问:相关描述仅适用于旧版Vim,Neovim已完整支持Unicode字符添加到iskeyword,这也是原生ctrl-p补全能正常识别特殊字符的原因。
内容的提问来源于stack exchange,提问作者Boyd
相关产品推荐
相关产品推荐

