From e46ae3b62e11704ace7f1f14c1398bcfaf70b217 Mon Sep 17 00:00:00 2001 From: hrsh7th Date: Mon, 13 Sep 2021 12:49:58 +0900 Subject: [PATCH] Add keymap tests --- lua/cmp/utils/keymap.lua | 55 +++++++++++++++++++---------------- lua/cmp/utils/keymap_spec.lua | 23 +++++++++++++++ 2 files changed, 53 insertions(+), 25 deletions(-) diff --git a/lua/cmp/utils/keymap.lua b/lua/cmp/utils/keymap.lua index d9a0217..1757cd3 100644 --- a/lua/cmp/utils/keymap.lua +++ b/lua/cmp/utils/keymap.lua @@ -111,37 +111,13 @@ keymap.listen = setmetatable({ end end - -- Keep existing mapping as mapping. We escape fisrt recursive key sequence. See `:help recursive_mapping`) - local rhs = existing.rhs - if existing.noremap == 0 then - local fallback_lhs = ('(cmp-utils-keymap-listen-lhs:%s)'):format(misc.id('cmp.utils.keymap.listen.lhs')) - vim.api.nvim_buf_set_keymap(0, mode, fallback_lhs, existing.lhs, { - expr = false, - noremap = true, - silent = true, - nowait = true, - }) - rhs = string.gsub(rhs, '^' .. vim.pesc(existing.lhs), fallback_lhs) - end - - local fallback = ('(cmp-utils-keymap-listen-rhs:%s)'):format(misc.id('cmp.utils.keymap.listen.rhs')) - vim.api.nvim_buf_set_keymap(0, mode, fallback, rhs, { - expr = existing.expr ~= 0, - noremap = existing.noremap ~= 0, - script = existing.script ~= 0, - silent = true, - nowait = true, - }) - - -- Hijack mapping + local fallback = keymap._evacuate(mode, existing) 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, silent = true, nowait = true, }) - - -- Save state. self.cache:set({ mode, bufnr, keys }, { mode = mode, existing = existing, @@ -160,6 +136,35 @@ misc.set(_G, { 'cmp', 'utils', 'keymap', 'listen', 'run' }, function(mode, keys) return keymap.t('') end) +---Evacuate existing key mapping +---@param mode string +---@param map table +---@return string +keymap._evacuate = function(mode, map) + -- Keep existing mapping as mapping. We escape fisrt recursive key sequence. See `:help recursive_mapping`) + local rhs = map.rhs + if map.noremap == 0 then + local fallback_lhs = ('(cmp-utils-keymap-listen-lhs:%s)'):format(misc.id('cmp.utils.keymap.listen.lhs')) + vim.api.nvim_buf_set_keymap(0, mode, fallback_lhs, map.lhs, { + expr = false, + noremap = true, + silent = true, + nowait = true, + }) + rhs = string.gsub(rhs, '^' .. vim.pesc(map.lhs), fallback_lhs) + end + + local fallback = ('(cmp-utils-keymap-listen-rhs:%s)'):format(misc.id('cmp.utils.keymap.listen.rhs')) + vim.api.nvim_buf_set_keymap(0, mode, fallback, rhs, { + expr = map.expr ~= 0, + noremap = map.noremap ~= 0, + script = map.script ~= 0, + silent = true, + nowait = true, + }) + return fallback +end + ---Get all available key mappings. ---@param mode string ---@return table[] diff --git a/lua/cmp/utils/keymap_spec.lua b/lua/cmp/utils/keymap_spec.lua index 359204b..7d9c287 100644 --- a/lua/cmp/utils/keymap_spec.lua +++ b/lua/cmp/utils/keymap_spec.lua @@ -16,4 +16,27 @@ describe('keymap', function() assert.are.equal(keymap.escape(''), 'C-d>C-f>') 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) + 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 ( (]], '(', { '(' }) + end) + end)