You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
delaytrain.nvim/lua/delaytrain/init.lua

97 lines
2.3 KiB
Lua

local M = {}
vim.g.delaytrain_delay_ms = 1000
vim.g.delaytrain_grace_period = 1
-- Map of keys to their individual current grace period
-- This keeps track of how many times a key has been pressed
local current_grace_period_intervals = {}
local keymaps = {
['nv'] = {'h', 'j', 'k', 'l'},
['nvi'] = {'<Left>', '<Down>', '<Up>', '<Right>'},
}
local is_enabled = false
function M.try_delay_keypress(key)
current_interval = current_grace_period_intervals[key]
-- Start a timer on the first keypress to reset the interval
if current_interval == 0 then
vim.loop.new_timer():start(vim.g.delaytrain_delay_ms, 0, function()
current_grace_period_intervals[key] = 0
end)
end
-- 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
vim.api.nvim_feedkeys(
vim.api.nvim_replace_termcodes(key, true, false, true),
'n',
false
)
end
end
function M.setup(opts)
if opts then
if opts.delay_ms then
vim.g.delaytrain_delay_ms = opts.delay_ms
end
if opts.grace_period then
vim.g.delaytrain_grace_period = opts.grace_period
end
if opts.keys then
keymaps = opts.keys
end
end
M.enable()
end
function M.enable()
is_enabled = true
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
-- 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})
end
end
end
function M.disable()
is_enabled = false
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
vim.keymap.del(mode_array, key)
end
end
end
function M.toggle()
if is_enabled then
M.disable()
else
M.enable()
end
end
return M