Conquer of Completion
CI (Linux, macOS) | Coverage | Gitter | Doc |
---|
| | | |
Coc is an intellisense engine for vim8 & neovim. It only 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
Checkout doc/coc.txt for vim interface.
Why?
Completion experience
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 like coc-tsserver
. - Does completion resolve on completion item change. The detail from complete
item is echoed after selected, we will have floating window for documentation
when floating window is supported.
- 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 (which would trigger TextChangedI during completion), some
completion engines would trigger new completion, but coc filter the items when
possible which makes coc much faster. Filter completion items on backspace is
also supported.
Table of contents
Completion sources
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.
Or you can create custom source.
Extensions
Extension are powerful than configured language server. Checkout
Using coc extensions.
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.
Example vim configuration
" 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'
\ },
\ }
" Shortcuts for denite interface
" Show extension list
nnoremap <silent> <space>e :<C-u>Denite coc-extension<cr>
" Show symbols of current buffer
nnoremap <silent> <space>o :<C-u>Denite coc-symbols<cr>
" Search symbols of current workspace
nnoremap <silent> <space>t :<C-u>Denite coc-workspace<cr>
" Show diagnostics of current workspace
nnoremap <silent> <space>a :<C-u>Denite coc-diagnostic<cr>
" Show available commands
nnoremap <silent> <space>c :<C-u>Denite coc-command<cr>
" Show available services
nnoremap <silent> <space>s :<C-u>Denite coc-service<cr>
" Show links of current buffer
nnoremap <silent> <space>l :<C-u>Denite coc-link<cr>
Feedback
If you like this plugin, star it! It's a great way of getting feedback. The same goes for reporting issues or feature requests.
Contact: Gitter Twitter
LICENSE