Language Server Protocol (LSP) support for vim & neovim, featured as VSCode
Clone or download

Conqure of Completion

CI (Linux, macOS) Coverage Gitter Doc
Build Status Badge Coverage Badge Gitter Badge Doc Badge

Coc is an intellisense engine for vim8 & neovim.

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.


Table of contents

Completion sources

Name Description Filetypes Requirement
around Words of current buffer. all
buffer Words of none current buffer. all
dictionary Words from files of dictionary option. all
tag Words from taglist of current buffer. all
file Filename completion. all
omni Invoke omnifunc for complete items []
word Words from google 10000 english repo. all
emoji Emoji characters. all
include Full path completion. all
gocode Completion using gocode ['go'] Install gocode
ultisnips Snippets completion all Install ultisnips
neco Viml completion vim Install neco-vim
neosnippet Snippets completion all Install neosnippet.vim
  • To enable omni source for certain files, open coc-settings.json by :CocConfig, then add configuration like:

    "coc.source.omni.filetypes": ["python"],
  • To complete sources: include, emoji and word, use mapping of <Plug>(coc-complete-custom)


Extension are powerful than configured language server. Checkout Using coc extensions.

  • coc-tsserver

    Used for javascript and typescript

      :CocInstall coc-tsserver
  • coc-html

    Used for html handlebars razor

      :CocInstall coc-html
  • coc-json

    Used for json and jsonc

      :CocInstall coc-json
  • coc-css

    Used for css scss less and wxss

      :CocInstall coc-css
  • coc-wxml

      :CocInstall coc-wxml
  • coc-vetur

    Used for vue

      :CocInstall coc-vetur
  • coc-java

    Used for java

      :CocInstall coc-java
  • coc-solargraph

    Used for ruby

    Install solargraph by:

      gem install solargraph


      :CocInstall coc-solargraph
  • coc-pyls

    Used for python

    Install pyls by:

      pip install 'python-language-server[all]'


      :CocInstall coc-pyls
  • coc-stylelint

    Used for css wxss scss less markdown postcss sugarss vue.

      :CocInstall coc-stylelint
  • coc-eslint

    Used for javascript

      :CocInstall coc-eslint
  • coc-tslint

    Used for typescript

      :CocInstall coc-tslint
  • coc-prettier

    Prettier extension.

      :CocInstall coc-prettier
  • coc-jest

    Jest extension.

      :CocInstall coc-jest

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

" always show signcolumns
set signcolumn=yes

" Use tab for trigger completion with characters ahead and navigate.
inoremap <silent><expr> <TAB>
      \ pumvisible() ? "\<C-n>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

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

" Use <C-x><C-o> to complete 'word', 'emoji' and 'include' sources
imap <silent> <C-x><C-o> <Plug>(coc-complete-custom)

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'

" Use <cr> for confirm completion.
" 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>')
    call CocAction('doHover')

" Show signature help while editing
autocmd CursorHoldI * silent! call CocAction('showSignatureHelp')

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

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

" 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
let g:lightline = {
      \ 'colorscheme': 'wombat',
      \ 'active': {
      \   'left': [ [ 'mode', 'paste' ],
      \             [ 'cocstatus', 'readonly', 'filename', 'modified' ] ]
      \ },
      \ 'component_function': {
      \   'cocstatus': 'coc#status'
      \ },
      \ }

" Shortcuts for denite interface
" 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>


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


FOSSA Status