Skip to content

Completion with sources

André Sbrocco Figueiredo edited this page May 13, 2020 · 60 revisions

Coc.nvim has full support for Language Server Protocol completion, including snippet and additional text edits support.

By default, coc.nvim use its own completeopt option during completion to provide the best auto completion experience.

There's no function of coc.nvim that can be used as omnifunc because it's not possible to support all LSP completion features when using omnifunc.

Trigger mode of completion

There are 3 different trigger modes:

  • always, the default mode, which triggers completion on a letter inserted or triggerCharacters (or trigger pattern match) defined by the current activated sources.
  • trigger, only trigger completion when you type triggerCharacters (or trigger pattern match) defined by the completion sources.
  • none, disable auto trigger completion, you will have to trigger the completion manually.

Some completion behavior can be changed by using the configuration file.

To change the trigger mode, add:

"suggest.autoTrigger": "trigger"

To support completion trigger on insert enter, add

"suggest.triggerAfterInsertEnter": true

To change the completion timeout, use:

"suggest.timeout": 500,

To make the completion automatically select the first completed item, use:

"suggest.noselect": false,

To make the completion trigger with two input characters, use:

"suggest.minTriggerInputLength": 2

To enable the commit characters feature, use:

"suggest.acceptSuggestionOnCommitCharacter": true

To change the indicator of snippet items, use:

"suggest.snippetIndicator": "►"

To get the full list checkout the help by :h coc-configuration in your vim.

Use <Tab> or custom key for trigger completion

You can make use of coc#refresh() for trigger completion like this:

" use <tab> for trigger completion and navigate to the next complete item
function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~ '\s'
endfunction

inoremap <silent><expr> <Tab>
      \ pumvisible() ? "\<C-n>" :
      \ <SID>check_back_space() ? "\<Tab>" :
      \ coc#refresh()

Note: the <tab> could be remapped by another plugin, use :verbose imap <tab> to check if it's mapped as expected.

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

Some terminals may send <NUL> when you press <c-space>, so you could instead:

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

Improve the completion experience

  • Use <Tab> and <S-Tab> to navigate the completion list:

    inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
    inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
  • Use <cr> to confirm completion

    inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"

    Note: you have to remap <cr> to make sure it confirm completion when pum is visible.

    Note: \<C-g>u is used to break undo level.

    To make <cr> select the first completion item and confirm the completion when no item has been selected:

    inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm() : "\<C-g>u\<CR>"

    To make coc.nvim format your code on <cr>, use keymap:

    inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm() : "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
  • Close the preview window when completion is done.

    autocmd! CompleteDone * if pumvisible() == 0 | pclose | endif
  • Setup coc behaviour for specified filetype(s)

    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

Those lines are present at the suggested .vimrc config file. If you won't use, remove them to avoid unexpected behaviour!!!!

Completion sources

Bundled sources.

Name Shortcut Description
around [A] Words of the current buffer.
buffer [B] Words of other open buffers.
file [F] Filename completion, auto detected.

Configuring sources

You can configure completion sources by using coc-settings.json

  • "coc.source.{name}.enable": controls if the source is enabled.
  • "coc.source.{name}.shortcut": shortcut used in completion menu.
  • "coc.source.{name}.priority": priority of the source, lower priority sources will be sorted after high priority sources when they have same score.
  • "coc.source.{name}.disableSyntaxes": syntax names used to disable source from completion, eg: ["comment", "string"]
  • "coc.source.around.firstMatch": Filter complete items by first letter strict match, default true.
  • "coc.source.buffer.firstMatch": Filter complete items by first letter strict match, default true.
  • "coc.source.buffer.ignoreGitignore": Ignore git ignored files for buffer words, default true.
  • "coc.source.file.trimSameExts": Filename extensions to trim extension names on file completion, default [".ts", ".js"]
  • "coc.source.file.ignoreHidden": Ignore completion for hidden files, default true.
  • coc.source.file.ignorePatterns: Ignore patterns of matcher module, default [].

More sources

REPL

Clone this wiki locally