Improved plugins config table handling (#1356)
* Warns user if trying to disable a plugin that is already enabled when doing `config.plugins.plugin_name = false` and also prevents replacing the current plugin config table with the false value to mitigate runtime issues. * Uses a merge strategy by default when assigning a table to a plugin config to prevent a user from removing a plugin default config values as experienced and explained on this issue lite-xl-plugins#158 * This change is basically backwards compatible, but will require a change on the settings ui plugin on how it checks for already enabled plugins, since rawget will no longer be a working hack or workaround for this. * As suggested by Adam dropped loaded key and switched to package.loaded
This commit is contained in:
parent
2e02aede7c
commit
5b2538e856
|
@ -1,3 +1,5 @@
|
||||||
|
local common = require "core.common"
|
||||||
|
|
||||||
local config = {}
|
local config = {}
|
||||||
|
|
||||||
config.fps = 60
|
config.fps = 60
|
||||||
|
@ -55,13 +57,47 @@ config.max_clicks = 3
|
||||||
-- set as true to be able to test non supported plugins
|
-- set as true to be able to test non supported plugins
|
||||||
config.skip_plugins_version = false
|
config.skip_plugins_version = false
|
||||||
|
|
||||||
|
-- holds the plugins real config table
|
||||||
|
local plugins_config = {}
|
||||||
|
|
||||||
|
-- virtual representation of plugins config table
|
||||||
config.plugins = {}
|
config.plugins = {}
|
||||||
-- Allow you to set plugin configs even if we haven't seen the plugin before.
|
|
||||||
|
-- allows virtual access to the plugins config table
|
||||||
setmetatable(config.plugins, {
|
setmetatable(config.plugins, {
|
||||||
__index = function(t, k)
|
__index = function(_, k)
|
||||||
local v = rawget(t, k)
|
if not plugins_config[k] then
|
||||||
if v == true or v == nil then v = {} rawset(t, k, v) end
|
plugins_config[k] = { enabled = true, config = {} }
|
||||||
return v
|
end
|
||||||
|
if plugins_config[k].enabled ~= false then
|
||||||
|
return plugins_config[k].config
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end,
|
||||||
|
__newindex = function(_, k, v)
|
||||||
|
if not plugins_config[k] then
|
||||||
|
plugins_config[k] = { enabled = nil, config = {} }
|
||||||
|
end
|
||||||
|
if v == false and package.loaded["plugins."..k] then
|
||||||
|
local core = require "core"
|
||||||
|
core.warn("[%s] is already enabled, restart the editor for the change to take effect", k)
|
||||||
|
return
|
||||||
|
elseif plugins_config[k].enabled == false and v ~= false then
|
||||||
|
plugins_config[k].enabled = true
|
||||||
|
end
|
||||||
|
if v == false then
|
||||||
|
plugins_config[k].enabled = false
|
||||||
|
elseif type(v) == "table" then
|
||||||
|
plugins_config[k].enabled = true
|
||||||
|
plugins_config[k].config = common.merge(plugins_config[k].config, v)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
__pairs = function()
|
||||||
|
return coroutine.wrap(function()
|
||||||
|
for name, status in pairs(plugins_config) do
|
||||||
|
coroutine.yield(name, status.config)
|
||||||
|
end
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue