Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
snipMate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim.
branch: master

This branch is 407 commits ahead of msanders:master


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.

Installing SnipMate

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
    % git clone
    % git clone
    # Optional:
    % git clone
  • Using Vundle, add the following to your vimrc then run :BundleInstall

      Bundle "MarcWeber/vim-addon-mw-utils"
      Bundle "tomtom/tlib_vim"
      Bundle "garbas/vim-snipmate"
      " Optional:
      Bundle "honza/vim-snippets"


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 = {}
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.

Release Notes


  • Implement simple caching
  • Remove expansion guards
  • 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
  • Add :SnipMateLoadScope command and buffer-local scope aliases
  • Load <scope>_*.snippets files
  • Indent visual placeholder expansions and remove extraneous lines (#177 and #178)

  • 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
  • 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

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 snipMateTrigger for triggering an expansion inside a snippet
  • Add snipMate#CanBeTriggered() function
Something went wrong with that request. Please try again.