Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/hrsh7th/vim-vsnip
Snippet plugin for vim/nvim that supports LSP/VSCode's snippet format.
https://github.com/hrsh7th/vim-vsnip
neovim neovim-plugin snippets vim vim-plugin
Last synced: 3 days ago
JSON representation
Snippet plugin for vim/nvim that supports LSP/VSCode's snippet format.
- Host: GitHub
- URL: https://github.com/hrsh7th/vim-vsnip
- Owner: hrsh7th
- License: mit
- Created: 2019-08-21T18:13:26.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2024-01-11T01:41:39.000Z (10 months ago)
- Last Synced: 2024-10-30T13:37:54.562Z (12 days ago)
- Topics: neovim, neovim-plugin, snippets, vim, vim-plugin
- Language: Vim Script
- Homepage:
- Size: 431 KB
- Stars: 880
- Watchers: 12
- Forks: 36
- Open Issues: 34
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# vim-vsnip
VSCode(LSP)'s snippet feature in vim/nvim.
# Features
- Nested placeholders
- You can define snippet like `console.log($1${2:, $1})$0`
- Nested snippet expansion
- You can expand snippet even if you already activated other snippet (it will be merged as one snippet)
- Load snippet from VSCode extension
- If you install VSCode extension via `Plug 'golang/vscode-go'`, vsnip will load those snippets.
- Support many LSP-client & completion-engine by [vim-vsnip-integ](https://github.com/hrsh7th/vim-vsnip-integ)
- LSP-client
- [vim-lsp](https://github.com/prabirshrestha/vim-lsp)
- [vim-lsc](https://github.com/natebosch/vim-lsc)
- [yegappan-lsp](https://github.com/yegappan/lsp)
- [LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim)
- [neovim built-in lsp](https://github.com/neovim/neovim)
- completion-engine
- [asyncomplete.vim](https://github.com/prabirshrestha/asyncomplete.vim)
- [vim-mucomplete](https://github.com/lifepillar/vim-mucomplete)
- [vimcomplete](https://github.com/girishji/vimcomplete)
- [ddc.vim](https://github.com/Shougo/ddc.vim)
- [vim-easycompletion](https://github.com/jayli/vim-easycomplete)
- Vim script interpolation
- You can use Vim script interpolation as `${VIM:...Vim script expression...}`.
- SnipMate-like syntax support
- Snippet files in SnipMate format with the extension `.snippets` can be load.
- NOTE: Full compatibility is not guaranteed. It is intended to easily create user-defined snippets.# Concept
- Pure Vim script
- Well tested (neovim/0.4.4, vim/8.0.1567)
- Support VSCode snippet format
- Provide integration with many plugins# Related repository
[friendly-snippets](https://github.com/rafamadriz/friendly-snippets) - Set of preconfigured snippets for all kind of programming languages that integrates really well with [vim-vsnip](https://github.com/hrsh7th/vim-vsnip), so all users can benefit from them and not to worry about setting up snippets on their own.
# Usage
### 1. Install
You can use your favorite plugin managers to install this plugin.
```viml
Plug 'hrsh7th/vim-vsnip'
Plug 'hrsh7th/vim-vsnip-integ'call dein#add('hrsh7th/vim-vsnip')
call dein#add('hrsh7th/vim-vsnip-integ')NeoBundle 'hrsh7th/vim-vsnip'
NeoBundle 'hrsh7th/vim-vsnip-integ'
```### 2. Setting
```viml
" NOTE: You can use other key to expand snippet." Expand
imap vsnip#expandable() ? '(vsnip-expand)' : ''
smap vsnip#expandable() ? '(vsnip-expand)' : ''" Expand or jump
imap vsnip#available(1) ? '(vsnip-expand-or-jump)' : ''
smap vsnip#available(1) ? '(vsnip-expand-or-jump)' : ''" Jump forward or backward
imap vsnip#jumpable(1) ? '(vsnip-jump-next)' : ''
smap vsnip#jumpable(1) ? '(vsnip-jump-next)' : ''
imap vsnip#jumpable(-1) ? '(vsnip-jump-prev)' : ''
smap vsnip#jumpable(-1) ? '(vsnip-jump-prev)' : ''" Select or cut text to use as $TM_SELECTED_TEXT in the next snippet.
" See https://github.com/hrsh7th/vim-vsnip/pull/50
nmap s (vsnip-select-text)
xmap s (vsnip-select-text)
nmap S (vsnip-cut-text)
xmap S (vsnip-cut-text)" If you want to use snippet for multiple filetypes, you can `g:vsnip_filetypes` for it.
let g:vsnip_filetypes = {}
let g:vsnip_filetypes.javascriptreact = ['javascript']
let g:vsnip_filetypes.typescriptreact = ['typescript']
```### 3. Create your own snippet
Snippet file will store to `g:vsnip_snippet_dir` per filetype.
1. Open some file (example: `Sample.js`)
2. Invoke `:VsnipOpen` command.
3. Edit snippet.```json
{
"Class": {
"prefix": ["class"],
"body": [
"/**",
" * @author ${VIM:\\$USER}",
" */",
"class $1 ${2:extends ${3:Parent} }{",
"\tconstructor() {",
"\t\t$0",
"\t}",
"}"
],
"description": "Class definition template."
}
}
```The snippet format was described in [here](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax) or [here](https://github.com/Microsoft/language-server-protocol/blob/master/snippetSyntax.md).
# Recipe
### $TM_FILENAME_BASE
You can insert the filename via `fname\(vsnip-expand)`.
```json
{
"filename": {
"prefix": ["fname"],
"body": "$TM_FILENAME_BASE"
}
}
```### Log $TM_SELECTED_TEXT
You can fill `$TM_SELECTED_TEXT` by `(vsnip-select-text)` or `(vsnip-cut-text)`.
```json
{
"log": {
"prefix": ["log"],
"body": "console.log(${1:$TM_SELECTED_TEXT});"
}
}
```### Insert environment vars
You can insert value by Vim script expression.
```json
{
"user": {
"prefix": "username",
"body": "${VIM:\\$USER}"
}
}
```### Insert UUID via python
You can insert UUID via python.
```json
{
"uuid": {
"prefix": "uuid",
"body": [
"${VIM:system('python -c \"import uuid, sys;sys.stdout.write(str(uuid.uuid4()))\"')}"
]
}
}
```NOTE: `$VIM` is only in vsnip. So that makes to lost the snippet portability.
# DEMO
### LSP integration
### `
# Development
### How to run test it?
You can run `npm run test` after install [vim-themis](https://github.com/thinca/vim-themis).
### How sync same tabstop placeholders?
1. compute the `user-diff` ... `s:Session.flush_changes`
2. reflect the `user-diff` to snippet ast ... `s:Snippet.follow`
3. reflect the `sync-diff` to buffer content ... `s:Snippet.sync & s:Session.flush_changes`