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.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.: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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。