Home

Awesome

Snippy

A snippets plugin for Neovim 0.7.0+ written in Lua.

Status

The plugin is mostly stable and feature complete as a minimal and simple snippets manager. Also, see the FAQ section.

Features

Installation

Install using your favorite plugin manager.

Using vim-plug:

Plug 'dcampos/nvim-snippy'

There are no snippets installed by default. You can create your own, or install vim-snippets:

Plug 'honza/vim-snippets'

If you want to use Snippy with nvim-cmp, please install and configure cmp-snippy.

Usage

Snippy comes with no mappings activated by default, so you need to define some.

For example, to use <Tab> to expand and jump forward, <S-Tab to jump back:

imap <expr> <Tab> snippy#can_expand_or_advance() ? '<Plug>(snippy-expand-or-advance)' : '<Tab>'
imap <expr> <S-Tab> snippy#can_jump(-1) ? '<Plug>(snippy-previous)' : '<S-Tab>'
smap <expr> <Tab> snippy#can_jump(1) ? '<Plug>(snippy-next)' : '<Tab>'
smap <expr> <S-Tab> snippy#can_jump(-1) ? '<Plug>(snippy-previous)' : '<S-Tab>'
xmap <Tab> <Plug>(snippy-cut-text)

When using Lua, you can wrap the above block in a vim.cmd([[...]]) call, or call the snippy.setup() function passing your mapping options:

require('snippy').setup({
    mappings = {
        is = {
            ['<Tab>'] = 'expand_or_advance',
            ['<S-Tab>'] = 'previous',
        },
        nx = {
            ['<leader>x'] = 'cut_text',
        },
    },
})

You can also define separate mappings to expand and jump forward. See :help snippy-usage and also the mapping examples on the Wiki.

Adding snippets

Normally, you should place your custom snippets in $XDG_CONFIG_HOME/nvim/snippets. However, any snippets directory in runtimepath will be searched for snippets. Files with the .snippet extension contain a single snippet, while files with the .snippets extension can be used to declare multiple snippets.

A basic lua.snippets file for Lua, demonstrating some of the plugin's features, would look like this:

# Comments are possible
snippet fun
	function ${1:name}(${2:params})
		${0:$VISUAL}
	end
snippet upcase
	local ${1:var} = '${1/.*/\U\0/g}'
snippet choices
	print('My favorite language is: ${1|JavaScript,Lua,Rust|}')
snippet date
	Current date is `strftime('%c')`
# Custom tabstop order
snippet repeat
	repeat
		${2:what}
	while ${1:condition}

You can find example snippets in the honza/vim-snippets repository, which, if installed, Snippy will also use automatically as a source of snippets.

See :help snippy-usage-snippets and :help snippy-snippet-syntax for more information.

Expanding LSP snippets

The LSP snippet syntax is almost fully supported. If you use a completion plugin like nvim-cmp, please install the respective integration plugin listed above in the Installation section.

You can also expand LSP snippets present in completion items provided by Neovim's built-in vim.lsp.omnifunc. See :help snippy.complete_done() for details.

Running tests

There are some functional and unit tests available. To run them, use either:

make functionaltest

Or:

make unittest

You need to have vusted installed for running the unit tests.

Advantages

These are some of the advantages of this plugin when compared with other snippet plugins for Vim/Neovim:

FAQ

Is feature X from Ultisnips available?

This question is very frequently asked and the answer is usually no. UltiSnips is a great snippet manager for those who want to use advanced snippet features, such as Python code evaluation, but that comes with the cost of being heavy and complex, whereas Snippy aims to be minimal and simple. That said, UltiSnips has some useful features, like auto-trigger, that have been added to Snippy in order to improve usability.

See also: issues with label label: question.

Known bugs

Acknowledgements

The snippet parsing code is based on vsnip.

License

MIT license.