Ⅰ. 插件描述
snipMate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim.Ⅱ. 基本信息
|
Ⅲ. 安装方法
使用Vundle管理器安装
在你的.vimrc下添加:Plugin 'garbas/vim-snipmate-mine'
… 然后在Vim中运行以下命令:
:source %
:PluginInstall
对于Vundle版本 < 0.10.2,请用上面的Bundle替换Plugin。
使用NeoBundle管理器安装
在你的.vimrc下添加:NeoBundle 'garbas/vim-snipmate-mine'
… 然后在Vim中运行以下命令:
:source %
:NeoBundleInstall
使用VimPlug管理器安装
在你的.vimrc下添加:Plug 'garbas/vim-snipmate-mine'
… 然后在Vim中运行以下命令:
:source %
:PlugInstall
使用Pathogen管理器安装
在终端中运行以下命令:cd ~/.vim/bundle
git clone https://github.com/garbas/vim-snipmate
Ⅳ. 文档说明
# SnipMate #
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][garbas], Marc Weber, and Adnan Zafar.
Installing SnipMate
We recommend one of the following methods for installing SnipMate and its
- 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.git
- Using 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'
Using SnipMate
Press <tab> and try :SnipMateOpenSnippetFiles for starting.
Also see doc/SnipMate.txt to learn all SnipMate
FAQ
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,
wherefoo
is a path listed in yourruntimepath
. - 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
, orscope_*.snippets
.
However we understand this may not allow for the flexibility desired by some
- 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
- The vim-rails plugin automatically
: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
.
Release Notes
0.89 - 2016-05-29
- Various regex updates to legacy parser
- Addition of double bang syntax to completely remove a snippet from lookup
- Group various SnipMate autocommands
- Support setting 'shiftwidth' to 0
- Parser now operates linewise, adding some flexibility
- Mirror substitutions are more literal
- Mirror length is calculated correctly when substitutions occur
0.88 - 2015-04-04
- 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
- A new snippet parser has been added. The g:snipmate.version as well as
version lines in snippet files determines which is used - The new parser supports tab stops placed within placeholders,
substitutions, non-consecutive stop numbers, and fewer ambiguities - The stop jumping code has been updated
- Tests have been added for the jumping code and the new parser
- A new snippet parser has been added. The g:snipmate.version as well as
The override branch has been merged
- The g:snipMate.override option is added. When enabled, if two snippets
share the same name, the later-loaded one is kept and the other discarded - Override behavior can be enabled on a per-snippet basis with a bang (!) in
the snippet file - Otherwise, SnipMate tries to preserve all snippets loaded
- The g:snipMate.override option is added. When enabled, if two snippets
- 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)
0.87 - 2014-01-04
- Stop indenting empty lines when expanding snippets
- Support extends keyword in .snippets files
- Fix visual placeholder support
- Add zero tabstop support
- Support negative 'softtabstop'
- Add g:snipMate_no_default_aliases option
- Add <Plug>snipMateTrigger for triggering an expansion inside a snippet
- Add snipMate#CanBeTriggered() function