From e95dacc05ce4663de50b631f01fe09dac88954a2 Mon Sep 17 00:00:00 2001 From: Mat Jones Date: Mon, 29 Apr 2024 08:54:23 -0400 Subject: [PATCH] fix(api): Restore previous mappings on exit from resize mode --- lua/smart-splits/resize-mode.lua | 56 ++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/lua/smart-splits/resize-mode.lua b/lua/smart-splits/resize-mode.lua index aeb0e13..05142d9 100644 --- a/lua/smart-splits/resize-mode.lua +++ b/lua/smart-splits/resize-mode.lua @@ -11,6 +11,51 @@ local function wrap(fn) end end +M.__map_cache = {} +---Store any existing mappings to be restored after exit +---@param resize_keys string[] +---@param quit_key string +local function cache_mappings(resize_keys, quit_key) + local maps = vim.api.nvim_get_keymap('n') + M.__map_cache = {} + for _, map in ipairs(maps) do + if + map.lhs == resize_keys[1] + or map.lhs == resize_keys[2] + or map.lhs == resize_keys[3] + or map.lhs == resize_keys[4] + or map.lhs == quit_key + then + M.__map_cache[map.lhs] = map + end + end +end + +---Restore mappings from cache on exit +local function restore_maps(resize_keys, quit_key) + -- delete the keymaps we've set + vim.api.nvim_del_keymap('n', resize_keys[1]) + vim.api.nvim_del_keymap('n', resize_keys[2]) + vim.api.nvim_del_keymap('n', resize_keys[3]) + vim.api.nvim_del_keymap('n', resize_keys[4]) + vim.api.nvim_del_keymap('n', quit_key) + + -- restore previous ones, if there are any + for lhs, mapdef in pairs(M.__map_cache) do + local opts = { + buffer = mapdef.buffer, + nowait = mapdef.nowait == 1, + silent = mapdef.silent == 1, + script = mapdef.script ~= 0 and mapdef.script or nil, + expr = mapdef.expr == 1, + remap = mapdef.noremap == 0, + } + local rhs = mapdef.callback or mapdef.rhs + vim.keymap.set('n', lhs, rhs, opts) + end + M.__map_cache = {} +end + function M.start_resize_mode() if vim.fn.mode() ~= 'n' then log.error('Resize mode must be triggered from normal mode') @@ -21,8 +66,9 @@ function M.start_resize_mode() -- luacheck:ignore vim.g.smart_resize_mode = true - local quit_key = config.resize_mode.quit_key local resize_keys = config.resize_mode.resize_keys + local quit_key = config.resize_mode.quit_key + cache_mappings(resize_keys, quit_key) vim.keymap.set('n', resize_keys[1], wrap(require('smart-splits').resize_left), { silent = true }) vim.keymap.set('n', resize_keys[2], wrap(require('smart-splits').resize_down), { silent = true }) vim.keymap.set('n', resize_keys[3], wrap(require('smart-splits').resize_up), { silent = true }) @@ -42,13 +88,9 @@ function M.start_resize_mode() end function M.end_resize_mode() - local quit_key = config.resize_mode.quit_key local resize_keys = config.resize_mode.resize_keys - vim.api.nvim_del_keymap('n', resize_keys[1]) - vim.api.nvim_del_keymap('n', resize_keys[2]) - vim.api.nvim_del_keymap('n', resize_keys[3]) - vim.api.nvim_del_keymap('n', resize_keys[4]) - vim.api.nvim_del_keymap('n', quit_key) + local quit_key = config.resize_mode.quit_key + restore_maps(resize_keys, quit_key) pcall(config.resize_mode.hooks.on_leave) -- luacheck:ignore