diff options
| author | Delta-official <darkussdelta@gmail.com> | 2023-08-04 13:38:33 +0000 |
|---|---|---|
| committer | jgmdev <jgmdev@gmail.com> | 2023-08-04 14:11:04 -0400 |
| commit | 9e5c2fc28b52900d8a1052aab93b740682a9d0cb (patch) | |
| tree | bb63e6063300d32c8b23e90ee59306d2f5ff9768 /data | |
| parent | e048a9c839ce8c0646d4ee6e435149c63a176a2b (diff) | |
| download | pragtical-9e5c2fc28b52900d8a1052aab93b740682a9d0cb.tar.gz pragtical-9e5c2fc28b52900d8a1052aab93b740682a9d0cb.zip | |
Normalize stroke before adding keybind (#1334)
* Normalize stroke before adding keybind
* improve normalization algorithm and implement normalization in several functions
Signed-off-by: delta <darkussdelta@gmail.com>
---------
Signed-off-by: delta <darkussdelta@gmail.com>
Diffstat (limited to 'data')
| -rw-r--r-- | data/core/keymap.lua | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/data/core/keymap.lua b/data/core/keymap.lua index d6a3a871..eb910307 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<string, string> 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 |
