Skip to content
Intellisense engine for vim8 & neovim, full language server protocol support as VSCode
TypeScript Vim script Other
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Update (#1138) Sep 10, 2019
.vim refactor(extensions): support install taged extension Jul 5, 2019
autoload Improve zenity color selection modal message (#1285) Oct 20, 2019
bin chore(plugin): remove unused tsserverForkStart Jun 12, 2019
data feat(completion): add suggest.completionDefaultSortMethod (#1262) Oct 12, 2019
doc fix(document): fix b:coc_enabled not working Oct 18, 2019
plugin Link CocFloating to NormalFloat in neovim (#1279) Oct 19, 2019
src feat(sources): add priority to source state Oct 18, 2019
.gitignore Update .gitignore (#1042) Jul 30, 2019
.ignore fix diagnostic, lint issues Jun 29, 2018
.npmignore refactor(extensions): support install taged extension Jul 5, 2019
.travis.yml test(travis.yml): run test on node 10/12 Oct 16, 2019 chore(Readme): udpate backers Oct 15, 2019 docs: add Jun 7, 2019 refactor compltetion Jun 16, 2018 Fixed Backers alignment (#1273) Oct 16, 2019 Release v0.0.74 Aug 18, 2019
install.cmd refactor(install): new publish logic Jun 15, 2019 refactor(util): install script not needed for release code Jul 11, 2019
jest.js fix(test): fix fail of integration test Dec 26, 2018
package.json fix(float): fix window not closed Sep 28, 2019 fix(util): fix release script Jul 11, 2019
tsconfig.json chore(tsconfig): set noUnusedLocals to false Jun 20, 2019
tslint.json chore(tslint): remove no-unused-variable Jun 20, 2019
webpack.config.js feat(plugin): add REVISION to CocInfo Apr 3, 2019
yarn.lock fix(float): fix window not closed Sep 28, 2019

Coc Logo

Make your vim/neovim as smart as VSCode.

Software License Bountysource Travis Coverage Doc Gitter

Coc is an intellisense engine for vim8 & neovim.

It works on vim >= 8.0 and neovim >= 0.3.1.

It's a completion framework and language server client which supports extension features of VSCode.


True snippet and additional text editing support

Floating windows require the nightly build of vim >= 8.1.1522, follow steps in the faq. Floating windows are supported in neovim >= 0.4.0.

Check out doc/coc.txt for the vim interface.


Completion experience

You might be wondering why yet another completion engine since there is the already widely used YouCompleteMe and deoplete.nvim.

Below are the reasons that led coc.nvim to build its own engine:

  • Full LSP completion support, especially snippet and additionalTextEdit feature, you'll understand why it's awesome when you experience it with a coc extension like coc-tsserver.
  • Asynchronous and parallel completion request, unless using vim sources, your vim will never be blocked.
  • Does completion resolving on completion item change. The details from completion items are echoed after being selected, this feature requires the CompleteChanged autocmd to work.
  • Incomplete request and cancel request support, only incomplete completion requests would be triggered on filtering completion items and cancellation requests are sent to servers only when necessary.
  • Start completion without timer. The completion will start after you type the first letter of a word by default and is filtered with new input after the completion has finished. Other completion engines use a timer to trigger completion so you always have to wait after the typed character.
  • Realtime buffer keywords. Coc will generate buffer keywords on buffer change in the background (with debounce), while some completion engines use a cache which isn't always correct. Plus, Locality bonus feature from VSCode is enabled by default.
  • Filter completion items when possible. When you do a fuzzy filter with completion items, some completion engines will trigger a new completion, but coc.nvim will filter the items when possible which makes it much faster. Filtering completion items on backspace is also supported.

Table of contents

Completion sources

Completion from words in buffers and file paths completions are supported by default.

For other completion sources, check out:

Or you can create a custom source.


Extensions are more powerful than a configured language server. Check out Using coc extensions.

Plus more! To get a full list of coc extensions, search coc.nvim on npm, or use coc-marketplace, which can search and install extensions in coc.nvim directly.

Note: use :CocConfig to edit the configuration file. Completion & validation are supported after coc-json is installed.

Example vim configuration

Configuration is required to make coc.nvim easier to work with, since it doesn't change your key-mappings or vim options. This is done as much as possible to avoid conflict with your other plugins.

❗️Important: some vim plugins could change keymappings. Use a command like :verbose imap <tab> to make sure that your keymap has taken effect.

" if hidden is not set, TextEdit might fail.
set hidden

" Some servers have issues with backup files, see #649
set nobackup
set nowritebackup

" Better display for messages
set cmdheight=2

" You will have bad experience for diagnostic messages when it's default 4000.
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'

" Use <c-space> to trigger completion.
inoremap <silent><expr> <c-space> coc#refresh()

" Use <cr> to 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>"
" Or use `complete_info` if your vim support it, like:
" inoremap <expr> <cr> complete_info()["selected"] != "-1" ? "\<C-y>" : "\<C-g>u\<CR>"

" Use `[g` and `]g` to navigate diagnostics
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <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 to show documentation in preview window
nnoremap <silent> K :call <SID>show_documentation()<CR>

function! s:show_documentation()
  if (index(['vim','help'], &filetype) >= 0)
    execute 'h '.expand('<cword>')
    call CocAction('doHover')

" 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
xmap <leader>f  <Plug>(coc-format-selected)
nmap <leader>f  <Plug>(coc-format-selected)

augroup mygroup
  " 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
xmap <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)

" Create mappings for function text object, requires document symbols feature of languageserver.
xmap if <Plug>(coc-funcobj-i)
xmap af <Plug>(coc-funcobj-a)
omap if <Plug>(coc-funcobj-i)
omap af <Plug>(coc-funcobj-a)

" Use <C-d> for select selections ranges, needs server support, like: coc-tsserver, coc-python
nmap <silent> <C-d> <Plug>(coc-range-select)
xmap <silent> <C-d> <Plug>(coc-range-select)

" Use `:Format` to format current buffer
command! -nargs=0 Format :call CocAction('format')

" Use `:Fold` to fold current buffer
command! -nargs=? Fold :call     CocAction('fold', <f-args>)

" use `:OR` for organize import of current buffer
command! -nargs=0 OR   :call     CocAction('runCommand', 'editor.action.organizeImport')

" Add status line support, for integration with other plugin, checkout `:h coc-status`
set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}

" 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>


Trouble shooting

Try these steps when you have problem with coc.nvim.

  • Make sure your vim version >= 8.0 by command :version.
  • If service failed to start, use command :CocInfo or :checkhealth on neovim.
  • Checkout the log of coc.nvim by command :CocOpenLog.
  • When you have issue with a languageserver, it's recommended to checkout the output


❤️ coc.nvim? Help us keep it alive by donating funds😘!

oblitum free-easy ruanyl robjuffermans iamcco phcerdan sarene robtrac raidou tomspeak taigacute weirongxu tbo darthShadow Matt Greer malob Emigre OkanEsen Lennaert Meijvogel Nils Landt dlants RCVU yatli mikker Velovix stCarolas Robbie Clarken hallettj appelgriebsch cosminadrianpopescu partizan ksaldana1 jesperryom JackCA peymanmortazavi jonaustin Yuriy Ivanyuk abenz1267 Sh3Rm4n mwcz Philipp-M gvelchuru JSamir toby de havilland viniciusarcanjo Mike Hearn darsto pyrho Frydac gsa9 _andys8 iago-lito ddaletski jonatan-branting yutakatay kevinrambaud tomaskallup LewisSteele




You can’t perform that action at this time.