diff --git a/lua/cmp/utils/keymap.lua b/lua/cmp/utils/keymap.lua index 00111e2..1a4e113 100644 --- a/lua/cmp/utils/keymap.lua +++ b/lua/cmp/utils/keymap.lua @@ -49,6 +49,35 @@ keymap.to_keymap = function(s) end) end +--- Replace key in keys except in the or sequence. +keymap.replace = function(keys, key, rep) + local expr = false + local new_keys = {} + local i = 1 + while i <= #keys do + if '=' == string.sub(keys, i, i + #'=' - 1) then + table.insert(new_keys, '=') + expr = true + i = i + #'=' + elseif '' == string.sub(keys, i, i + #'' - 1) then + table.insert(new_keys, '') + expr = true + i = i + #'' + elseif expr and '' == string.sub(keys, i, i + #'' - 1) then + table.insert(new_keys, '') + i = i + #'' + expr = false + elseif not expr and key == string.sub(keys, i, i + #key - 1) then + table.insert(new_keys, rep) + i = i + #key + else + table.insert(new_keys, string.sub(keys, i, i)) + i = i + 1 + end + end + return table.concat(new_keys, '') +end + ---Feedkeys with callback keymap.feedkeys = setmetatable({ callbacks = {} @@ -149,8 +178,7 @@ misc.set(_G, { 'cmp', 'utils', 'keymap', 'listen', 'run' }, function(mode, keys) noremap = true, silent = true, }) - -- TODO: Do not escape the keys inside ... / = ... . - rhs = string.gsub(rhs, vim.pesc(existing.lhs), '(cmp-utils-keymap-listen-run:lhs)') + rhs = keymap.replace(rhs, existing.lhs, '(cmp-utils-keymap-listen-run:lhs)') end vim.api.nvim_buf_set_keymap(0, mode, '(cmp-utils-keymap-listen-run:_)', rhs, { expr = existing.expr ~= 0,