From 75ea95ea3f220efdfcd5d396ca58c9594470ecbf Mon Sep 17 00:00:00 2001 From: Alessandro Ceserani Date: Wed, 16 Nov 2022 00:53:48 -0600 Subject: [PATCH 1/7] allow for remaps --- lua/delaytrain/init.lua | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/lua/delaytrain/init.lua b/lua/delaytrain/init.lua index e70befe..263f5a5 100644 --- a/lua/delaytrain/init.lua +++ b/lua/delaytrain/init.lua @@ -15,20 +15,20 @@ local keymaps = { local is_enabled = false -function M.try_delay_keypress(key) +function M.try_delay_keypress(key, keypress) current_interval = current_grace_period_intervals[key] -- ignore user defined patterns for _,ign_ft in ipairs(ignore_filetypes) do if vim.o.filetype:match(ign_ft) then - M.send_keypress(key) + M.send_keypress(keypress) return end end -- Ingore on macro execution if vim.fn.reg_executing() ~= "" then - M.send_keypress(key) + M.send_keypress(keypress) return end @@ -42,13 +42,13 @@ function M.try_delay_keypress(key) -- Pass the key through only if we haven't reached the grace period if current_interval < vim.g.delaytrain_grace_period then current_grace_period_intervals[key] = current_interval + 1 - M.send_keypress(key) + M.send_keypress(keypress) end end -function M.send_keypress(key) +function M.send_keypress(keypress) vim.api.nvim_feedkeys( - vim.api.nvim_replace_termcodes(key, true, false, true), + vim.api.nvim_replace_termcodes(keypress, true, false, true), 'n', false ) @@ -83,10 +83,18 @@ function M.enable() table.insert(mode_array, mode) end for _, key in ipairs(keys) do + -- Check that keys haven't been remapped (e.g. hjkl to dtrn) + local keypress = "" + local remapped = vim.fn.maparg(key, mode_array[1]) + if remapped ~= "" then + keypress = remapped + else + keypress = key + end -- Set the current grace period for the given key current_grace_period_intervals[key] = 0 - vim.keymap.set(mode_array, key, function() M.try_delay_keypress(key) end, {expr = true}) + vim.keymap.set(mode_array, key, function() M.try_delay_keypress(key, keypress) end, {expr = true}) end end end From 71a2f1d0d9c546bd6d5038695f708d9571521855 Mon Sep 17 00:00:00 2001 From: Alessandro Ceserani Date: Wed, 16 Nov 2022 01:10:28 -0600 Subject: [PATCH 2/7] check for remaps (cleanup conditional) --- lua/delaytrain/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lua/delaytrain/init.lua b/lua/delaytrain/init.lua index 263f5a5..8e16eca 100644 --- a/lua/delaytrain/init.lua +++ b/lua/delaytrain/init.lua @@ -86,10 +86,10 @@ function M.enable() -- Check that keys haven't been remapped (e.g. hjkl to dtrn) local keypress = "" local remapped = vim.fn.maparg(key, mode_array[1]) - if remapped ~= "" then - keypress = remapped - else + if remapped == "" then keypress = key + else + keypress = remapped end -- Set the current grace period for the given key current_grace_period_intervals[key] = 0 From c3339e7ac66e974ff9b704dd103d790582022def Mon Sep 17 00:00:00 2001 From: Alessandro Ceserani Date: Sat, 26 Nov 2022 18:37:47 -0600 Subject: [PATCH 3/7] handle return of func as str + double Enable --- lua/delaytrain/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lua/delaytrain/init.lua b/lua/delaytrain/init.lua index 8e16eca..795338c 100644 --- a/lua/delaytrain/init.lua +++ b/lua/delaytrain/init.lua @@ -85,8 +85,8 @@ function M.enable() for _, key in ipairs(keys) do -- Check that keys haven't been remapped (e.g. hjkl to dtrn) local keypress = "" - local remapped = vim.fn.maparg(key, mode_array[1]) - if remapped == "" then + local remapped = vim.fn.maparg(key, mode_array[1], false, true).rhs + if remapped == "" or remapped == nil then keypress = key else keypress = remapped From f8ff1e94c02ab96c1805b51ff7c8fc95d31a93d0 Mon Sep 17 00:00:00 2001 From: Alessandro Ceserani Date: Sat, 26 Nov 2022 22:15:45 -0600 Subject: [PATCH 4/7] remaps fix: ignore str representations of lua funcs --- lua/delaytrain/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lua/delaytrain/init.lua b/lua/delaytrain/init.lua index 8e16eca..8f78a37 100644 --- a/lua/delaytrain/init.lua +++ b/lua/delaytrain/init.lua @@ -85,11 +85,11 @@ function M.enable() for _, key in ipairs(keys) do -- Check that keys haven't been remapped (e.g. hjkl to dtrn) local keypress = "" - local remapped = vim.fn.maparg(key, mode_array[1]) - if remapped == "" then - keypress = key - else + local remapped = vim.fn.maparg(key, mode_array[1], false, true).rhs + if remapped then keypress = remapped + else + keypress = key end -- Set the current grace period for the given key current_grace_period_intervals[key] = 0 From 2ff84d2873300ec045a7ee8e055cfc08ddf46cfc Mon Sep 17 00:00:00 2001 From: Alessandro Ceserani Date: Sat, 26 Nov 2022 23:19:37 -0600 Subject: [PATCH 5/7] call vim.keymap.set for each mode with a unique keypress value --- lua/delaytrain/init.lua | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/lua/delaytrain/init.lua b/lua/delaytrain/init.lua index 795338c..e856816 100644 --- a/lua/delaytrain/init.lua +++ b/lua/delaytrain/init.lua @@ -77,24 +77,43 @@ end function M.enable() is_enabled = true + -- Get an array of all the keys we want to delay regardless of remap status + local function get_keypress_array (key, mode_array) + local keypress_array = {} + for _, mode in ipairs(mode_array) do + local keypress = key + local remapped = vim.fn.maparg(key, mode, false, true).rhs + if remapped then + keypress = remapped + end + + -- If keypress values differ across modes, add the new value here + if keypress_array[keypress] then + table.insert(keypress_array[keypress], mode) + -- Append any mode that has an equal value to previously seen modes + else + keypress_array[keypress] = {mode} + end + end + + -- If the keypress value is equal across modes, the array will only have one value, + -- so vim.keymap.set will be called once with a copy of the original mode_array + return keypress_array + end + for modes, keys in pairs(keymaps) do mode_array = {} for mode in modes:gmatch"." do table.insert(mode_array, mode) end + for _, key in ipairs(keys) do - -- Check that keys haven't been remapped (e.g. hjkl to dtrn) - local keypress = "" - local remapped = vim.fn.maparg(key, mode_array[1], false, true).rhs - if remapped == "" or remapped == nil then - keypress = key - else - keypress = remapped + local keypress_array = get_keypress_array(key, mode_array) + for keypress, key_modes in pairs(keypress_array) do + -- Set the current grace period for the given key + current_grace_period_intervals[key] = 0 + vim.keymap.set(key_modes, key, function() M.try_delay_keypress(key, keypress) end, {expr = true}) end - -- Set the current grace period for the given key - current_grace_period_intervals[key] = 0 - - vim.keymap.set(mode_array, key, function() M.try_delay_keypress(key, keypress) end, {expr = true}) end end end From 44c04393c4e63380976086ab7054de2b5afc22b8 Mon Sep 17 00:00:00 2001 From: Alessandro Ceserani Date: Mon, 28 Nov 2022 10:00:49 -0600 Subject: [PATCH 6/7] re-enable custom mappings on .disable() --- lua/delaytrain/init.lua | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/lua/delaytrain/init.lua b/lua/delaytrain/init.lua index e856816..ee16b65 100644 --- a/lua/delaytrain/init.lua +++ b/lua/delaytrain/init.lua @@ -15,6 +15,8 @@ local keymaps = { local is_enabled = false +local custom_mappings = {} + function M.try_delay_keypress(key, keypress) current_interval = current_grace_period_intervals[key] @@ -89,18 +91,24 @@ function M.enable() -- If keypress values differ across modes, add the new value here if keypress_array[keypress] then - table.insert(keypress_array[keypress], mode) - -- Append any mode that has an equal value to previously seen modes + table.insert(keypress_array[keypress].modes, mode) else - keypress_array[keypress] = {mode} + keypress_array[keypress] = {modes = {mode}, isremap = remapped ~= nil} end end - -- If the keypress value is equal across modes, the array will only have one value, - -- so vim.keymap.set will be called once with a copy of the original mode_array return keypress_array end + -- Preserve old keymap so it can be restored after calling M.disable() + local function preserve_custom_mappings(lhs, rhs, modes) + if custom_mappings[lhs] then + table.insert(custom_mappings[lhs], {rhs = rhs, modes = modes}) + else + custom_mappings[lhs] = {{rhs = rhs, modes = modes}} + end + end + for modes, keys in pairs(keymaps) do mode_array = {} for mode in modes:gmatch"." do @@ -109,13 +117,18 @@ function M.enable() for _, key in ipairs(keys) do local keypress_array = get_keypress_array(key, mode_array) - for keypress, key_modes in pairs(keypress_array) do + for keypress, key_data in pairs(keypress_array) do + if key_data.isremap then + preserve_custom_mappings(key, keypress, key_data.modes) + end -- Set the current grace period for the given key current_grace_period_intervals[key] = 0 - vim.keymap.set(key_modes, key, function() M.try_delay_keypress(key, keypress) end, {expr = true}) + vim.keymap.set(key_data.modes, key, function() M.try_delay_keypress(key, keypress) end, {expr = true}) end end end + + end function M.disable() @@ -128,6 +141,12 @@ function M.disable() end for _, key in ipairs(keys) do vim.keymap.del(mode_array, key) + -- Re-enable custom mappings + if custom_mappings[key] then + for _, map_values in pairs(custom_mappings[key]) do + vim.keymap.set(map_values.modes, key, map_values.rhs) + end + end end end end From 28f100cffb0bb6cde8af43a8aef1ee3c78edd6a9 Mon Sep 17 00:00:00 2001 From: Alessandro Ceserani Date: Wed, 28 Dec 2022 16:39:03 -0600 Subject: [PATCH 7/7] Rename keypress_array and get_keypress array to key_mappings / get_key_mappings --- lua/delaytrain/init.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lua/delaytrain/init.lua b/lua/delaytrain/init.lua index ee16b65..4b61b9b 100644 --- a/lua/delaytrain/init.lua +++ b/lua/delaytrain/init.lua @@ -80,8 +80,8 @@ function M.enable() is_enabled = true -- Get an array of all the keys we want to delay regardless of remap status - local function get_keypress_array (key, mode_array) - local keypress_array = {} + local function get_key_mappings (key, mode_array) + local key_mappings = {} for _, mode in ipairs(mode_array) do local keypress = key local remapped = vim.fn.maparg(key, mode, false, true).rhs @@ -90,14 +90,14 @@ function M.enable() end -- If keypress values differ across modes, add the new value here - if keypress_array[keypress] then - table.insert(keypress_array[keypress].modes, mode) + if key_mappings[keypress] then + table.insert(key_mappings[keypress].modes, mode) else - keypress_array[keypress] = {modes = {mode}, isremap = remapped ~= nil} + key_mappings[keypress] = {modes = {mode}, isremap = remapped ~= nil} end end - return keypress_array + return key_mappings end -- Preserve old keymap so it can be restored after calling M.disable() @@ -116,8 +116,8 @@ function M.enable() end for _, key in ipairs(keys) do - local keypress_array = get_keypress_array(key, mode_array) - for keypress, key_data in pairs(keypress_array) do + local key_mappings = get_key_mappings(key, mode_array) + for keypress, key_data in pairs(key_mappings) do if key_data.isremap then preserve_custom_mappings(key, keypress, key_data.modes) end