diff --git a/lua/cmp/core.lua b/lua/cmp/core.lua index 929d0ed..054def4 100644 --- a/lua/cmp/core.lua +++ b/lua/cmp/core.lua @@ -372,23 +372,34 @@ core.confirm = function(self, e, option, callback) completion_item.textEdit.range = e:get_insert_range() end - local is_snippet = completion_item.insertTextFormat == types.lsp.InsertTextFormat.Snippet + local diff_before = e.context.cursor.character - completion_item.textEdit.range.start.character + local diff_after = completion_item.textEdit.range['end'].character - e.context.cursor.character local new_text = completion_item.textEdit.newText - completion_item.textEdit.range.start.line = ctx.cursor.line - completion_item.textEdit.range.start.character = ctx.cursor.character - (e.context.cursor.character - completion_item.textEdit.range.start.character) - completion_item.textEdit.range['end'].line = ctx.cursor.line - completion_item.textEdit.range['end'].character = ctx.cursor.character + (completion_item.textEdit.range['end'].character - e.context.cursor.character) - if is_snippet then - completion_item.textEdit.newText = '' + + if api.is_insert_mode() then + local is_snippet = completion_item.insertTextFormat == types.lsp.InsertTextFormat.Snippet + completion_item.textEdit.range.start.line = ctx.cursor.line + completion_item.textEdit.range.start.character = ctx.cursor.character - diff_before + completion_item.textEdit.range['end'].line = ctx.cursor.line + completion_item.textEdit.range['end'].character = ctx.cursor.character + diff_after + if is_snippet then + completion_item.textEdit.newText = '' + end + vim.fn['cmp#apply_text_edits'](ctx.bufnr, { completion_item.textEdit }) + if is_snippet then + config.get().snippet.expand({ + body = new_text, + insert_text_mode = completion_item.insertTextMode, + }) + end + next() + else + local keys = {} + table.insert(keys, string.rep(keymap.t(''), diff_before)) + table.insert(keys, string.rep(keymap.t(''), diff_after)) + table.insert(keys, new_text) + feedkeys.call(table.concat(keys, ''), 'n', next) end - vim.fn['cmp#apply_text_edits'](ctx.bufnr, { completion_item.textEdit }) - if is_snippet then - config.get().snippet.expand({ - body = new_text, - insert_text_mode = completion_item.insertTextMode, - }) - end - next() -- Finalize end, function() diff --git a/lua/cmp/utils/api_spec.lua b/lua/cmp/utils/api_spec.lua new file mode 100644 index 0000000..9fb7a6a --- /dev/null +++ b/lua/cmp/utils/api_spec.lua @@ -0,0 +1,39 @@ +local spec = require('cmp.utils.spec') +local keymap = require('cmp.utils.keymap') +local feedkeys = require('cmp.utils.feedkeys') +local api = require('cmp.utils.api') + +describe('api', function() + describe('get_cursor', function() + before_each(spec.before) + it('insert-mode', function() + feedkeys.call(keymap.t('i\t1234567890'), 'n', function() + assert.are.same(api.get_cursor()[2], 10) + end) + feedkeys.call('', 'nx') + end) + it('cmdline-mode', function() + feedkeys.call(keymap.t(':\t1234567890'), 'n', function() + assert.are.same(api.get_cursor()[2], 10) + end) + feedkeys.call('', 'nx') + end) + end) + + describe('get_cursor_before_line', function() + before_each(spec.before) + it('insert-mode', function() + feedkeys.call(keymap.t(':\t1234567890'), 'n', function() + assert.are.same(api.get_cursor_before_line(), '\t12345678') + end) + feedkeys.call('', 'nx') + end) + it('cmdline-mode', function() + feedkeys.call(keymap.t(':\t1234567890'), 'n', function() + assert.are.same(api.get_cursor_before_line(), '\t12345678') + end) + feedkeys.call('', 'nx') + end) + end) +end) + diff --git a/lua/cmp/utils/cache_spec.lua b/lua/cmp/utils/cache_spec.lua deleted file mode 100644 index e69de29..0000000 diff --git a/lua/cmp/utils/feedkeys.lua b/lua/cmp/utils/feedkeys.lua index 6eabf9f..1b101a1 100644 --- a/lua/cmp/utils/feedkeys.lua +++ b/lua/cmp/utils/feedkeys.lua @@ -21,7 +21,7 @@ feedkeys.call = setmetatable({ table.insert(queue, { keymap.t('set %slazyredraw'):format(vim.o.lazyredraw and '' or 'no'), 'n' }) table.insert(queue, { keymap.t('set eventignore=%s'):format(vim.o.eventignore or ''), 'n' }) end - if #keys > 0 or callback then + if callback then local id = misc.id('cmp.utils.feedkeys.call') self.callbacks[id] = function() if callback then diff --git a/lua/cmp/utils/feedkeys_spec.lua b/lua/cmp/utils/feedkeys_spec.lua index abe0663..3e16e43 100644 --- a/lua/cmp/utils/feedkeys_spec.lua +++ b/lua/cmp/utils/feedkeys_spec.lua @@ -7,17 +7,9 @@ describe('feedkeys', function() before_each(spec.before) it('dot-repeat', function() - feedkeys.call(keymap.t('iaiueo'), 'nx') - assert.are.equal(vim.fn.getreg('.'), keymap.t('aiueo')) - end) - it('macro', function() - vim.fn.setreg('q', '') - vim.cmd([[normal! qq]]) - feedkeys.call(keymap.t('iaiueo'), 'nt') - feedkeys.call(keymap.t(''), 'nt', function() - vim.cmd([[normal! q]]) - assert.are.equal(vim.fn.getreg('q'), keymap.t('iaiueo')) - print(vim.fn.getreg('q')) + feedkeys.call(keymap.t('iaiueo'), 'n', function() + assert.are.equal(vim.fn.getreg('.'), keymap.t('aiueo')) end) + feedkeys.call('', 'nx') end) end) diff --git a/lua/cmp/utils/keymap_spec.lua b/lua/cmp/utils/keymap_spec.lua index 7270b5e..315220c 100644 --- a/lua/cmp/utils/keymap_spec.lua +++ b/lua/cmp/utils/keymap_spec.lua @@ -62,6 +62,7 @@ describe('keymap', function() end) end) describe('realworld', function() + before_each(spec.before) it('#226', function() keymap.listen('i', '', function(_, fallback) fallback() diff --git a/lua/cmp/utils/spec.lua b/lua/cmp/utils/spec.lua index 642b0e5..f461875 100644 --- a/lua/cmp/utils/spec.lua +++ b/lua/cmp/utils/spec.lua @@ -8,9 +8,21 @@ spec.before = function() vim.cmd([[ bdelete! enew! + imapclear + imapclear + cmapclear + cmapclear + smapclear + smapclear + xmapclear + xmapclear + tmapclear + tmapclear + setlocal noswapfile setlocal virtualedit=all setlocal completeopt=menu,menuone,noselect ]]) + vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes('', true, true, true), 'x', true) end spec.state = function(text, row, col)