From a80414fb0b2091304b9203cf668238d8dfae5520 Mon Sep 17 00:00:00 2001 From: Delta-official Date: Fri, 4 Aug 2023 13:38:33 +0000 Subject: [PATCH] Normalize stroke before adding keybind (#1334) * Normalize stroke before adding keybind * improve normalization algorithm and implement normalization in several functions Signed-off-by: delta --------- Signed-off-by: delta --- data/core/keymap.lua | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/data/core/keymap.lua b/data/core/keymap.lua index fe33e43a..0f30078b 100644 --- a/data/core/keymap.lua +++ b/data/core/keymap.lua @@ -37,6 +37,23 @@ local modkey_map = modkeys_os.map local modkeys = modkeys_os.keys +---Normalizes a stroke sequence to follow the modkeys table +---@param stroke string +---@return string +local function normalize_stroke(stroke) + local stroke_table = {} + for modkey in stroke:gmatch("(%w+)%+") do + table.insert(stroke_table, modkey) + end + if not next(stroke_table) then + return stroke + end + table.sort(stroke_table) + local new_stroke = table.concat(stroke_table, "+") .. "+" + return new_stroke .. stroke:sub(new_stroke:len() + 1) +end + + ---Generates a stroke sequence including currently pressed mod keys. ---@param key string ---@return string @@ -47,10 +64,9 @@ local function key_to_stroke(key) stroke = stroke .. mk .. "+" end end - return stroke .. key + return normalize_stroke(stroke) .. key end - ---Remove the given value from an array associated to a key in a table. ---@param tbl table The table containing the key ---@param k string The key containing the array @@ -76,6 +92,7 @@ end ---@param map keymap.map local function remove_duplicates(map) for stroke, commands in pairs(map) do + stroke = normalize_stroke(stroke) if type(commands) == "string" or type(commands) == "function" then commands = { commands } end @@ -98,11 +115,12 @@ local function remove_duplicates(map) end end - ---Add bindings by replacing commands that were previously assigned to a shortcut. ---@param map keymap.map function keymap.add_direct(map) for stroke, commands in pairs(map) do + stroke = normalize_stroke(stroke) + if type(commands) == "string" or type(commands) == "function" then commands = { commands } end @@ -130,6 +148,7 @@ function keymap.add(map, overwrite) if macos then stroke = stroke:gsub("%f[%a]ctrl%f[%A]", "cmd") end + stroke = normalize_stroke(stroke) if overwrite then if keymap.map[stroke] then for _, cmd in ipairs(keymap.map[stroke]) do @@ -155,7 +174,7 @@ end ---@param shortcut string ---@param cmd string function keymap.unbind(shortcut, cmd) - remove_only(keymap.map, shortcut, cmd) + remove_only(keymap.map, normalize_stroke(shortcut), cmd) remove_only(keymap.reverse_map, cmd, shortcut) end