Skip to content

Commit

Permalink
feat: require'impairative'.toggling for creating enable/disable/tog…
Browse files Browse the repository at this point in the history
…gle trios of keymaps
  • Loading branch information
idanarye committed May 21, 2024
1 parent dd9fe13 commit 5519022
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 0 deletions.
11 changes: 11 additions & 0 deletions lua/impairative/init.lua
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
---@mod impairative Impairative - Pairs of complementing keybinds
local M = {}

---Doesn't do anything, but some plugins managers expect all plugins to have one.
function M.setup()
end

---@param opts ImpairativeTogglingOptions
---@return ImpairativeToggling
function M.toggling(opts)
return setmetatable({
_opts = opts,
}, {
__index = require'impairative.toggling',
})
end

return M
66 changes: 66 additions & 0 deletions lua/impairative/toggling.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---@class ImpairativeTogglingOptions
---@field enable string Leader keys for turning settings on
---@field disable string Leader keys for turning settings off
---@field toggle string Leader keys for toggling settings
local ImpairativeTogglingOptions

---@class ImpairativeToggling
---@field _opts ImpairativeTogglingOptions
local ImpairativeToggling = {}

---@class ImpairativeTogglingGetterSetterArgs
---@field key string
---@field name string?
---@field get fun(): boolean
---@field set fun(value: boolean)
local ImpairativeTogglingGetterSetterArgs

---@param args ImpairativeTogglingGetterSetterArgs
---@return ImpairativeToggling
function ImpairativeToggling:getter_setter(args)
vim.keymap.set('n', self._opts.toggle .. args.key, function()
args.set(not args.get())
end)
vim.keymap.set('n', self._opts.enable .. args.key, function()
args.set(true)
end)
vim.keymap.set('n', self._opts.disable .. args.key, function()
args.set(false)
end)
return self
end

--local ImpairativeTogglingFieldArgsValues

---@class (exact) ImpairativeTogglingFieldArgs
---@field key string
---@field name string?
---@field table table
---@field field string
---@field values? {[true]: any, [false]: any}
local ImpairativeTogglingFieldArgs

---@param args ImpairativeTogglingFieldArgs
---@return ImpairativeToggling
function ImpairativeToggling:field(args)
return self:getter_setter {
key = args.key,
name = args.name,
get = function()
if args.values then
return args.table[args.field] == args.values[true]
else
return args.table[args.field]
end
end,
set = function(value)
if args.values then
args.table[args.field] = args.values[value]
else
args.table[args.field] = value
end
end,
}
end

return ImpairativeToggling

0 comments on commit 5519022

Please sign in to comment.