mirror of
https://github.com/L3MON4D3/LuaSnip
synced 2024-09-16 21:54:03 +02:00
149 lines
4.2 KiB
Lua
149 lines
4.2 KiB
Lua
local ext_util = require("luasnip.util.ext_opts")
|
|
local session = require("luasnip.session")
|
|
local conf_defaults = require("luasnip.default_config")
|
|
|
|
local function set_snip_env(target_conf_defaults, user_config)
|
|
if not user_config.snip_env then
|
|
-- target_conf already contains defaults
|
|
return
|
|
end
|
|
|
|
-- either "set" or "extend", make sure it does not appear in the final snip_env.
|
|
local snip_env_behaviour = user_config.snip_env.__snip_env_behaviour ~= nil
|
|
and user_config.snip_env.__snip_env_behaviour
|
|
or "extend"
|
|
assert(
|
|
snip_env_behaviour == "set" or snip_env_behaviour == "extend",
|
|
"Unknown __snip_env_behaviour, `" .. snip_env_behaviour .. "`"
|
|
)
|
|
user_config.snip_env.__snip_env_behaviour = nil
|
|
|
|
if snip_env_behaviour == "set" then
|
|
target_conf_defaults.snip_env = user_config.snip_env
|
|
else
|
|
-- cannot use vim.tbl_extend, since we'd need to transfer the metatable.
|
|
for k, v in pairs(user_config.snip_env) do
|
|
target_conf_defaults.snip_env[k] = v
|
|
end
|
|
end
|
|
|
|
-- set to nil, to mark that it's handled.
|
|
user_config.snip_env = nil
|
|
end
|
|
|
|
-- declare here to use in set_config.
|
|
local c
|
|
|
|
c = {
|
|
set_config = function(user_config)
|
|
user_config = user_config or {}
|
|
local conf = vim.deepcopy(conf_defaults)
|
|
|
|
-- remove unused highlights from default-ext_opts.
|
|
ext_util.clear_invalid(conf.ext_opts)
|
|
conf.ext_opts = ext_util.child_complete(conf.ext_opts)
|
|
user_config.ext_opts =
|
|
ext_util.child_complete(user_config.ext_opts or {})
|
|
ext_util.child_extend(user_config.ext_opts, conf.ext_opts)
|
|
|
|
-- use value from update_events, then updateevents.
|
|
-- also nil updateevents, don't spill it into the main config.
|
|
user_config.update_events = user_config.update_events
|
|
or user_config.updateevents
|
|
user_config.updateevents = nil
|
|
|
|
set_snip_env(conf, user_config)
|
|
|
|
-- handle legacy-key history.
|
|
if user_config.history ~= nil then
|
|
conf.keep_roots = user_config.history
|
|
conf.link_roots = user_config.history
|
|
conf.exit_roots = not user_config.history
|
|
conf.link_children = user_config.history
|
|
|
|
-- unset key to prevent handling twice.
|
|
conf.history = nil
|
|
end
|
|
|
|
if user_config.store_selection_keys ~= nil then
|
|
conf.cut_selection_keys = user_config.store_selection_keys
|
|
|
|
user_config.store_selection_keys = nil
|
|
end
|
|
|
|
for k, v in pairs(user_config) do
|
|
conf[k] = v
|
|
end
|
|
|
|
session.config = conf
|
|
c._setup()
|
|
end,
|
|
|
|
_setup = function()
|
|
local augroup = vim.api.nvim_create_augroup("luasnip", {})
|
|
|
|
-- events: string[], or string. if string[], each string is one
|
|
-- event-name, if string, either one event-name, or multiple delimited by `,`.
|
|
local function ls_autocmd(events, callback)
|
|
if type(events) == "string" then
|
|
-- split on ',' for backwards compatibility.
|
|
-- remove spaces from string.
|
|
events = vim.split(events:gsub(" ", ""), ",")
|
|
end
|
|
vim.api.nvim_create_autocmd(events, {
|
|
callback = callback,
|
|
group = augroup,
|
|
})
|
|
end
|
|
if session.config.delete_check_events ~= nil then
|
|
ls_autocmd(
|
|
session.config.delete_check_events,
|
|
require("luasnip").unlink_current_if_deleted
|
|
)
|
|
end
|
|
ls_autocmd(
|
|
session.config.update_events,
|
|
require("luasnip").active_update_dependents
|
|
)
|
|
if session.config.region_check_events ~= nil then
|
|
ls_autocmd(session.config.region_check_events, function()
|
|
require("luasnip").exit_out_of_region(
|
|
require("luasnip").session.current_nodes[vim.api.nvim_get_current_buf()]
|
|
)
|
|
end)
|
|
end
|
|
-- Remove buffers' nodes on deletion+wipeout.
|
|
ls_autocmd({ "BufDelete", "BufWipeout" }, function(event)
|
|
local current_nodes = require("luasnip").session.current_nodes
|
|
if current_nodes then
|
|
current_nodes[event.buf] = nil
|
|
end
|
|
end)
|
|
if session.config.enable_autosnippets then
|
|
ls_autocmd("InsertCharPre", function()
|
|
Luasnip_just_inserted = true
|
|
end)
|
|
ls_autocmd({ "TextChangedI", "TextChangedP" }, function()
|
|
if Luasnip_just_inserted then
|
|
require("luasnip").expand_auto()
|
|
Luasnip_just_inserted = nil
|
|
end
|
|
end)
|
|
end
|
|
|
|
if session.config.cut_selection_keys then
|
|
vim.cmd(
|
|
string.format(
|
|
[[xnoremap <silent> %s %s]],
|
|
session.config.cut_selection_keys,
|
|
require("luasnip.util.select").cut_keys
|
|
)
|
|
)
|
|
end
|
|
end,
|
|
}
|
|
|
|
-- Keep these two for backward compativility
|
|
c.setup = c.set_config
|
|
|
|
return c
|