aboutsummaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorDelta-official <darkussdelta@gmail.com>2023-08-04 13:38:33 +0000
committerjgmdev <jgmdev@gmail.com>2023-08-04 14:11:04 -0400
commit9e5c2fc28b52900d8a1052aab93b740682a9d0cb (patch)
treebb63e6063300d32c8b23e90ee59306d2f5ff9768 /data
parente048a9c839ce8c0646d4ee6e435149c63a176a2b (diff)
downloadpragtical-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.lua27
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