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:
On neovim, run command:
If it is not installed, run:
and make sure you have Python 3 provider for neovim installed.
On vim8, run command:
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:
" 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.m
, trim all whitespaces from right side of snippet lines.t
, s
.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)
.
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-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.:CocList snippets
to open snippets list used by current buffer, the last used snippet item would be preselected.: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.:CocCommand snippets.addFiletypes
to add additional filetypes of current buffer.Use b:coc_snippets_filetypes
to add additional filetypes on buffer create.
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: ""
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": ["'"]
.
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: 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
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4