Ncm2
:heart: Slim, Fast and Hackable Completion Framework for Neovim
Install / Use
/learn @ncm2/Ncm2README
Introduction
Ncm2 is a slim, async and hackable completion framework for neovim.
Main features:
- Fast and asynchronous completion support, with vimscript friendly API.
- Smart on files with different languages, for example, css/javascript completion in html style/script tag.
- Function parameter expansion support using ncm2-snippet plugins.
- Language server protocol plugin integration.
Read our wiki page for a list of extensions and programming languages support for NCM2.

Requirements
Install
For lazy.nvim
return {
-- requirements
{ "roxma/nvim-yarp" },
{
"ncm2/ncm2",
config = function()
vim.opt.completeopt = { "noinsert", "menuone", "noselect" }
vim.api.nvim_create_autocmd({'BufEnter'}, {
pattern = {'*'},
callback = function(ev)
vim.call('ncm2#enable_for_buffer')
end
})
end,
},
-- NOTE: you need to install completion sources to get completions. Check
-- our wiki page for a list of sources: https://github.com/ncm2/ncm2/wiki
{ 'ncm2/ncm2-bufword' },
{ 'ncm2/ncm2-path' },
}
For vim-plug
" assuming you're using vim-plug: https://github.com/junegunn/vim-plug
Plug 'ncm2/ncm2'
Plug 'roxma/nvim-yarp'
" enable ncm2 for all buffers
autocmd BufEnter * call ncm2#enable_for_buffer()
" IMPORTANT: :help Ncm2PopupOpen for more information
set completeopt=noinsert,menuone,noselect
" NOTE: you need to install completion sources to get completions. Check
" our wiki page for a list of sources: https://github.com/ncm2/ncm2/wiki
Plug 'ncm2/ncm2-bufword'
Plug 'ncm2/ncm2-path'
Optional Vimrc Tips
" suppress the annoying 'match x of y', 'The only match' and 'Pattern not
" found' messages
set shortmess+=c
" CTRL-C doesn't trigger the InsertLeave autocmd . map to <ESC> instead.
inoremap <c-c> <ESC>
" When the <Enter> key is pressed while the popup menu is visible, it only
" hides the menu. Use this mapping to close the menu and also start a new
" line.
inoremap <expr> <CR> (pumvisible() ? "\<c-y>\<cr>" : "\<CR>")
" Use <TAB> to select the popup menu:
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
" wrap existing omnifunc
" Note that omnifunc does not run in background and may probably block the
" editor. If you don't want to be blocked by omnifunc too often, you could
" add 180ms delay before the omni wrapper:
" 'on_complete': ['ncm2#on_complete#delay', 180,
" \ 'ncm2#on_complete#omni', 'csscomplete#CompleteCSS'],
au User Ncm2Plugin call ncm2#register_source({
\ 'name' : 'css',
\ 'priority': 9,
\ 'subscope_enable': 1,
\ 'scope': ['css','scss'],
\ 'mark': 'css',
\ 'word_pattern': '[\w\-]+',
\ 'complete_pattern': ':\s*',
\ 'on_complete': ['ncm2#on_complete#omni', 'csscomplete#CompleteCSS'],
\ })
How Do I write Ncm2 Source?
One important step is to understand how and when completion gets triggered.
Read :help ncm2#register_source carefully, or :help ncm2#register_source-example for quick start.
In case you don't know what tool you should use for async support. Here are some options available:
:help jobstart()- python remote plugin example
- I myself prefer to use nvim-yarp
- Read ncm2/ncm2-bufword for example
Debugging
Refer to the debugging section of nvim-yarp
Related Skills
node-connect
346.8kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
107.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
346.8kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
346.8kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
