Skip to main content
Back to Extensions Directory
coc-snippets icon

Snippets extension for coc.nvim

Installation CommandVim prompt
:CocInstall coc-snippets
GitHub owner
Neoclide
Version
v3.4.9
npm package
coc-snippets
Requirements
coc ^0.0.82
License
MIT
Repository
GitHub
npm latest published 2026-08-08Registry checked 2026-08-23Registry summary

Published Package Summary

coc-snippets

coc-snippets

Snippets solution for coc.nvim

2019-03-23 00_09_39

Snippet preview requires neovim 0.4 or latest vim8

It's capable of:

  • Load UltiSnips snippets.
  • Load snipmate snippets.
  • Load VSCode snippets from coc.nvim extensions.
  • Load VSCode snippets from custom directories.
  • Load VSCode snippets from ${workspaceFolder}/.vscode.
  • Load UltiSnips snippets from configured folder.
  • Load massCode snippets from running massCode application (disabled by default).
  • Create massCode snippets through the snippets.editMassCodeSnippets command.
  • Provide snippets as completion items.
  • Provide expand and expandOrJump keymaps for snippet.
  • Provide snippets list for edit snippet.
  • Provide snippets.editSnippets command for edit user snippets of current filetype.

Note: some features of ultisnips and snipmate format snippets not supported, checkout Ultisnips features.

Why?

  • Use same keys for jump placeholder.
  • Nested snippet support.
  • Always async, never slows you down.
  • Preview snippet context in float window/popup.
  • Improved match for complete items with TextEdit support.
  • Edit snippets of current buffer by :CocList snippets.

Python support

Ultisnips provider needs pythonx support on (neo)vim, to check the feature exists, try:

:echo has('pythonx')

On neovim, run command:

:checkhealth

If it is not installed, run:

pip install pynvim

and make sure you have Python 3 provider for neovim installed.

On vim8, run command:

:pyx print(1)

in your vim, if it throws, it means your vim is not compiled with python support or the python dynamic lib required by vim is missing(or broken).

Note: some python code may require python feature that not supported by the python interpreter used by vim, error will throw on that case.

Error will be shown when pythonx with (neo)vim can't work, fix pythonx support or disable ultisnips support by add "snippets.ultisnips.enable": false in your configuration file.

Install

In your vim/neovim, run command:

:CocInstall coc-snippets

Examples

" Use <C-l> for trigger snippet expand.
imap <C-l> <Plug>(coc-snippets-expand)

" Use <C-j> for select text for visual placeholder of snippet.
vmap <C-j> <Plug>(coc-snippets-select)

" Use <C-j> for jump to next placeholder, it's default of coc.nvim
let g:coc_snippet_next = '<c-j>'

" Use <C-k> for jump to previous placeholder, it's default of coc.nvim
let g:coc_snippet_prev = '<c-k>'

" Use <C-j> for both expand and jump (make expand higher priority.)
imap <C-j> <Plug>(coc-snippets-expand-jump)

" Use <leader>x for convert visual selected code to snippet
xmap <leader>x  <Plug>(coc-convert-snippet)

Make <tab> used for trigger completion, completion confirm, snippet expand and jump like VSCode.

Note from coc.nvim 0.0.82, functions starts with coc#pum should be used for custom completion of coc.nvim.

inoremap <silent><expr> <TAB>
      \ coc#pum#visible() ? coc#_select_confirm() :
      \ coc#expandableOrJumpable() ? "\<C-r>=coc#rpc#request('doKeymap', ['snippets-expand-jump',''])\<CR>" :
      \ CheckBackspace() ? "\<TAB>" :
      \ coc#refresh()

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

let g:coc_snippet_next = '<tab>'

Ultisnips features

