From 8f559af081c40272a5c2f2a69be510ffa240e391 Mon Sep 17 00:00:00 2001 From: hrsh7th Date: Wed, 8 Sep 2021 19:25:02 +0900 Subject: [PATCH] Support vim-endwise --- lua/cmp/core.lua | 5 +++-- lua/cmp/utils/keymap.lua | 26 +++++++++++++++++++------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/lua/cmp/core.lua b/lua/cmp/core.lua index c6f0e1f..0b23421 100644 --- a/lua/cmp/core.lua +++ b/lua/cmp/core.lua @@ -296,7 +296,7 @@ core.confirm = function(e, option, callback) table.insert(confirm, e:get_word()) keymap.feedkeys(table.concat(confirm, ''), 'nt', function() local restore = {} - table.insert(restore, keymap.t(string.rep('', vim.fn.strchars(e:get_word())))) + table.insert(restore, keymap.t(string.rep('U', vim.fn.strchars(e:get_word())))) table.insert(restore, string.sub(e.context.cursor_before_line, e:get_offset())) keymap.feedkeys(table.concat(restore, ''), 'n', function() --@see https://github.com/microsoft/vscode/blob/main/src/vs/editor/contrib/suggest/suggestController.ts#L334 @@ -347,6 +347,7 @@ core.confirm = function(e, option, callback) local keys = {} if e.context.cursor.character < completion_item.textEdit.range['end'].character then + print(completion_item.textEdit.range['end'].character - e.context.cursor.character) table.insert(keys, keymap.t(string.rep('', completion_item.textEdit.range['end'].character - e.context.cursor.character))) end if completion_item.textEdit.range.start.character < e.context.cursor.character then @@ -355,7 +356,7 @@ core.confirm = function(e, option, callback) if is_snippet then table.insert(keys, keymap.t('u') .. e:get_word() .. keymap.t('u')) - table.insert(keys, keymap.t(string.rep('', vim.fn.strchars(e:get_word())))) + table.insert(keys, keymap.t(string.rep('U', vim.fn.strchars(e:get_word())))) else table.insert(keys, keymap.t('u') .. completion_item.textEdit.newText .. keymap.t('u')) end diff --git a/lua/cmp/utils/keymap.lua b/lua/cmp/utils/keymap.lua index b6dc802..5b700c4 100644 --- a/lua/cmp/utils/keymap.lua +++ b/lua/cmp/utils/keymap.lua @@ -57,6 +57,7 @@ keymap.feedkeys = setmetatable({ if #keys ~= 0 then vim.api.nvim_feedkeys(keys, mode, true) end + if callback then if vim.fn.reg_recording() == '' then local id = misc.id('cmp.utils.keymap.feedkeys') @@ -141,13 +142,24 @@ misc.set(_G, { 'cmp', 'utils', 'keymap', 'listen', 'run' }, function(mode, keys) local existing = keymap.listen.cache:get({ mode, bufnr, keys }).existing local callback = keymap.listen.cache:get({ mode, bufnr, keys }).callback callback(keys, function() - vim.api.nvim_buf_set_keymap(0, mode, '(cmp-utils-keymap-listen-run:_)', existing.rhs, { - expr = existing.expr ~= 0, - noremap = existing.noremap ~= 0, - script = existing.script ~= 0, - silent = true, - }) - vim.fn.feedkeys(keymap.t('(cmp-utils-keymap-listen-run:_)'), '') + if existing.expr == 1 or existing.script == 1 then + vim.api.nvim_buf_set_keymap(0, mode, '(cmp-utils-keymap-listen-run:_)', existing.rhs, { + expr = existing.expr ~= 0, + noremap = existing.noremap ~= 0, + script = existing.script ~= 0, + silent = true, + }) + keymap.feedkeys(keymap.t('(cmp-utils-keymap-listen-run:_)'), '') + elseif existing.noremap == 1 then + keymap.feedkeys(keymap.t(keys), 'n') + else + for i, keys_ in ipairs(vim.split(existing.rhs, existing.lhs, true)) do + if i ~= 1 then + keymap.feedkeys(keymap.t(existing.lhs), 'n') + end + keymap.feedkeys(keymap.t(keys_), '') + end + end end) return keymap.t('') end)