CI (Linux, macOS) | Coverage | Gitter | 中文 Gitter |
---|---|---|---|
Coc is an intellisense engine for vim8 & neovim.
It works on vim >= 8.1
and neovim >= 0.3.1
.
It's a completion framework, language server client which support extension features of VSCode
True snippet and additional text edit support
To make floating window works, follow steps in faq.
Checkout doc/coc.txt for vim interface.
- 🚀 Fast: instant increment completion, increment buffer sync using buffer update events.
- 💎 Reliable: typed language, tested with CI.
- 🌟 Featured: full LSP support
- ❤️ Flexible: configured as VSCode, extensions works like VSCode
You might wondering why another completion engine since there're already widely used YouCompleteMe and deoplete.nvim.
Below is the reasons that lead to coc.nvim build it's own engine:
- Full LSP completion support, especially snippet and
additionalTextEdit
feature, you'll understand why it's awesome when you experience it with coc extension likecoc-tsserver
. - Asynchronous and parallel completion request, unless using vim sources, your vim will never blocked.
- Does completion resolve on completion item change. The detail from complete
item is echoed after selected, this feature requires
MenuPopupChanged
autocmd to work. - Incomplete request and cancel request support, only incomplete complete request would be trigger on filter complete items and cancellation request is send to servers when necessary.
- Start completion without timer. The completion would start after you type first letter of word by default, and filtered with new input when completion finished, while some completion engine use timer to trigger completion and you always have to wait after type character.
- Realtime buffer keywords. Coc generate buffer keywords on buffer change in background (with debounce), while some completion engines use cache which could be wrong sometimes. And Locality bonus feature from VSCode is enabled by default.
- Filter completion items when possible. When your does fuzzy filter with completion items, some completion engines would trigger new completion, but coc.nvim filter the items when possible which makes it much faster. Filter completion items on backspace is also supported.
-
For vim-plug user. Add:
Plug 'neoclide/coc.nvim', {'tag': '*', 'do': { -> coc#util#install()}}
Or build from source code by install nodejs and yarn
curl -sL install-node.now.sh/lts | sh curl --compressed -o- -L https://yarnpkg.com/install.sh | bash
And add:
Plug 'neoclide/coc.nvim', {'tag': '*', 'do': 'yarn install'}
to your
.vimrc
orinit.vim
, restart vim and run:PlugInstall
.For other plugin manager, run command
:call coc#util#build()
to build coc from source code.Note: for vim user, global installed vim-node-rpc module required.
Note: to build from master, don't use
'tag': '*'
inPlug
command.Note: The first time of building from source code could be slow.
Completion for words of buffers and file path are supported by default.
For other completion sources, check out:
- coc-sources: includes some common completion source extensions.
- coc-neco: viml completion support.
- coc-vimtex: vimtex integration.
- coc-neoinclude: neoinclude integration.
Or you can create custom source.
Extension are powerful than configured language server. Checkout Using coc extensions.
- coc-json for
json
. - coc-tsserver for
javascript
andtypescript
. - coc-html for
html
,handlebars
andrazor
. - coc-css for
css
,scss
andless
. - coc-vetur for
vue
, use vetur. - coc-java for
java
, use eclipse.jdt.ls. - coc-solargraph for
ruby
, use solargraph. - coc-rls for
rust
, use Rust Language Server - coc-yaml for
yaml
- coc-pyls for
python
, use Python Language Server - coc-highlight provide default document symbol highlight and colors support.
- coc-emmet provide emmet suggest in completion list.
- coc-snippets provide snippets solution.
And more, to get full list of coc extensions, search coc.nvim on npm.
Note: use :CocConfig
to edit configuration file, auto completion is
supported after coc-json
installed.
" if hidden not set, TextEdit might fail.
set hidden
" Better display for messages
set cmdheight=2
" Smaller updatetime for CursorHold & CursorHoldI
set updatetime=300
" don't give |ins-completion-menu| messages.
set shortmess+=c
" always show signcolumns
set signcolumn=yes
" Use tab for trigger completion with characters ahead and navigate.
" Use command ':verbose imap <tab>' to make sure tab is not mapped by other plugin.
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
" Use <c-space> for trigger completion.
inoremap <silent><expr> <c-space> coc#refresh()
" Use <cr> for confirm completion, `<C-g>u` means break undo chain at current position.
" Coc only does snippet and additional edit on confirm.
inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
" Use `[c` and `]c` for navigate diagnostics
nmap <silent> [c <Plug>(coc-diagnostic-prev)
nmap <silent> ]c <Plug>(coc-diagnostic-next)
" Remap keys for gotos
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
" Use K for show documentation in preview window
nnoremap <silent> K :call <SID>show_documentation()<CR>
function! s:show_documentation()
if &filetype == 'vim'
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction
" Highlight symbol under cursor on CursorHold
autocmd CursorHold * silent call CocActionAsync('highlight')
" Remap for rename current word
nmap <leader>rn <Plug>(coc-rename)
" Remap for format selected region
vmap <leader>f <Plug>(coc-format-selected)
nmap <leader>f <Plug>(coc-format-selected)
augroup mygroup
autocmd!
" Setup formatexpr specified filetype(s).
autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
" Update signature help on jump placeholder
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end
" Remap for do codeAction of selected region, ex: `<leader>aap` for current paragraph
vmap <leader>a <Plug>(coc-codeaction-selected)
nmap <leader>a <Plug>(coc-codeaction-selected)
" Remap for do codeAction of current line
nmap <leader>ac <Plug>(coc-codeaction)
" Fix autofix problem of current line
nmap <leader>qf <Plug>(coc-fix-current)
" Use `:Format` for format current buffer
command! -nargs=0 Format :call CocAction('format')
" Use `:Fold` for fold current buffer
command! -nargs=? Fold :call CocAction('fold', <f-args>)
" Add diagnostic info for https://github.com/itchyny/lightline.vim
let g:lightline = {
\ 'colorscheme': 'wombat',
\ 'active': {
\ 'left': [ [ 'mode', 'paste' ],
\ [ 'cocstatus', 'readonly', 'filename', 'modified' ] ]
\ },
\ 'component_function': {
\ 'cocstatus': 'coc#status'
\ },
\ }
" Using CocList
" Show all diagnostics
nnoremap <silent> <space>a :<C-u>CocList diagnostics<cr>
" Manage extensions
nnoremap <silent> <space>e :<C-u>CocList extensions<cr>
" Show commands
nnoremap <silent> <space>c :<C-u>CocList commands<cr>
" Find symbol of current document
nnoremap <silent> <space>o :<C-u>CocList outline<cr>
" Search workspace symbols
nnoremap <silent> <space>s :<C-u>CocList -I symbols<cr>
" Do default action for next item.
nnoremap <silent> <space>j :<C-u>CocNext<CR>
" Do default action for previous item.
nnoremap <silent> <space>k :<C-u>CocPrev<CR>
" Resume latest coc list
nnoremap <silent> <space>p :<C-u>CocListResume<CR>
-
If you think it's useful, give it a star.
-
If you have a question, ask at gitter
-
如果你是中文用户,请到 中文 gitter 提问
-
If something not working, create a issue.
-
If you want to help, but don't have time, consider donate to neovim or sponsor vim.