104 lines
2.3 KiB
Lua
104 lines
2.3 KiB
Lua
-- Extracted from: https://github.com/MunifTanjim/nui.nvim/blob/main/lua/nui/utils/keymap.lua
|
|
local buf_storage = require("avante.utils.buf_storage")
|
|
local utils = require("avante.utils")
|
|
|
|
local api = vim.api
|
|
|
|
local keymap = {
|
|
storage = buf_storage.create("avante.utils.keymap", { _next_handler_id = 1, keys = {}, handlers = {} }),
|
|
}
|
|
|
|
---@param mode string
|
|
---@param key string
|
|
---@return string key_id
|
|
local function get_key_id(mode, key)
|
|
return string.format("%s---%s", mode, vim.api.nvim_replace_termcodes(key, true, true, true))
|
|
end
|
|
|
|
---@param bufnr number
|
|
---@param key_id string
|
|
---@return integer|nil handler_id
|
|
local function get_handler_id(bufnr, key_id)
|
|
return keymap.storage[bufnr].keys[key_id]
|
|
end
|
|
|
|
---@param bufnr number
|
|
---@param mode string
|
|
---@param key string
|
|
---@param handler string|fun(): nil
|
|
---@return { rhs: string, callback?: fun(): nil }|nil
|
|
local function get_keymap_info(bufnr, mode, key, handler, overwrite)
|
|
local key_id = get_key_id(mode, key)
|
|
|
|
-- luacov: disable
|
|
if get_handler_id(bufnr, key_id) and not overwrite then
|
|
return nil
|
|
end
|
|
-- luacov: enable
|
|
|
|
local rhs, callback = "", nil
|
|
|
|
if type(handler) == "function" then
|
|
callback = handler
|
|
else
|
|
rhs = handler
|
|
end
|
|
|
|
return {
|
|
rhs = rhs,
|
|
callback = callback,
|
|
}
|
|
end
|
|
|
|
---@param bufnr number
|
|
---@param mode string|string[]
|
|
---@param lhs string|string[]
|
|
---@param handler string|fun(): nil
|
|
---@param opts? vim.keymap.set.Opts
|
|
---@return nil
|
|
function keymap.set(bufnr, mode, lhs, handler, opts, force)
|
|
if not utils.is_type("boolean", force) then
|
|
force = true
|
|
end
|
|
|
|
local keys = lhs
|
|
if type(lhs) ~= "table" then
|
|
keys = { lhs }
|
|
end
|
|
---@cast keys -string
|
|
|
|
opts = opts or {}
|
|
|
|
if not utils.is_type("nil", opts.remap) then
|
|
opts.noremap = not opts.remap
|
|
opts.remap = nil
|
|
end
|
|
|
|
local modes = {}
|
|
if type(mode) == "string" then
|
|
modes = { mode }
|
|
else
|
|
modes = mode
|
|
end
|
|
|
|
for _, key in ipairs(keys) do
|
|
for _, mode_ in ipairs(modes) do
|
|
local keymap_info = get_keymap_info(bufnr, mode_, key, handler, force)
|
|
-- luacov: disable
|
|
if not keymap_info then
|
|
return false
|
|
end
|
|
-- luacov: enable
|
|
|
|
local options = vim.deepcopy(opts)
|
|
options.callback = keymap_info.callback
|
|
|
|
api.nvim_buf_set_keymap(bufnr, mode_, key, keymap_info.rhs, options)
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
return keymap
|