SnipMate aims to provide support for textual snippets, similar to TextMate or
other Vim plugins like UltiSnips. For
example, in C, typing for<tab> could be expanded to
for (i = 0; i < count; i++) {
/* code */
}
with successive presses of tab jumping around the snippet.
Originally authored by Michael Sanders, SnipMate was forked in 2011 after a stagnation in development. This fork is currently maintained by Rok Garbas, Marc Weber, and Adnan Zafar.
We recommend one of the following methods for installing SnipMate and its dependencies. SnipMate depends on vim-addon-mw-utils and tlib.
NOTE: SnipMate does not ship with any snippets out of the box. We suggest looking at the vim-snippets repository.
Using VAM, add vim-snippets to the list of packages to be installed.
Using Pathogen, run the following commands:
% cd ~/.vim/bundle
% git clone https://github.com/tomtom/tlib_vim.git
% git clone https://github.com/MarcWeber/vim-addon-mw-utils.git
% git clone https://github.com/garbas/vim-snipmate.git
# Optional:
% git clone https://github.com/honza/vim-snippets.gitUsing Vundle, add the following to your vimrc then run
:PluginInstall
Plugin 'MarcWeber/vim-addon-mw-utils'
Plugin 'tomtom/tlib_vim'
Plugin 'garbas/vim-snipmate'
" Optional:
Plugin 'honza/vim-snippets'Press
SnipMate doesn’t work / My snippets aren’t triggering
Try all of the following:
Check that SnipMate is loaded. This can be done by looking for
<Plug>snipMateTrigger and similar maps in the output of :imap.
Additionally make sure either <Plug>snipMateTrigger or
<Plug>snipMateNextOrTrigger is mapped to the key you expect.
Check that the snippets file you mean to use exists, and that it contains the snippet you’re trying to expand.
Check that your snippets file is located inside a foo/snippets directory,
where foo is a path listed in your runtimepath.
Check that your snippets file is in scope by either the filetype matching the path of the snippet file or the scope explicitly loaded.
Check if any snippets from your snippets file are available. This can be done
with the “show available snips” map, by default bound to <C-R><Tab> in
insert mode.
If all of the above check out, please open an issue stating your Vim version, a sample snippet, and a description of exactly what happens when you try to trigger a snippet.
How does SnipMate determine which snippets to load? How can I separate, for example, my Rails snippets from my Ruby snippets?
Primarily SnipMate looks at the 'filetype' and 'syntax' settings. Taking
“scopes” from these options, it looks in each snippets/ directory in
'runtimepath' for files named scope.snippets, scope/*.snippets, or
scope_*.snippets.
However we understand this may not allow for the flexibility desired by some
languages. For this we provide two options: scope aliases and the
:SnipMateLoadScope command. Scope aliases simply say “whenever this scope is
loaded, also load this other scope:
let g:snipMate = get(g:, 'snipMate', {}) " Allow for vimrc re-sourcing
let g:snipMate.scope_aliases = {}
let g:snipMate.scope_aliases['ruby'] = 'ruby,rails'
will load the ruby-rails scope whenever the ruby scope is active. The
:SnipMateLoadScope foo command will always load the foo scope in the current
buffer. The vim-rails plugin automatically
does :SnipMateLoadScope rails when editing a Rails project for example.
What are the snippet parser versions and what’s the difference between them?
Originally SnipMate used regex to parse a snippet. Determining where stops were, what the placeholders were, where mirrors were, etc. were all done with regex. Needless to say this was a little fragile. When the time came for a rewritten parser, some incompatibilities were a little necessary. Rather than break everyone’s snippets everywhere, we provided both the new (version 1) and the old (version 0) and let the user choose between them.
Version 0 is considered legacy and not a lot of effort is going to go into
improving or even maintaining it. Version 1 is the future, and one can expect
new features to only exist for version 1 users. A full list of differences can
be found in the docs at :h SnipMate-parser-versions.
Implement simple caching
Remove expansion guards
Add :SnipMateLoadScope command and buffer-local scope aliases
Load <scope>_*.snippets files
Use CursorMoved autocmd events entirely
The nested branch has been merged
The override branch has been merged
Fix bug with mirrors in the first column
Fix bug with tabs in indents (#143)
Fix bug with mirrors in placeholders
Fix reading single snippet files
Fix the use of the visual map at the end of a line
Fix expansion of stops containing only the zero tab stop
Remove select mode mappings
Indent visual placeholder expansions and remove extraneous lines (#177 and #178)