Some ultisnips features are not supported:

  • Position check of trigger option, including b, w and i.
  • Execute vim, python and shell code in snippet.
  • extends, priority and clearsnippets command in snippet file.
  • Visual placeholder.
  • Placeholder and variable transform.
  • Expression snippet.
  • Automatic trigger snippet.
  • Context snippets.
  • Support loading snipmate snippets.
  • Replacement String, (:h UltiSnips-replacement-string), requires latest coc.nvim.
  • Update python code block after change of placeholder.
  • Execute shell code with custom shabang (will not support).
  • Option m, trim all whitespaces from right side of snippet lines.
  • Reformat snippet options, including t, s.
  • All snippet actions including pre_expand, post_expand and jump (can't support).
  • snip.expand_anon() and other properties with UltiSnips actions.

Note: snip.expand_anon expand the snippet in async manner by use timer when used with pre_expand and post_expand action, which means the state is lost in your python script (should only happens on some rare cases).

Note: python regex in snippet are converted to javascript regex, however, some regex patterns can't be supported by javascript, including (?x) (?s) \Z (?(id/name)yes-pattern|no-pattern).

Functions

  • coc#expandable() return 1 when can do snippet expand.
  • coc#jumpable() return 1 when snippet activated and can jump to next placeholder.
  • coc#expandableOrJumpable() return 1 when can do snippet expand or can jump to next placeholder.

Key-mappings

Note you can't use noremap with <Plug> key-mappings.

  • <Plug>(coc-convert-snippet) Create new snippet with current selected text, visual mode only.
  • <Plug>(coc-snippets-expand) Expand snippet with current inserted text, insert mode only.
  • <Plug>(coc-snippets-expand-async) None block variant of <Plug>(coc-snippets-expand).
  • <Plug>(coc-snippets-expand-jump) Expand snippet or jump to next placeholder of current snippet when possible, insert mode only.
  • <Plug>(coc-snippets-expand-jump-async) None block variant of <Plug>(coc-snippets-expand-jump).
  • <Plug>(coc-snippets-select) Remove selected text and save to g:coc_selected_text which will replace $VISUAL on next snippet expand.

Options

  • snippets.priority: Completion source priority of snippets. Default: 90
  • snippets.editSnippetsCommand: Open command used for snippets.editSnippets command, use coc.preferences.jumpCommand by default. Default: ""
  • snippets.trace: Trace level of snippets channel, used for textmate snippets only. Default: "error" Valid options: ["error","verbose"]
  • snippets.excludePatterns: List of minimatch patterns for filepath to exclude, support expand homedir and environment variables. Default: []
  • snippets.loadFromExtensions: Enable load snippets from extensions. Default: true
  • snippets.textmateSnippetsRoots: List of directories that contains textmate/VSCode snippets to load. Default: []
  • snippets.loadVSCodeProjectSnippets: Load code snippets in folder ${workspaceFolder}/.vscode Default: true
  • snippets.extends: Configure filetypes to inherit with, ex: {"cpp": ["c"], "javascriptreact": ["javascript"]} Default: {}
  • snippets.userSnippetsDirectory: Directory that contains custom user ultisnips snippets, use ultisnips in extension root of coc.nvim by default. Default: ""
  • snippets.shortcut: Shortcut in completion menu. Default: "S"
  • snippets.triggerCharacters: Trigger characters for trigger snippets completion. Default: []
  • snippets.disableSyntaxes: Disable snippets completion when syntax name matches one of disabled syntaxes. Default: []
  • snippets.execContext: Execute a snippet's context (if it exists) to check if the snippet should be shown in completion menu Default: false
  • snippets.autoTrigger: Enable trigger auto trigger snippet after type character. Default: true
  • snippets.ultisnips.enable: Enable load snippets from ultisnips folders. Default: true
  • snippets.ultisnips.pythonPrompt: Show prompt for user when python not supported on vim. Default: true
  • snippets.ultisnips.trace: Trace verbose snippet information. Default: false
  • snippets.ultisnips.directories: Directories that searched for ultisnips snippet files, could be directory as subfolder in $runtimepath or absolute paths. Default: ["UltiSnips"]
  • snippets.massCode.enable: Enable load snippets from MassCode. Default: false
  • snippets.massCode.host: Http host of MassCode. Default: "localhost"
  • snippets.massCode.port: Http port of MassCode. Default: 3033
  • snippets.massCode.trace: Trace verbose snippet information. Default: false
  • snippets.snipmate.enable: Load snipmate snippets from snippets directory in runtimepath. Default: true
  • snippets.snipmate.trace: Trace verbose snippet information. Default: false
  • snippets.snipmate.author: Author name used for g:snips_author Default: ""

F.A.Q

Q: How to add snippet filetypes on buffer create?

A: Use autocmd like: autocmd BufRead *.md let b:coc_snippets_filetypes = ['tex']

Q: How to trigger snippets completion when type special characters?

A: Use configuration like: "snippets.triggerCharacters": ["'"]. Completion input only contains word characters, so a snippet with a non-word prefix such as /// shows up only after the trigger characters match its prefix, for example:

{
  "snippets.triggerCharacters": ["/"]
}

Alternatively, expand such snippets directly with the snippets-expand keymap, which does not require the completion menu.

Q: How to check if a snippet successfully loaded?

A: Use command :CocCommand workspace.showOutput snippets

Q: How to get debug output from snippets?

A: Enable tracing with snippets.ultisnips.trace: true, snippets.snipmate.trace: true, snippets.massCode.trace: true or snippets.trace: "verbose" (textmate snippets), then open the snippets output channel with :CocCommand snippets.openOutput. Exceptions thrown in UltiSnips python interpolation are always caught and appended to the channel with the stack trace. To log custom info from interpolation code without throwing, write to a file from the python code, e.g.:

open('/tmp/ultisnips.log', 'a').write('debug info\n')

Q: Some ultisnips snippet not works as expected.

A: Reformat after change of placeholder feature can't be supported for now, and some regex pattern can't be converted to javascript regex pattern, so the snippet can be failed to load.

Q: Where to get snippets?

A: One solution is install honza/vim-snippets which is widely used. To create snippets yourself:

  • For Ultisnips, create ${filetype}.snippets in "snippets.ultisnips.directories"
  • For snipmate snippets, create ${filetype}.snippets in snippets folder under your vim's runtimepath.
  • For VSCode snippets, create ${filetype}.json in your "snippets.textmateSnippetsRoots".

Q: Get error message ModuleNotFoundError: No module named 'vimsnippets'

A: Make sure honza/vim-snippets in your vim's &runtimepath.

Q: Do I need to install Ultisnips.

A: No! This extension is designed to work with or without Ultisnips, you can still install Ultisnips, but this extension would not run any code or read configuration from it.

Q: How to check jumpable or expandable at current position.

A: Use functions provided by coc.nvim: coc#expandable() coc#jumpable() and coc#expandableOrJumpable().

Q: How could I add custom UltiSnips snippets.

A: You can create snippet files in folder: $VIMCONFIG/coc/ultisnips, use command :CocCommand snippets.editSnippets to open user snippet of current filetype.

Supporting

If you like this extension, consider supporting me on Patreon or PayPal:

Patreon donate button

Read the complete README
  • Snippets extension for coc.nvim
Activation Events
  • *
Developer Resources

Want to build, test, or contribute to coc.nvim extensions? Explore our official SDK and testing toolkits.

Open Developer Guide

Version History

Published with coc-snippets@3.4.9 as CHANGELOG.md.

Open source file

3.4.3

  • Fix snippet file may not loaded.
  • Fix context snippet may not loaded.

3.4.2

  • Fix python async issue on vim by use vim's timer.

3.4.1

  • Execute python global scripts with current filetype only, instead of one script for all filetypes.
  • Fix known issues with UltiSnips actions.

3.4.0

  • Support all UltiSnips options, including t s and m.

3.3.1

  • Add configuration snippets.disableSyntaxes.

3.3.0

  • Add command snippets.addFiletypes for add additional snippets filetypes.
  • Support variable b:coc_snippets_filetypes on buffer create.

3.2.0

  • Add execContext-option to enable context-execution for completion.
  • Fix filepath on vim built with win32unix.

3.0.6

  • Avoid check and show context snippets in pum.

3.0.5

  • Fix snippets.editSnippets not contains global snippet files.
  • Fix snipmate viml interpolation not work.

3.0.4

  • Register snippets.editSnippets when ultisnips enabled.
  • Fix same directory check on case insensive system.

3.0.3

  • Fix trigger kind for regex snippet.

3.0.2

  • Add command snippets.openOutput.

3.0.1

  • Fix languageIds of textmate snippets.
  • Fix bad params for resolveSnippet.

3.0.0

  • Not parse ultisnip snippets.

2.5.2

  • Fix escape for $ in ultisnip body.

2.5.1

  • Respect languageIds in scope for VSCode snippets.
  • Respect languageId in comment for VSCode snippets.
  • Load global scoped VSCode snippets for all filetypes.
  • Support workspace snippets in .vscode folder.

2.5.0

  • Load snippets when necessary.
  • Not show progress status item on loading.
  • Load all.snippetsof ultisnip when filetype is empty.
  • Support extends for snipmate snippets.
  • Support configuration snippets.excludePatterns.