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.editSnippets
command 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
,w
andi
. - Execute vim, python and shell code in snippet.
-
extends
,priority
andclearsnippets
command 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
,s
andm
(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.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
: usepythonx
for eval python code when possible, defaulttrue
. -
snippets.ultisnips.pythonVersion
: whenusePythonx
is 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 snippets
to open snippets list. - Use
:CocCommand snippets.editSnippets
to edit user snippet of current filetype. - Use
:CocCommand snippets.openSnippetFiles
to 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: Ho 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