2022-12-05 21:45:50 +08:00
|
|
|
local Util = require("lazy.core.util")
|
|
|
|
local Loader = require("lazy.core.loader")
|
|
|
|
|
2022-12-22 17:32:21 +08:00
|
|
|
---@class LazyKeys
|
|
|
|
---@field [1] string lhs
|
|
|
|
---@field [2]? string|fun() rhs
|
|
|
|
---@field desc? string
|
|
|
|
---@field mode? string|string[]
|
|
|
|
---@field noremap? boolean
|
|
|
|
---@field remap? boolean
|
|
|
|
---@field expr? boolean
|
|
|
|
|
2022-12-05 21:45:50 +08:00
|
|
|
---@class LazyKeysHandler:LazyHandler
|
|
|
|
local M = {}
|
|
|
|
|
2023-01-04 14:54:35 +08:00
|
|
|
---@param feed string
|
|
|
|
function M.replace_special(feed)
|
2023-01-04 21:02:48 +08:00
|
|
|
for special, key in pairs({ leader = vim.g.mapleader or "\\", localleader = vim.g.maplocalleader or "\\" }) do
|
2023-01-04 14:54:35 +08:00
|
|
|
local pattern = "<"
|
|
|
|
for i = 1, #special do
|
|
|
|
pattern = pattern .. "[" .. special:sub(i, i) .. special:upper():sub(i, i) .. "]"
|
|
|
|
end
|
|
|
|
pattern = pattern .. ">"
|
|
|
|
feed = feed:gsub(pattern, key)
|
|
|
|
end
|
|
|
|
return feed
|
|
|
|
end
|
|
|
|
|
2022-12-22 17:32:21 +08:00
|
|
|
function M.retrigger(keys)
|
|
|
|
local pending = ""
|
|
|
|
while true do
|
2022-12-26 22:55:40 +08:00
|
|
|
---@type number|string
|
2022-12-22 17:32:21 +08:00
|
|
|
local c = vim.fn.getchar(0)
|
|
|
|
if c == 0 then
|
|
|
|
break
|
|
|
|
end
|
2022-12-26 22:55:40 +08:00
|
|
|
c = type(c) == "number" and vim.fn.nr2char(c) or c
|
|
|
|
pending = pending .. c
|
2022-12-22 17:32:21 +08:00
|
|
|
end
|
2023-01-03 18:17:37 +08:00
|
|
|
local op = vim.v.operator
|
2023-01-03 23:16:49 +08:00
|
|
|
if op and op ~= "" and vim.api.nvim_get_mode().mode:find("o") then
|
2023-01-03 18:16:15 +08:00
|
|
|
keys = "<esc>" .. op .. keys
|
|
|
|
end
|
2023-01-04 14:54:35 +08:00
|
|
|
local feed = keys .. pending
|
|
|
|
feed = M.replace_special(feed)
|
2022-12-31 03:51:13 +08:00
|
|
|
if vim.v.count ~= 0 then
|
|
|
|
feed = vim.v.count .. feed
|
|
|
|
end
|
2023-01-03 23:16:49 +08:00
|
|
|
vim.api.nvim_input(feed)
|
2022-12-22 17:32:21 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
---@param value string|LazyKeys
|
|
|
|
function M.parse(value)
|
2022-12-23 00:49:32 +08:00
|
|
|
local ret = vim.deepcopy(value)
|
2022-12-23 04:58:01 +08:00
|
|
|
ret = type(ret) == "string" and { ret } or ret --[[@as LazyKeys]]
|
2022-12-23 00:49:32 +08:00
|
|
|
ret.mode = ret.mode or "n"
|
|
|
|
return ret
|
2022-12-22 17:32:21 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
function M.opts(keys)
|
|
|
|
local opts = {}
|
|
|
|
for k, v in pairs(keys) do
|
|
|
|
if type(k) ~= "number" and k ~= "mode" then
|
|
|
|
opts[k] = v
|
2022-12-22 02:01:58 +08:00
|
|
|
end
|
2022-12-22 17:32:21 +08:00
|
|
|
end
|
|
|
|
return opts
|
|
|
|
end
|
|
|
|
|
2022-12-23 04:58:01 +08:00
|
|
|
---@return string
|
|
|
|
function M:key(value)
|
|
|
|
if type(value) == "string" then
|
|
|
|
return value
|
|
|
|
end
|
|
|
|
local mode = value.mode or { "n" }
|
|
|
|
if type(mode) == "string" then
|
|
|
|
mode = { mode }
|
|
|
|
end
|
|
|
|
---@type string
|
|
|
|
local ret = value[1]
|
|
|
|
if #mode > 0 then
|
|
|
|
ret = table.concat(mode, ",") .. ": " .. ret
|
|
|
|
end
|
|
|
|
return ret
|
|
|
|
end
|
|
|
|
|
2022-12-22 17:32:21 +08:00
|
|
|
---@param value string|LazyKeys
|
|
|
|
function M:_add(value)
|
|
|
|
local keys = M.parse(value)
|
|
|
|
local lhs = keys[1]
|
2022-12-23 00:49:32 +08:00
|
|
|
local opts = M.opts(keys)
|
|
|
|
vim.keymap.set(keys.mode, lhs, function()
|
2022-12-25 23:17:36 +08:00
|
|
|
local key = self:key(value)
|
|
|
|
local plugins = self.active[key]
|
|
|
|
|
|
|
|
-- always delete the mapping immediately to prevent recursive mappings
|
|
|
|
self:_del(value)
|
|
|
|
self.active[key] = nil
|
|
|
|
|
2022-12-22 17:32:21 +08:00
|
|
|
Util.track({ keys = lhs })
|
2022-12-25 23:17:36 +08:00
|
|
|
Loader.load(plugins, { keys = lhs })
|
2022-12-22 17:32:21 +08:00
|
|
|
M.retrigger(lhs)
|
2022-12-05 21:45:50 +08:00
|
|
|
Util.track()
|
2022-12-23 00:49:32 +08:00
|
|
|
end, opts)
|
2022-12-05 21:45:50 +08:00
|
|
|
end
|
|
|
|
|
2022-12-22 17:32:21 +08:00
|
|
|
---@param value string|LazyKeys
|
|
|
|
function M:_del(value)
|
|
|
|
local keys = M.parse(value)
|
2022-12-23 00:49:32 +08:00
|
|
|
pcall(vim.keymap.del, keys.mode, keys[1])
|
2022-12-22 17:32:21 +08:00
|
|
|
if keys[2] then
|
2022-12-23 00:49:32 +08:00
|
|
|
vim.keymap.set(keys.mode, keys[1], keys[2], M.opts(keys))
|
2022-12-22 17:32:21 +08:00
|
|
|
end
|
2022-12-05 21:45:50 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
return M
|