Snippets solution for coc.nvim
Snippet preview requires neovim 0.4 or latest vim8
It's capable of:
${workspaceFolder}/.vscode
.snippets.editMassCodeSnippets
command.snippets.editSnippets
command for edit user snippets of current filetype.Note: some features of ultisnips and snipmate format snippets not supported, checkout Ultisnips features.
:CocList snippets
.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.~
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)
" 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>'
Some ultisnips features are not supported:
b
, w
and i
.extends
, priority
and clearsnippets
command in snippet file.snip.expand_anon()
should work.m
, empty line in snippet not have indentation with coc.nvim.t
, s
.pre_expand
, post_expand
and jump
(can't support).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)
.
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.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-jump)
Expand snippet or jump to next placeholder
of current snippet when possible, insert mode only.<Plug>(coc-snippets-select)
Remove selected text and save to
g:coc_selected_text
which will replace $VISUAL
on next snippet expand.:CocList snippets
to open snippets list used by current buffer.:CocCommand snippets.openSnippetFiles
to choose and open a snippet file
that used by current document.:CocCommand snippets.editSnippets
to edit user's ultisnips snippets of
current document filetype.:CocCommand snippets.openOutput
to open output channel of snippets.snippets.priority
: priority of snippets source, default 90
.
snippets.editSnippetsCommand
: Open command used for snippets.editSnippets command, use coc.preferences.jumpCommand by default.
snippets.trace
: Trace level of snippets channel.
snippets.excludePatterns
: List of filepath patterns to exclude, $HOME
and other environment variables are expanded.
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, default S
.
snippets.autoTrigger
: enable auto trigger for auto trigger ultisnips snippets, default true
.
snippets.triggerCharacters
: trigger characters for completion, default []
.
snippets.loadFromExtensions
: load snippets from coc.nvim extensions, default: true
.
snippets.loadVSCodeProjectSnippets
: Load code snippets in folder ${workspaceFolder}/.vscode
, default: true
.
snippets.textmateSnippetsRoots
: absolute directories that contains textmate/VSCode snippets to load, default: []
.
snippets.ultisnips.enable
: enable load UltiSnips snippets, default true
.
snippets.ultisnips.trace
: Trace verbose snippet information, default false
.
snippets.ultisnips.directories
: directories that searched for snippet files,
could be subfolder in every \$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
: enable load snipmate snippets, default true
.
snippets.snipmate.author
: author name used for g:snips_author
snippets.snipmate.trace
: Trace verbose snippet information, default false
.
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. To create snippets yourself:
${filetype}.snippets
in "snippets.ultisnips.directories"
${filetype}.snippets
in snippets
folder
under your vim's runtimepath
.${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: 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.
If you like this extension, consider supporting me on Patreon or PayPal:
MIT