Skip to content

1.2.0

Compare
Choose a tag to compare
@L3MON4D3 L3MON4D3 released this 26 Jan 19:27
· 394 commits to master since this release

Deprecations & Breaking Changes

None :)

New Features

ls_file_snippets and ls_file_autosnippets

Up until now the snippets loaded by the lua-loader had to be returned in a big list at the end of the files. This prevents defining functions used in those snippets near them (at least if they are defined naively), and generally makes these files less readable.

Now, the tables ls_file_snippets and ls_file_autosnippets exposed (additionally!), and snippets can be added to them and don't have to be returned at the end of the files.

To really make use of this, adding something like

ls.setup({
	snip_env = {
		s = function(...)
			local snip = ls.s(...)
			-- we can't just access the global `ls_file_snippets`, since it will be
			-- resolved in the environment of the scope in which it was defined.
			table.insert(getfenv(2).ls_file_snippets, snip)
		end,
		parse = function(...)
			local snip = ls.parser.parse_snippet(...)
			table.insert(getfenv(2).ls_file_snippets, snip)
		end,
		-- remaining definitions.
		...
	},
	...
})

makes s and parse automatically add the snippets defined with them.

edit_snippet_files: extend-option, by @pianocomposer321

edit_snippet_files can be used to quickly jump to any file contributing snippets to the current file.
Before 61238b9, it was only possible to select an already-existing file, after it, it's possible to add some custom logic to extend the list of found files arbritarily.
A great application of this is the possibility of adding a new file in known snippet-collections:

-- loaded collections.
local snippet_collections = {
	-- lua-snippets
	{
		dir = "/home/simon/.config/nvim/luasnippets",
		extension = "lua"
	},
	-- snipmate-snippets
	-- this would edit snippets provided by vim-snippets.
	{
		dir = "/home/simon/.local/share/nvim/site/pack/packer/start/vim-snippets/snippets/",
		extension = "snippets"
	}
	-- vscode would be much more involved, if you figure something out, showcase
	-- it in a discussion :D
}

require("luasnip.loaders").edit_snippet_files({
	extend = function(ft, files)
		local extend_items = {}

		for _, collection in ipairs(snippet_collections) do
			-- check if a file from the collection is present in the items
			-- already.
			for _, file in ipairs(files) do
				if file:match(collection.dir) then
					-- a file is in personal_dir, no need to create a new file there.
					goto continue
				end
			end

			-- not present, create item to add this file.
			table.insert(extend_items, {
				-- label of the new file.
				"New file in " .. collection.dir,
				-- location of the new file.
				("%s/%s.%s"):format(collection.dir, ft, collection.extension)})

			-- luajit only!!
			:: continue ::
		end

		return extend_items
	end
})

(The doc-entry contains a simpler example, and a proper definition of the option).

Repeat nodes automatically in fmt, by @uyha

This can be used to make snippets created with fmt more readable, by repeating nodes belonging to duplicated keys.

s("fmt", fmt([[
	This {iNode} will be repeated here {iNode}
]], {
	iNode = i(1)
}, {repeat_duplicates = true}))

repeat_duplicates is false by defaults, use extend_decorator to override this default if you prefer this behaviour to failing.

pascalcase and camelcase for lsp-snippets

Up until now, we had not implemented these transformations. As long as jsregexp is installed, these will behave exactly like they do in vscode.

Logging

Luasnip now has some logging in place! This is especially useful to quickly find misconfigurations with the loaders, so definitely give it a shot. Some more details in the doc.

Pretty display of available snippets, by @lyonelz96

Opens a buffer with a pretty display of all available snippets. Very configurable!
The doc contains an extensive overview of what is possible with this. So far, there is only one pretty static way to show the available snippets in a buffer, enhancing this to create a tree-like view of all snippets would be a nice extension.

New Contributors

Thanks, all of you :)

Full Changelog: v1.1.0...v1.2.0