evacuate -> fallback
This commit is contained in:
@@ -102,7 +102,7 @@ keymap.listen = function(mode, lhs, callback)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local bufnr = existing.buffer and vim.api.nvim_get_current_buf() or -1
|
local bufnr = existing.buffer and vim.api.nvim_get_current_buf() or -1
|
||||||
local fallback = keymap.evacuate(bufnr, mode, existing)
|
local fallback = keymap.fallback(bufnr, mode, existing)
|
||||||
keymap.set_map(bufnr, mode, lhs, function()
|
keymap.set_map(bufnr, mode, lhs, function()
|
||||||
if mode == 'c' and vim.fn.getcmdtype() == '=' then
|
if mode == 'c' and vim.fn.getcmdtype() == '=' then
|
||||||
vim.api.nvim_feedkeys(fallback.keys, 'it' .. (fallback.noremap and 'n' or 'm'), true)
|
vim.api.nvim_feedkeys(fallback.keys, 'it' .. (fallback.noremap and 'n' or 'm'), true)
|
||||||
@@ -121,19 +121,19 @@ keymap.listen = function(mode, lhs, callback)
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
---Evacuate existing mapping.
|
---Fallback existing mapping.
|
||||||
--- NOTE:
|
--- NOTE:
|
||||||
--- In insert-mode, we should all mapping evacuate to the `<Plug>` because `<C-r>=` will display gabage message.
|
--- In insert-mode, we should all mapping fallback to the `<Plug>` because `<C-r>=` will display gabage message.
|
||||||
--- In cmdline-mode, we shouldn't re-map as `<Plug>` because `cmap <Tab> <Plug>(map-to-tab)` will broke native behavior.
|
--- In cmdline-mode, we shouldn't re-map as `<Plug>` because `cmap <Tab> <Plug>(map-to-tab)` will broke native behavior.
|
||||||
--- We should resolve recursive mapping because existing mapping will feed by `feedkeys` that doesn't solve recursive mapping.
|
--- We should resolve recursive mapping because existing mapping will feed by `feedkeys` that doesn't solve recursive mapping.
|
||||||
--- We use `<C-r>=` to solve recursive mapping.
|
--- We use `<C-r>=` to solve recursive mapping.
|
||||||
---@param map table
|
---@param map table
|
||||||
keymap.evacuate = setmetatable({
|
keymap.fallback = setmetatable({
|
||||||
cache = cache.new(),
|
cache = cache.new(),
|
||||||
}, {
|
}, {
|
||||||
__call = function(self, bufnr, mode, map)
|
__call = function(self, bufnr, mode, map)
|
||||||
local fallback = self.cache:ensure({ bufnr, mode, map.lhs }, function()
|
local fallback = self.cache:ensure({ bufnr, mode, map.lhs }, function()
|
||||||
return string.format('<Plug>(cmp.u.k.evacuate:%s)', misc.id('cmp.utils.keymap.evacuate'))
|
return string.format('<Plug>(cmp.u.k.fallback:%s)', misc.id('cmp.utils.keymap.fallback'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
if map.expr then
|
if map.expr then
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
local spec = require('cmp.utils.spec')
|
local spec = require('cmp.utils.spec')
|
||||||
|
local api = require('cmp.utils.api')
|
||||||
|
local feedkeys = require('cmp.utils.feedkeys')
|
||||||
|
|
||||||
local keymap = require('cmp.utils.keymap')
|
local keymap = require('cmp.utils.keymap')
|
||||||
|
|
||||||
@@ -32,56 +34,65 @@ describe('keymap', function()
|
|||||||
assert.are.equal(keymap.to_keymap('|'), '<Bar>')
|
assert.are.equal(keymap.to_keymap('|'), '<Bar>')
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('evacuate', function()
|
describe('fallback', function()
|
||||||
before_each(spec.before)
|
before_each(spec.before)
|
||||||
|
|
||||||
it('expr & register', function()
|
local keys = function(keys, mode)
|
||||||
vim.api.nvim_buf_set_keymap(0, 'i', '(', [['<C-r>="("<CR>']], {
|
local state = {}
|
||||||
expr = true,
|
feedkeys.call(keys, mode, function()
|
||||||
noremap = false,
|
if api.is_cmdline_mode() then
|
||||||
})
|
state.buffer = { api.get_current_line() }
|
||||||
local fallback = keymap.evacuate(0, 'i', keymap.get_map('i', '('))
|
else
|
||||||
vim.api.nvim_feedkeys('i' .. fallback.keys, 'x' .. (fallback.noremap and 'n' or 'm'), true)
|
state.buffer = vim.api.nvim_buf_get_lines(0, 0, -1, false)
|
||||||
assert.are.same({ '(' }, vim.api.nvim_buf_get_lines(0, 0, -1, true))
|
end
|
||||||
|
state.cursor = api.get_cursor()
|
||||||
|
state.wildmenumode = vim.fn.wildmenumode() == 1
|
||||||
end)
|
end)
|
||||||
|
feedkeys.call('', 'x')
|
||||||
|
return state
|
||||||
|
end
|
||||||
|
|
||||||
it('recursive & <Plug> (tpope/vim-endwise)', function()
|
it('recursive', function()
|
||||||
vim.api.nvim_buf_set_keymap(0, 'i', '<Plug>(paren-close)', [[)<Left>]], {
|
vim.api.nvim_buf_set_keymap(0, 'i', '(', '()<Left>', {
|
||||||
expr = false,
|
|
||||||
noremap = true,
|
|
||||||
})
|
|
||||||
vim.api.nvim_buf_set_keymap(0, 'i', '(', [[(<Plug>(paren-close)]], {
|
|
||||||
expr = false,
|
expr = false,
|
||||||
noremap = false,
|
noremap = false,
|
||||||
|
silent = true,
|
||||||
})
|
})
|
||||||
local fallback = keymap.evacuate(0, 'i', keymap.get_map('i', '('))
|
local fallback = keymap.fallback(0, 'i', keymap.get_map('i', '('))
|
||||||
vim.api.nvim_feedkeys('i' .. fallback.keys, 'x' .. (fallback.noremap and 'n' or 'm'), true)
|
local state = keys('i' .. fallback.keys, fallback.noremap and 'n' or 'm')
|
||||||
assert.are.same({ '()' }, vim.api.nvim_buf_get_lines(0, 0, -1, true))
|
assert.are.same({ '()' }, state.buffer)
|
||||||
|
assert.are.same({ 1, 1 }, state.cursor)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('expr & recursive', function()
|
it('recursive expr', function()
|
||||||
before_each(spec.before)
|
vim.api.nvim_buf_set_keymap(0, 'i', '(', '"()<Left>"', {
|
||||||
|
expr = true,
|
||||||
|
noremap = false,
|
||||||
|
silent = true,
|
||||||
|
})
|
||||||
|
local fallback = keymap.fallback(0, 'i', keymap.get_map('i', '('))
|
||||||
|
local state = keys('i' .. fallback.keys, fallback.noremap and 'n' or 'm')
|
||||||
|
assert.are.same({ '()' }, state.buffer)
|
||||||
|
assert.are.same({ 1, 1 }, state.cursor)
|
||||||
|
end)
|
||||||
|
|
||||||
it('true', function()
|
it('recursive callback', function()
|
||||||
vim.api.nvim_buf_set_keymap(0, 'i', '<Tab>', [[v:true ? '<C-r>="foobar"<CR>' : '<Tab>aiueo']], {
|
vim.api.nvim_buf_set_keymap(0, 'i', '(', '', {
|
||||||
expr = true,
|
expr = true,
|
||||||
noremap = false,
|
noremap = false,
|
||||||
|
silent = true,
|
||||||
|
callback = function()
|
||||||
|
return keymap.t('()<Left>')
|
||||||
|
end
|
||||||
})
|
})
|
||||||
local fallback = keymap.evacuate(0, 'i', keymap.get_map('i', '<Tab>'))
|
local fallback = keymap.fallback(0, 'i', keymap.get_map('i', '('))
|
||||||
vim.api.nvim_feedkeys('i' .. fallback.keys, 'x' .. (fallback.noremap and 'n' or 'm'), true)
|
local state = keys('i' .. fallback.keys, fallback.noremap and 'n' or 'm')
|
||||||
assert.are.same({ 'foobar' }, vim.api.nvim_buf_get_lines(0, 0, -1, true))
|
assert.are.same({ '()' }, state.buffer)
|
||||||
end)
|
assert.are.same({ 1, 1 }, state.cursor)
|
||||||
it('false', function()
|
|
||||||
vim.api.nvim_buf_set_keymap(0, 'i', '<Tab>', [[v:false ? '<C-r>="foobar"<CR>' : '<Tab>aiueo']], {
|
|
||||||
expr = true,
|
|
||||||
noremap = false,
|
|
||||||
})
|
|
||||||
local fallback = keymap.evacuate(0, 'i', keymap.get_map('i', '<Tab>'))
|
|
||||||
vim.api.nvim_feedkeys('i' .. fallback.keys, 'x' .. (fallback.noremap and 'n' or 'm'), true)
|
|
||||||
assert.are.same({ '\taiueo' }, vim.api.nvim_buf_get_lines(0, 0, -1, true))
|
|
||||||
end)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('realworld', function()
|
describe('realworld', function()
|
||||||
before_each(spec.before)
|
before_each(spec.before)
|
||||||
it('#226', function()
|
it('#226', function()
|
||||||
|
|||||||
Reference in New Issue
Block a user