diff --git a/lua/cmp/utils/keymap.lua b/lua/cmp/utils/keymap.lua index 1757cd3..0594c00 100644 --- a/lua/cmp/utils/keymap.lua +++ b/lua/cmp/utils/keymap.lua @@ -93,25 +93,11 @@ keymap.listen = setmetatable({ keys = keymap.to_keymap(keys) local bufnr = vim.api.nvim_get_current_buf() - if keymap.listen.cache:get({ mode, bufnr, keys }) then + if self.cache:get({ mode, bufnr, keys }) then return end - local existing = { - lhs = keys, - rhs = keys, - expr = 0, - nowait = 0, - noremap = 1, - } - for _, map in ipairs(keymap._getmaps(mode)) do - if map.lhs == keys then - existing = map - break - end - end - - local fallback = keymap._evacuate(mode, existing) + local fallback = keymap.evacuate(mode, keys) vim.api.nvim_buf_set_keymap(0, mode, keys, ('call v:lua.cmp.utils.keymap.listen.run("%s", "%s")'):format(mode, str.escape(keymap.escape(keys), { '"' })), { expr = false, noremap = true, @@ -120,7 +106,6 @@ keymap.listen = setmetatable({ }) self.cache:set({ mode, bufnr, keys }, { mode = mode, - existing = existing, callback = callback, fallback = fallback, }) @@ -138,9 +123,10 @@ end) ---Evacuate existing key mapping ---@param mode string ----@param map table +---@param lhs string ---@return string -keymap._evacuate = function(mode, map) +keymap.evacuate = function(mode, lhs) + local map = keymap.find_map_by_lhs(mode, lhs) -- Keep existing mapping as mapping. We escape fisrt recursive key sequence. See `:help recursive_mapping`) local rhs = map.rhs if map.noremap == 0 then @@ -165,18 +151,30 @@ keymap._evacuate = function(mode, map) return fallback end ----Get all available key mappings. +---Get specific key mapping ---@param mode string ----@return table[] -keymap._getmaps = function(mode) - local maps = {} +---@param lhs string +---@return table +keymap.find_map_by_lhs = function(mode, lhs) for _, map in ipairs(vim.api.nvim_buf_get_keymap(0, mode)) do - table.insert(maps, map) + if map.lhs == lhs then + return map + end end for _, map in ipairs(vim.api.nvim_get_keymap(mode)) do - table.insert(maps, map) + if map.lhs == lhs then + return map + end end - return maps + return { + lhs = lhs, + rhs = lhs, + expr = 0, + script = 0, + noremap = 1, + nowait = 0, + silent = 1, + } end return keymap diff --git a/lua/cmp/utils/keymap_spec.lua b/lua/cmp/utils/keymap_spec.lua index 7d9c287..258d4ee 100644 --- a/lua/cmp/utils/keymap_spec.lua +++ b/lua/cmp/utils/keymap_spec.lua @@ -17,26 +17,34 @@ describe('keymap', function() assert.are.equal(keymap.escape('C-d>'), 'C-d>') end) - it('_evacuate', function() - local s = function(cmd, keys, buf) - spec.before() - vim.cmd(cmd) - local existing = vim.tbl_filter(function(map) - return map.lhs == keys - end, keymap._getmaps('i'))[1] or { - lhs = keys, - rhs = keys, - expr = 0, - nowait = 0, - noremap = 1, - } - local fallback = keymap._evacuate('i', existing) + describe('evacuate', function() + + before_each(spec.before) + + it('expr & register', function() + vim.api.nvim_buf_set_keymap(0, 'i', '(', [['="("']], { + expr = true, + noremap = false, + }) + local fallback = keymap.evacuate('i', '(') vim.api.nvim_feedkeys('i' .. keymap.t(fallback), 'x', true) - assert.are.same(vim.api.nvim_buf_get_lines(0, 0, -1, true), buf) - end - s([[]], '(', { '(' }) - s([[imap ( '="("']], '(', { '(' }) - s([[imap ( (]], '(', { '(' }) + assert.are.same({ '(' }, vim.api.nvim_buf_get_lines(0, 0, -1, true)) + end) + + it('recursive & (tpope/vim-endwise)', function() + vim.api.nvim_buf_set_keymap(0, 'i', '(paren-close)', [[)]], { + expr = false, + noremap = true, + }) + vim.api.nvim_buf_set_keymap(0, 'i', '(', [[((paren-close)]], { + expr = false, + noremap = false, + }) + local fallback = keymap.evacuate('i', '(') + vim.api.nvim_feedkeys('i' .. keymap.t(fallback), 'x', true) + assert.are.same({ '()' }, vim.api.nvim_buf_get_lines(0, 0, -1, true)) + end) + end) end)