Snippets solution for coc.nvim
Snippet preview requires neovim 0.4 or latest vim8
It's capable of:
- Load UltiSnips snippets.
- Load snipmate snippets.
- Load VSCode snippets from coc extensions.
- Load VSCode snippets from custom directories.
- Load UltiSnips snippets from configured folder.
- Provide snippets as completion items.
- Provide expand and expandOrJump keymaps for snippet.
- Provide snippets list for edit snippet.
- Provide
snippets.editSnippetscommand for edit user snippets of current filetype.
Note: some features of ultisnips and snipmate format snippets not supported, checkout faq.
- Use same keys for jump placeholder.
- Nested snippet support.
- Always async, never slows you down.
- Improved match for complete items with TextEdit support.
- Edit snippets of current buffer by
:CocList snippets, sorted by mru.
In your vim/neovim, run command:
:CocInstall coc-snippets
" 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)Make <tab> used for trigger completion, completion confirm, snippet expand and jump like VSCode.
inoremap <silent><expr> <TAB>
\ pumvisible() ? coc#_select_confirm() :
\ coc#expandableOrJumpable() ? "\<C-r>=coc#rpc#request('doKeymap', ['snippets-expand-jump',''])\<CR>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ coc#refresh()
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
let g:coc_snippet_next = '<tab>'Note: coc#_select_confirm() helps select first complete item when there's
no complete item selected, neovim 0.4 or latest vim8 required for this function
work as expected.
Some ultisnips features are not supported:
- Position check of trigger option, including
b,wandi. - Execute vim, python and shell code in snippet.
-
extends,priorityandclearsnippetscommand in snippet file. - Visual placeholder.
- Placeholder and variable transform.
- Expression snippet.
- Automatic trigger snippet.
- Context snippets.
- Support loading snipmate snippets.
- Execute shell code with custom shabang (will not support).
- Automatic reformat snippet after change of placeholder (can't support).
- Format related snippet options, including
t,sandm(can't support). - Snippet actions (can't support).
Note: python regex in snippet are converted to javascript regex, however,
some regex patterns can't be supported by javascript, including
\u (?s) \Z (?(id/name)yes-pattern|no-pattern).
-
snippets.priority: priority of snippets source, default90. -
snippets.editSnippetsCommand: Open command used for snippets.editSnippets command, use coc.preferences.jumpCommand by default. -
snippets.trace: Trace level of snippets channel. -
snippets.enableStatusItem: Enable status item ing:coc_statusused for statusline. -
snippets.extends: extends filetype's snippets with other filetypes, example:{ "cpp": ["c"], "javascriptreact": ["javascript"], "typescript": ["javascript"] } -
snippets.userSnippetsDirectory, Directory that contains custom user ultisnips snippets, use ultisnips in extension root by default. -
snippets.shortcut, shortcut in completion menu, defaultS. -
snippets.autoTrigger: enable auto trigger for auto trigger ultisnips snippets, defaulttrue. -
snippets.triggerCharacters: trigger characters for completion, default[]. -
snippets.loadFromExtensions: load snippets from coc.nvim extensions, default:true. -
snippets.convertToSnippetsAction: Add convert to snippet to code action list. -
snippets.textmateSnippetsRoots: absolute directories that contains textmate/VSCode snippets to load. -
snippets.ultisnips.enable: enable load UltiSnips snippets, defaulttrue. -
snippets.ultisnips.usePythonx: usepythonxfor eval python code when possible, defaulttrue. -
snippets.ultisnips.pythonVersion: whenusePythonxis false, python version to use for python code, default to3. -
snippets.ultisnips.directories: directories that searched for snippet files, could be subfolder in every $runtimepath or absolute paths, default:["UltiSnips"] -
snippets.snipmate.enable: enable load snipmate snippets, defaulttrue. -
snippets.snippets.author: author name used forg:snips_author
- Use
:CocList snippetsto open snippets list. - Use
:CocCommand snippets.editSnippetsto edit user snippet of current filetype. - Use
:CocCommand snippets.openSnippetFilesto open snippet files of current filetype.
Q: How to check if a snippet successfully loaded?
A: Use command :CocCommand workspace.showOutput snippets
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.
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: It doesn't load snippets from vim-go.
A: It uses g:UltiSnipsSnippetDirectories which is not supported, you can
add settings:
snippets.ultisnips.directories: [
"UltiSnips",
"gosnippets/UltiSnips"
],
to load it.
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.
MIT
