From e62a672d7e8065c64cc7ef1d3b6eda296961c531 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 35e34e6a..70b7a3a9 100644 --- a/data/core/keymap.lua +++ b/data/core/keymap.lua @@ -35,6 +35,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 @@ -45,10 +62,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 @@ -74,6 +90,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 @@ -96,11 +113,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 @@ -128,6 +146,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 @@ -153,7 +172,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