如何配置nvim-cmp在TeX文件中实现文本单词自动补全?
解决nvim-cmp在TeX文件中无法提供文本单词补全的问题
你的问题出在buffer源的默认配置上——它对TeX文件的单词识别规则不适用,导致无法提取文件内重复出现的单词作为补全候选。虽然原生的<C-x><C-n>能生效,但nvim-cmp需要明确配置适配TeX的单词匹配规则。
修改方案
调整buffer源的opts,添加keyword_pattern参数,让它能正确识别TeX文件中的单词:
{ name = 'buffer', opts = { get_bufnrs = function() return vim.api.nvim_list_bufs() end, -- 适配TeX的单词匹配规则,\k对应vim的iskeyword字符集 keyword_pattern = [[\k\+]] }, },
完整修改后的配置
local cmp = require 'cmp' local luasnip = require 'luasnip' require('luasnip.loaders.from_vscode').lazy_load() luasnip.config.setup {} cmp.setup { snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert { ['<C-n>'] = cmp.mapping.select_next_item(), ['<C-p>'] = cmp.mapping.select_prev_item(), ['<C-d>'] = cmp.mapping.scroll_docs(-4), ['<C-f>'] = cmp.mapping.scroll_docs(4), ['<C-Space>'] = cmp.mapping.complete {}, ['<CR>'] = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = true, }, ['<Tab>'] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expand_or_locally_jumpable() then luasnip.expand_or_jump() else fallback() end end, { 'i', 's' }), ['<S-Tab>'] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.locally_jumpable(-1) then luasnip.jump(-1) else fallback() end end, { 'i', 's' }), }, sources = { { name = 'nvim_lsp' }, --{ name = 'luasnip' }, { name = 'buffer', opts = { get_bufnrs = function() return vim.api.nvim_list_bufs() end, keyword_pattern = [[\k\+]] }, }, { name = 'path' }, }, }
原理说明
默认的buffer源单词匹配规则可能会被TeX文件中的特殊字符(比如命令符号、下划线等)干扰,导致无法正确识别连续的英文单词。\k\+会匹配vim中iskeyword选项定义的所有字符,这和原生<C-x><C-n>的单词识别逻辑一致,因此能提取出TeX文件中重复出现的单词作为补全候选,和Lua文件中显示的"Text"标记补全效果一致。
内容的提问来源于stack exchange,提问作者caffeinemachine
相关产品推荐
相关产品推荐

