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.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.
- 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
.
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:
- 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.
- Replacement String, (:h UltiSnips-replacement-string), requires latest coc.nvim.
- Update python code block after change of placeholder.
-
snip.expand_anon()
should work. - Execute shell code with custom shabang (will not support).
- Option
m
, empty line in snippet not have indentation with coc.nvim. - Reformat snippet options, including
t
,s
. - All snippet actions including
pre_expand
,post_expand
andjump
(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()
return1
when can do snippet expand.coc#jumpable()
return1
when snippet activated and can jump to next placeholder.coc#expandableOrJumpable()
return1
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 tog:coc_selected_text
which will replace$VISUAL
on next snippet expand.
- Use
:CocList snippets
to open snippets list used by current buffer. - Use
:CocCommand snippets.openSnippetFiles
to choose and open a snippet file that used by current document. - Use
:CocCommand snippets.editSnippets
to edit user's ultisnips snippets of current document filetype. - Use
:CocCommand snippets.openOutput
to open output channel of snippets.
-
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.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, 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.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, defaulttrue
. -
snippets.ultisnips.trace
: Trace verbose snippet information, defaultfalse
. -
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, defaulttrue
. -
snippets.snipmate.author
: author name used forg:snips_author
-
snippets.snipmate.trace
: Trace verbose snippet information, defaultfalse
.
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:
- For Ultisnips, create
${filetype}.snippets
in"snippets.ultisnips.directories"
- For snipmate snippets, create
${filetype}.snippets
insnippets
folder under your vim'sruntimepath
. - 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: 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