The ultimate snippet solution for python enabled Vim.
Python VimL Shell
Latest commit 5f88199 Dec 7, 2015 @SirVer SirVer committed with Version 3.1
Note: Last release for Please follow the for future releases. Master is also always stable and a good choice.

- This is the last release done by @SirVer. The new maintainer of UltiSnips
  is @seletskiy. The repository remains,
  so this should not affect any users. This is also the last release to be
  published on Please follow the master branch on GitHub for the
  latest stable version.
- New option `e`: Context aware snippets. This gives very precise and
  powerful control over which snippet should be expanded depending on
  surrounding code. *UltiSnips-context-snippets*
- New option `m`: Trim whitespace in all snippet lines.
- Very powerful, freely configurable pre/post-expand and post-jump actions
  allow for transforming the buffer outside the snippet. *UltiSnips-snippet-actions*
- Automatic triggering of snippets without the need to press the expand
  trigger. *UltiSnips-autotrigger*
- Better error reporting for snippet errors including python stacktraces
  and listing of executed code.
- Undo is more granular. Each jump and expand is now a separate undo step.
- UltiSnips now emits autocommands on certain events. *UltiSnips-custom-autocommands*
- clearsnippets now clears all snippets below the current priority. This
  fits better with the priority system introduced in 3.0.
- snipMate snippets support can be disabled. *UltiSnipsEnableSnipMate*
- UltiSnipsEditSplit got a new value 'context'. *UltiSnipsEditSplit*
- Improved syntax highlighting for snippets filetype.
- Mappings and autocommands are now only established when needed, i.e. when
  a snippet is active. This boosts performance outside of snippets.
- New integration with Unite, TagBar, and deoplete.
- New Ctags configuration file for snippet definitions.
- Bug fixes, performance improvements, code cleanups and refactorings.
- No longer supports Vim < 7.4.
Failed to load latest commit information.
after/plugin Version 3.1 Dec 9, 2015
autoload Version 3.1 Dec 9, 2015
ctags Version 3.1 Dec 9, 2015
doc Version 3.1 Dec 9, 2015
ftdetect Version 3.1 Dec 9, 2015
ftplugin Version 3.1 Dec 9, 2015
plugin Version 3.1 Dec 9, 2015
pythonx/UltiSnips Version 3.1 Dec 9, 2015
rplugin/python3/deoplete/sources Version 3.1 Dec 9, 2015
syntax Version 3.1 Dec 9, 2015
test Version 3.1 Dec 9, 2015
utils Version 3.1 Dec 9, 2015
.bzrignore Version 3.0 Mar 23, 2014
.gitignore Version 1.6 Jan 5, 2012
.travis.yml Version 3.1 Dec 9, 2015
ChangeLog Version 3.1 Dec 9, 2015
README Version 3.1 Dec 9, 2015 Version 3.1 Dec 9, 2015
pylintrc Version 3.1 Dec 9, 2015 Version 3.1 Dec 9, 2015 Version 3.1 Dec 9, 2015 Version 3.1 Dec 9, 2015

Build Status Stories in Ready Gitter


UltiSnips is the ultimate solution for snippets in Vim. It has tons of features and is very fast.

GIF Demo

In this demo I am editing a python file. I first expand the #! snippet, then the class snippet. The completion menu comes from YouCompleteMe, UltiSnips also integrates with neocomplete. I can jump through placeholders and add text while the snippet inserts text in other places automatically: when I add Animal as a base class, __init__ gets updated to call the base class constructor. When I add arguments to the constructor, they automatically get assigned to instance variables. I then insert my personal snippet for print debugging. Note that I left insert mode, inserted another snippet and went back to add an additional argument to __init__ and the class snippet was still active and added another instance variable.

The official home of UltiSnips is at Please add pull requests and issues there.

UltiSnips was started in Jun 2009 by @SirVer. In Dec 2015, maintenance was handed over to @seletskiy.

Quick Start

This assumes you are using Vundle. Adapt for your plugin manager of choice. Put this into your .vimrc.

" Track the engine.
Plugin 'SirVer/ultisnips'

" Snippets are separated from the engine. Add this if you want them:
Plugin 'honza/vim-snippets'

" Trigger configuration. Do not use <tab> if you use
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<c-b>"
let g:UltiSnipsJumpBackwardTrigger="<c-z>"

" If you want :UltiSnipsEdit to split your window.
let g:UltiSnipsEditSplit="vertical"

UltiSnips comes with comprehensive documentation. As there are more options and tons of features I suggest you at least skim it.


From a gentle introduction to really advanced in a few minutes: The blog posts of the screencasts contain more advanced examples of the things discussed in the videos.

Also the excellent Vimcasts dedicated three episodes to UltiSnips: