140 lines
4.1 KiB
Lua
140 lines
4.1 KiB
Lua
local M = {}
|
|
|
|
-- keeps backup of options that we cahge so we can restore it.
|
|
-- format:
|
|
-- options {
|
|
-- global = <1> {
|
|
-- name = {prev, set}
|
|
-- },
|
|
-- buffer = {
|
|
-- buf1 = <1>,
|
|
-- buf2 = <1>
|
|
-- },
|
|
-- window = {
|
|
-- win1 = <1>,
|
|
-- win2 = <1>
|
|
-- }
|
|
-- }
|
|
---@class LualineNvimOptCacheOptStore
|
|
---@field prev any
|
|
---@field set any
|
|
---@alias LualineNvimOptCacheOpt table<string, LualineNvimOptCacheOptStore>
|
|
---@class LualineNvimOptCache
|
|
---@field global LualineNvimOptCacheOpt[]
|
|
---@field buffer table<number, LualineNvimOptCacheOpt[]>
|
|
---@field window table<number, LualineNvimOptCacheOpt[]>
|
|
---@type LualineNvimOptCache
|
|
local options = { global = {}, buffer = {}, window = {} }
|
|
|
|
-- helper function for M.set
|
|
local function set_opt(name, val, getter_fn, setter_fn, cache_tbl)
|
|
-- before nvim 0.7 nvim_win_get_option... didn't return default value when
|
|
-- the option wasn't set instead threw error.
|
|
-- So we need pcall (probably just for test)
|
|
local ok, cur = pcall(getter_fn, name)
|
|
if not ok then
|
|
cur = nil
|
|
end
|
|
if cur == val then
|
|
return
|
|
end
|
|
if cache_tbl[name] == nil then
|
|
cache_tbl[name] = {}
|
|
end
|
|
if cache_tbl[name].set ~= cur then
|
|
cache_tbl[name].prev = cur
|
|
end
|
|
cache_tbl[name].set = val
|
|
setter_fn(name, val)
|
|
end
|
|
|
|
-- set a option value
|
|
---@param name string
|
|
---@param val any
|
|
---@param opts table|nil when table can be {global=true | buffer = bufnr | window = winnr}
|
|
--- when nil it's treated as {global = true}
|
|
function M.set(name, val, opts)
|
|
if opts == nil or opts.global then
|
|
set_opt(name, val, vim.api.nvim_get_option, vim.api.nvim_set_option, options.global)
|
|
elseif opts.buffer then
|
|
if options.buffer[opts.buffer] == nil then
|
|
options.buffer[opts.buffer] = {}
|
|
end
|
|
set_opt(name, val, function(nm)
|
|
return vim.api.nvim_buf_get_option(opts.buffer, nm)
|
|
end, function(nm, vl)
|
|
vim.api.nvim_buf_set_option(opts.buffer, nm, vl)
|
|
end, options.buffer[opts.buffer])
|
|
elseif opts.window then
|
|
if options.window[opts.window] == nil then
|
|
options.window[opts.window] = {}
|
|
end
|
|
set_opt(name, val, function(nm)
|
|
return vim.api.nvim_win_get_option(opts.window, nm)
|
|
end, function(nm, vl)
|
|
vim.api.nvim_win_set_option(opts.window, nm, vl)
|
|
end, options.window[opts.window])
|
|
end
|
|
end
|
|
|
|
-- resoters old value of option name
|
|
---@param name string
|
|
---@param opts table|nil same as M.set
|
|
function M.restore(name, opts)
|
|
if opts == nil or opts.global then
|
|
if options.global[name] ~= nil and options.global[name].prev ~= nil then
|
|
vim.api.nvim_set_option(name, options.global[name].prev)
|
|
end
|
|
elseif opts.buffer then
|
|
if
|
|
options.buffer[opts.buffer] ~= nil
|
|
and options.buffer[opts.buffer][name] ~= nil
|
|
and options.buffer[opts.buffer][name].prev ~= nil
|
|
then
|
|
vim.api.nvim_buf_set_option(opts.buffer, name, options.buffer[opts.buffer][name].prev)
|
|
end
|
|
elseif opts.window then
|
|
if
|
|
options.window[opts.window] ~= nil
|
|
and options.window[opts.window][name] ~= nil
|
|
and options.window[opts.window][name].prev ~= nil
|
|
then
|
|
vim.api.nvim_win_set_option(opts.window, name, options.window[opts.window][name].prev)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- returns cache for the option name
|
|
---@param name string
|
|
---@param opts table|nil same as M.set
|
|
function M.get_cache(name, opts)
|
|
if opts == nil or opts.global then
|
|
if options.global[name] ~= nil and options.global[name].prev ~= nil then
|
|
return options.global[name].prev
|
|
end
|
|
elseif opts.buffer then
|
|
if
|
|
options.buffer[opts.buffer] ~= nil
|
|
and options.buffer[opts.buffer][name] ~= nil
|
|
and options.buffer[opts.buffer][name].prev ~= nil
|
|
then
|
|
return options.buffer[opts.buffer][name].prev
|
|
end
|
|
elseif opts.window then
|
|
if
|
|
options.window[opts.window] ~= nil
|
|
and options.window[opts.window][name] ~= nil
|
|
and options.window[opts.window][name].prev ~= nil
|
|
then
|
|
return options.window[opts.window][name].prev
|
|
end
|
|
end
|
|
end
|
|
|
|
-- resets cache for options
|
|
function M.reset_cache()
|
|
options = { global = {}, buffer = {}, window = {} }
|
|
end
|
|
|
|
return M
|