coc-snippets
v3.1.10
Published
Snippets extension for coc.nvim
Downloads
2,225
Readme
coc-snippets
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.
Why?
- 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
.
Python support
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.~
Install
In your vim/neovim, run command:
:CocInstall coc-snippets
Examples
" 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>'
Ultisnips features
Some ultisnips features are not supported:
- [x] Position check of trigger option, including
b
,w
andi
. - [x] Execute vim, python and shell code in snippet.
- [x]
extends
,priority
andclearsnippets
command in snippet file. - [x] Visual placeholder.
- [x] Placeholder and variable transform.
- [x] Expression snippet.
- [x] Automatic trigger snippet.
- [x] Context snippets.
- [x] Support loading snipmate snippets.
- [x] Replacement String, (:h UltiSnips-replacement-string), requires latest coc.nvim.
- [x] Update python code block after change of placeholder.
- [x]
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)
.
Functions
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.
Key-mappings
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.
Commands
- 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.
Options
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
.
F.A.Q
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.
Supporting
If you like this extension, consider supporting me on Patreon or PayPal:
License
MIT