Hyprland-dotfiles/nvim/lua/keymap/bind.lua
2024-07-21 02:51:17 -04:00

170 lines
3.6 KiB
Lua

---@class map_rhs
---@field cmd string
---@field options table
---@field options.noremap boolean
---@field options.silent boolean
---@field options.expr boolean
---@field options.nowait boolean
---@field options.callback function
---@field options.desc string
---@field buffer boolean|number
local rhs_options = {}
function rhs_options:new()
local instance = {
cmd = "",
options = {
noremap = false,
silent = false,
expr = false,
nowait = false,
callback = nil,
desc = "",
},
buffer = false,
}
setmetatable(instance, self)
self.__index = self
return instance
end
---@param cmd_string string
---@return map_rhs
function rhs_options:map_cmd(cmd_string)
self.cmd = cmd_string
return self
end
---@param cmd_string string
---@return map_rhs
function rhs_options:map_cr(cmd_string)
self.cmd = (":%s<CR>"):format(cmd_string)
return self
end
---@param cmd_string string
---@return map_rhs
function rhs_options:map_args(cmd_string)
self.cmd = (":%s<Space>"):format(cmd_string)
return self
end
---@param cmd_string string
---@return map_rhs
function rhs_options:map_cu(cmd_string)
-- <C-u> to eliminate the automatically inserted range in visual mode
self.cmd = (":<C-u>%s<CR>"):format(cmd_string)
return self
end
---@param callback fun():nil
--- Takes a callback that will be called when the key is pressed
---@return map_rhs
function rhs_options:map_callback(callback)
self.cmd = ""
self.options.callback = callback
return self
end
---@return map_rhs
function rhs_options:with_silent()
self.options.silent = true
return self
end
---@param description_string string
---@return map_rhs
function rhs_options:with_desc(description_string)
self.options.desc = description_string
return self
end
---@return map_rhs
function rhs_options:with_noremap()
self.options.noremap = true
return self
end
---@return map_rhs
function rhs_options:with_expr()
self.options.expr = true
return self
end
---@return map_rhs
function rhs_options:with_nowait()
self.options.nowait = true
return self
end
---@param num number
---@return map_rhs
function rhs_options:with_buffer(num)
self.buffer = num
return self
end
local bind = {}
---@param cmd_string string
---@return map_rhs
function bind.map_cr(cmd_string)
local ro = rhs_options:new()
return ro:map_cr(cmd_string)
end
---@param cmd_string string
---@return map_rhs
function bind.map_cmd(cmd_string)
local ro = rhs_options:new()
return ro:map_cmd(cmd_string)
end
---@param cmd_string string
---@return map_rhs
function bind.map_cu(cmd_string)
local ro = rhs_options:new()
return ro:map_cu(cmd_string)
end
---@param cmd_string string
---@return map_rhs
function bind.map_args(cmd_string)
local ro = rhs_options:new()
return ro:map_args(cmd_string)
end
---@param callback fun():nil
---@return map_rhs
function bind.map_callback(callback)
local ro = rhs_options:new()
return ro:map_callback(callback)
end
---@param cmd_string string
---@return string escaped_string
function bind.escape_termcode(cmd_string)
return vim.api.nvim_replace_termcodes(cmd_string, true, true, true)
end
---@param mapping table<string, map_rhs>
function bind.nvim_load_mapping(mapping)
for key, value in pairs(mapping) do
local modes, keymap = key:match("([^|]*)|?(.*)")
if type(value) == "table" then
for _, mode in ipairs(vim.split(modes, "")) do
local rhs = value.cmd
local options = value.options
local buf = value.buffer
if buf and type(buf) == "number" then
vim.api.nvim_buf_set_keymap(buf, mode, keymap, rhs, options)
else
vim.api.nvim_set_keymap(mode, keymap, rhs, options)
end
end
end
end
end
return bind