Advanced techniques - hrsh7th/nvim-cmp GitHub Wiki

This page contains advanced techniques.

Managing completion timing completely

nvim-cmp has a programmatic API. So you can manage the completion behavior by yourself.

See https://github.com/hrsh7th/nvim-cmp/issues/519#issuecomment-1091109258

Disabling completion in certain contexts, such as comments

See https://github.com/hrsh7th/nvim-cmp/pull/676#issuecomment-2736795535

require('cmp').setup({
  enabled = function()
    local disabled = false
    disabled = disabled or (vim.api.nvim_get_option_value('buftype', { buf = 0 }) == 'prompt')
    disabled = disabled or (vim.fn.reg_recording() ~= '')
    disabled = disabled or (vim.fn.reg_executing() ~= '')
    disabled = disabled or require('cmp.config.context').in_treesitter_capture('comment')
    return not disabled
  end,
})

Disabling cmdline completion for certain commands, such as IncRename

cmp.setup.cmdline(':', {
  sources = { --[ your sources ](/hrsh7th/nvim-cmp/wiki/-your-sources-) },
  enabled = function()
    -- Set of commands where cmp will be disabled
    local disabled = {
        IncRename = true
    }
    -- Get first word of cmdline
    local cmd = vim.fn.getcmdline():match("%S+")
    -- Return true if cmd isn't disabled
    -- else call/return cmp.close(), which returns false
    return not disabled[cmd] or cmp.close()
  end
})

Add parentheses after selecting function or method item

nvim-autopairs

-- If you want insert `(` after select function or method item
local cmp_autopairs = require('nvim-autopairs.completion.cmp')
local cmp = require('cmp')
cmp.event:on(
  'confirm_done',
  cmp_autopairs.on_confirm_done()
)

Disable / Enable cmp sources only on certain buffers

If you encounter a situation where a specific cmp source is acting slow on certain files, either due to their size or due to a bug in the cmp source, you can run cmp.setup.buffer({...}) as a part of an BufReadPre autocmd, instead of in the generic cmp.setup({...}) command. Here's an example of a configuration that doesn't add sources in cmp.setup({...}), but sets a proper autocmd and doesn't add the treesitter source if the file is too big.

-- default sources for all buffers
local default_cmp_sources = cmp.config.sources({
	{ name = 'nvim_lsp' },
	{ name = 'nvim_lsp_signature_help' },
}, {
	{ name = 'vsnip' },
	{ name = 'path' }
})
-- If a file is too large, I don't want to add to it's cmp sources treesitter, see:
-- https://github.com/hrsh7th/nvim-cmp/issues/1522
vim.api.nvim_create_autocmd('BufReadPre', {
	callback = function(t)
		local sources = default_cmp_sources
		if not bufIsBig(t.buf) then
			sources[#sources+1] = {name = 'treesitter', group_index = 2}
		end
	cmp.setup.buffer {
		sources = sources
	}
	end
})

And the bufIsBig function, takes a buffer index and returns if it's considered big. This function can be adjusted to your liking. Here's an example that works with the above:

bufIsBig = function(bufnr)
	local max_filesize = 100 * 1024 -- 100 KB
	local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(bufnr))
	if ok and stats and stats.size > max_filesize then
		return true
	else
		return false
	end
end

The example above is based upon the idea in #1522.