" press <Tab> to expand or jump in a snippet. These can also be mapped separately" via <Plug>luasnip-expand-snippet and <Plug>luasnip-jump-next.imap<silent><expr><Tab>luasnip#expand_or_jumpable() ? '<Plug>luasnip-expand-or-jump' : '<Tab>'" -1 for jumping backwards.inoremap<silent><S-Tab><cmd>lua require'luasnip'.jump(-1)<Cr>snoremap<silent><Tab><cmd>luarequire('luasnip').jump(1)<Cr>snoremap<silent><S-Tab><cmd>luarequire('luasnip').jump(-1)<Cr>" For changing choices in choiceNodes (not strictly necessary for a basic setup).imap<silent><expr><C-E>luasnip#choice_active() ? '<Plug>luasnip-next-choice' : '<C-E>'smap<silent><expr><C-E>luasnip#choice_active() ? '<Plug>luasnip-next-choice' : '<C-E>'
nvim-cmp's wiki also contains an example for
setting up a super-tab-like mapping.
Add Snippets
Check out the doc for a general explanation of the
loaders and their benefits. The following list serves only as a short overview.
Vscode-like: To use existing vs-code style snippets from a plugin (eg. rafamadriz/friendly-snippets) simply install the plugin and then add
somewhere in your nvim-config. LuaSnip will then load the snippets contained in the plugin on startup.
You can also easily load your own custom vscode style snippets by passing the path to the custom snippet-directory to the load function:
The snipmate format is very simple, so adding custom snippets only requires a few steps:
add a directory beside your init.vim (or any other place that is in your runtimepath) named snippets.
inside that directory, create files named <filetype>.snippets and add snippets for the given filetype in it (for inspiration, check honza/vim-snippets).
# commentsnippet<trigger><description>
<snippet-body>
snippet if C-style if
if ($1)
$0
Lua: Add the snippets by calling require("luasnip").add_snippets(filetype, snippets). An example for this can be found here.
This can also be done much cleaner, with all the benefits that come with using a loader, by using the loader for lua
Check DOC.md (or :help luasnip) for a short overview and in-depth explanations of the different nodes and available API.
I highly recommend looking into (or better yet, :luafileing) Examples/snippets.lua before writing snippets in lua.
The Wiki contains some pretty useful extensions to Luasnip.
history: If true, Snippets that were exited can still be jumped back into. As Snippets are not removed when their text is deleted, they have to be removed manually via LuasnipUnlinkCurrent if delete_check_events is not enabled (set to eg. 'TextChanged').
update_events: Choose which events trigger an update of the active nodes' dependents. Default is just 'InsertLeave', 'TextChanged,TextChangedI' would update on every change.
region_check_events: Events on which to leave the current snippet if the cursor is outside its' 'region'. Disabled by default, 'CursorMoved', 'CursorHold' or 'InsertEnter' seem reasonable.
delete_check_events: When to check if the current snippet was deleted, and if so, remove it from the history. Off by default, 'TextChanged' (perhaps 'InsertLeave', to react to changes done in Insert mode) should work just fine (alternatively, this can also be mapped using <Plug>luasnip-delete-check).
store_selection_keys: Mapping for populating TM_SELECTED_TEXT and related variables (not set by default).
enable_autosnippets: Autosnippets are disabled by default to minimize performance penalty if unused. Set to true to enable.
ext_opts: Additional options passed to extmarks. Can be used to add passive/active highlight on a per-node-basis (more info in DOC.md)
parser_nested_assembler: Override the default behaviour of inserting a choiceNode containing the nested snippet and an empty insertNode for nested placeholders ("${1: ${2: this is nested}}"). For an example (behaviour more similar to vscode), check here
ft_func: Source of possible filetypes for snippets. Defaults to a function, which returns vim.split(vim.bo.filetype, ".", true), but check filetype_functions or the docs for more options.
load_ft_func: Function to determine which filetypes belong to a given buffer (used for lazy_loading). fn(bufnr) -> filetypes (string[]). Again, there are some examples in filetype_functions.
snip_env: The global environment will be extended with this table in some places, eg. in files loaded by the lua-loader.
Setting snip_env to { some_global = "a value" } will add the global variable some_global while evaluating these files.
If you mind the (probably) large number of generated warnings, consider adding the keys set here to the globals
recognized by lua-language-server or add ---@diagnostic disable: undefined-global somewhere in the affected files.
请发表评论