2014-12-23 04:24:54 -07:00
|
|
|
|
-- Test for mappings and abbreviations
|
|
|
|
|
|
2024-04-20 08:44:13 -07:00
|
|
|
|
local t = require('test.testutil')
|
|
|
|
|
local n = require('test.functional.testnvim')()
|
2024-04-17 15:23:11 -07:00
|
|
|
|
local Screen = require('test.functional.ui.screen')
|
2024-04-20 08:44:13 -07:00
|
|
|
|
|
|
|
|
|
local clear, feed, insert = n.clear, n.feed, n.insert
|
|
|
|
|
local expect, poke_eventloop = n.expect, n.poke_eventloop
|
|
|
|
|
local command, eq, eval, api = n.command, t.eq, n.eval, n.api
|
|
|
|
|
local exec = n.exec
|
2024-01-12 04:41:09 -07:00
|
|
|
|
local sleep = vim.uv.sleep
|
2014-12-23 04:24:54 -07:00
|
|
|
|
|
|
|
|
|
describe('mapping', function()
|
2015-09-07 19:27:21 -07:00
|
|
|
|
before_each(clear)
|
2014-12-23 04:24:54 -07:00
|
|
|
|
|
2015-12-18 18:03:17 -07:00
|
|
|
|
it('abbreviations with р (0x80)', function()
|
2014-12-23 04:24:54 -07:00
|
|
|
|
insert([[
|
|
|
|
|
test starts here:
|
|
|
|
|
]])
|
|
|
|
|
|
|
|
|
|
-- Abbreviations with р (0x80) should work.
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('inoreab чкпр vim')
|
2015-02-18 09:16:30 -07:00
|
|
|
|
feed('GAчкпр <esc>')
|
2014-12-23 04:24:54 -07:00
|
|
|
|
|
2015-12-18 18:03:17 -07:00
|
|
|
|
expect([[
|
|
|
|
|
test starts here:
|
|
|
|
|
vim ]])
|
|
|
|
|
end)
|
|
|
|
|
|
2024-04-17 15:23:11 -07:00
|
|
|
|
-- oldtest: Test_map_ctrl_c_insert()
|
2016-01-12 22:39:54 -07:00
|
|
|
|
it('Ctrl-c works in Insert mode', function()
|
2015-12-18 18:03:17 -07:00
|
|
|
|
-- Mapping of ctrl-c in insert mode
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('set cpo-=< cpo-=k')
|
|
|
|
|
command('inoremap <c-c> <ctrl-c>')
|
|
|
|
|
command('cnoremap <c-c> dummy')
|
|
|
|
|
command('cunmap <c-c>')
|
2015-12-18 18:03:17 -07:00
|
|
|
|
feed('GA<cr>')
|
2022-04-29 22:11:35 -07:00
|
|
|
|
-- XXX: editor must be in Insert mode before <C-C> is put into input buffer
|
2020-10-19 11:17:51 -07:00
|
|
|
|
poke_eventloop()
|
2022-04-29 22:11:35 -07:00
|
|
|
|
feed('TEST2: CTRL-C |<c-c>A|<cr><esc>')
|
|
|
|
|
command('unmap! <c-c>')
|
2015-12-18 18:03:17 -07:00
|
|
|
|
|
|
|
|
|
expect([[
|
2017-04-08 14:12:26 -07:00
|
|
|
|
|
2015-12-18 18:03:17 -07:00
|
|
|
|
TEST2: CTRL-C |<ctrl-c>A|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
|
|
|
|
|
2024-04-17 15:23:11 -07:00
|
|
|
|
-- oldtest: Test_map_ctrl_c_visual()
|
2016-01-12 22:39:54 -07:00
|
|
|
|
it('Ctrl-c works in Visual mode', function()
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command([[vnoremap <c-c> :<C-u>$put ='vmap works'<cr>]])
|
2015-12-18 18:03:17 -07:00
|
|
|
|
feed('GV')
|
2022-04-29 22:11:35 -07:00
|
|
|
|
-- XXX: editor must be in Visual mode before <C-C> is put into input buffer
|
2020-10-19 11:17:51 -07:00
|
|
|
|
poke_eventloop()
|
2022-04-29 22:11:35 -07:00
|
|
|
|
feed('vV<c-c>')
|
|
|
|
|
command('vunmap <c-c>')
|
2015-12-18 18:03:17 -07:00
|
|
|
|
|
|
|
|
|
expect([[
|
2017-04-08 14:12:26 -07:00
|
|
|
|
|
2015-12-18 18:03:17 -07:00
|
|
|
|
vmap works]])
|
|
|
|
|
end)
|
|
|
|
|
|
2016-01-12 22:39:54 -07:00
|
|
|
|
it('langmap', function()
|
2014-12-26 08:49:44 -07:00
|
|
|
|
-- langmap should not get remapped in insert mode.
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('inoremap { FAIL_ilangmap')
|
|
|
|
|
command('set langmap=+{ langnoremap')
|
2014-12-26 08:49:44 -07:00
|
|
|
|
feed('o+<esc>')
|
|
|
|
|
|
2015-07-21 06:11:56 -07:00
|
|
|
|
-- Insert mode expr mapping with langmap.
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('inoremap <expr> { "FAIL_iexplangmap"')
|
2014-12-26 08:49:44 -07:00
|
|
|
|
feed('o+<esc>')
|
|
|
|
|
|
2015-07-21 06:11:56 -07:00
|
|
|
|
-- langmap should not get remapped in cmdline mode.
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('cnoremap { FAIL_clangmap')
|
2015-07-21 06:11:56 -07:00
|
|
|
|
feed('o+<esc>')
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('cunmap {')
|
2015-07-21 06:11:56 -07:00
|
|
|
|
|
|
|
|
|
-- cmdline mode expr mapping with langmap.
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('cnoremap <expr> { "FAIL_cexplangmap"')
|
2015-07-21 06:11:56 -07:00
|
|
|
|
feed('o+<esc>')
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('cunmap {')
|
2015-02-18 09:16:30 -07:00
|
|
|
|
|
2014-12-23 04:24:54 -07:00
|
|
|
|
-- Assert buffer contents.
|
|
|
|
|
expect([[
|
2017-04-08 14:12:26 -07:00
|
|
|
|
|
2014-12-26 08:49:44 -07:00
|
|
|
|
+
|
2015-07-21 06:11:56 -07:00
|
|
|
|
+
|
|
|
|
|
+
|
2014-12-26 08:49:44 -07:00
|
|
|
|
+]])
|
2014-12-23 04:24:54 -07:00
|
|
|
|
end)
|
2015-09-07 19:27:21 -07:00
|
|
|
|
|
2024-04-17 15:23:11 -07:00
|
|
|
|
-- oldtest: Test_map_feedkeys()
|
2016-01-13 20:19:15 -07:00
|
|
|
|
it('feedkeys', function()
|
|
|
|
|
insert([[
|
|
|
|
|
a b c d
|
|
|
|
|
a b c d
|
|
|
|
|
]])
|
|
|
|
|
|
|
|
|
|
-- Vim's issue #212 (feedkeys insert mapping at current position)
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('nnoremap . :call feedkeys(".", "in")<cr>')
|
2016-01-13 20:19:15 -07:00
|
|
|
|
feed('/^a b<cr>')
|
|
|
|
|
feed('0qqdw.ifoo<esc>qj0@q<esc>')
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('unmap .')
|
2016-01-13 20:19:15 -07:00
|
|
|
|
expect([[
|
|
|
|
|
fooc d
|
|
|
|
|
fooc d
|
|
|
|
|
]])
|
|
|
|
|
end)
|
|
|
|
|
|
2024-04-17 15:23:11 -07:00
|
|
|
|
-- oldtest: Test_map_cursor()
|
2015-09-07 19:27:21 -07:00
|
|
|
|
it('i_CTRL-G_U', function()
|
|
|
|
|
-- <c-g>U<cursor> works only within a single line
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('imapclear')
|
|
|
|
|
command('imap ( ()<c-g>U<left>')
|
2015-09-07 19:27:21 -07:00
|
|
|
|
feed('G2o<esc>ki<cr>Test1: text with a (here some more text<esc>k.')
|
|
|
|
|
-- test undo
|
|
|
|
|
feed('G2o<esc>ki<cr>Test2: text wit a (here some more text [und undo]<c-g>u<esc>k.u')
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command('imapclear')
|
|
|
|
|
command('set whichwrap=<,>,[,]')
|
2015-09-07 19:27:21 -07:00
|
|
|
|
feed('G3o<esc>2k')
|
2022-04-29 22:11:35 -07:00
|
|
|
|
command(
|
|
|
|
|
[[:exe ":norm! iTest3: text with a (parenthesis here\<C-G>U\<Right>new line here\<esc>\<up>\<up>."]]
|
|
|
|
|
)
|
2015-09-07 19:27:21 -07:00
|
|
|
|
|
|
|
|
|
expect([[
|
2017-04-08 14:12:26 -07:00
|
|
|
|
|
|
|
|
|
|
2015-09-07 19:27:21 -07:00
|
|
|
|
Test1: text with a (here some more text)
|
|
|
|
|
Test1: text with a (here some more text)
|
2017-04-08 14:12:26 -07:00
|
|
|
|
|
|
|
|
|
|
2015-09-07 19:27:21 -07:00
|
|
|
|
Test2: text wit a (here some more text [und undo])
|
|
|
|
|
new line here
|
|
|
|
|
Test3: text with a (parenthesis here
|
|
|
|
|
new line here
|
|
|
|
|
]])
|
|
|
|
|
end)
|
2022-04-05 06:38:53 -07:00
|
|
|
|
|
2024-04-17 15:23:11 -07:00
|
|
|
|
-- oldtest: Test_mouse_drag_mapped_start_select()
|
|
|
|
|
it('dragging starts Select mode even if coming from mapping', function()
|
2022-04-24 15:41:01 -07:00
|
|
|
|
command('set mouse=a')
|
|
|
|
|
command('set selectmode=mouse')
|
|
|
|
|
|
|
|
|
|
command('nnoremap <LeftDrag> <LeftDrag><Cmd><CR>')
|
2022-08-16 00:21:46 -07:00
|
|
|
|
poke_eventloop()
|
2024-01-12 10:59:57 -07:00
|
|
|
|
api.nvim_input_mouse('left', 'press', '', 0, 0, 0)
|
2022-08-16 00:21:46 -07:00
|
|
|
|
poke_eventloop()
|
2024-01-12 10:59:57 -07:00
|
|
|
|
api.nvim_input_mouse('left', 'drag', '', 0, 0, 1)
|
2022-08-16 00:21:46 -07:00
|
|
|
|
poke_eventloop()
|
2022-04-24 15:41:01 -07:00
|
|
|
|
eq('s', eval('mode()'))
|
|
|
|
|
end)
|
|
|
|
|
|
2024-04-17 15:23:11 -07:00
|
|
|
|
-- oldtest: Test_mouse_drag_insert_map()
|
|
|
|
|
it('<LeftDrag> mapping in Insert mode works correctly', function()
|
2022-04-05 06:38:53 -07:00
|
|
|
|
command('set mouse=a')
|
|
|
|
|
|
2022-04-24 15:41:01 -07:00
|
|
|
|
command('inoremap <LeftDrag> <LeftDrag><Cmd>let g:dragged = 1<CR>')
|
2022-04-05 06:38:53 -07:00
|
|
|
|
feed('i')
|
2022-08-16 00:21:46 -07:00
|
|
|
|
poke_eventloop()
|
2024-01-12 10:59:57 -07:00
|
|
|
|
api.nvim_input_mouse('left', 'press', '', 0, 0, 0)
|
2022-08-16 00:21:46 -07:00
|
|
|
|
poke_eventloop()
|
2024-01-12 10:59:57 -07:00
|
|
|
|
api.nvim_input_mouse('left', 'drag', '', 0, 0, 1)
|
2022-08-16 00:21:46 -07:00
|
|
|
|
poke_eventloop()
|
2022-04-05 06:38:53 -07:00
|
|
|
|
eq(1, eval('g:dragged'))
|
|
|
|
|
eq('v', eval('mode()'))
|
|
|
|
|
feed([[<C-\><C-N>]])
|
|
|
|
|
|
|
|
|
|
command([[inoremap <LeftDrag> <LeftDrag><C-\><C-N>]])
|
|
|
|
|
feed('i')
|
2022-08-16 00:21:46 -07:00
|
|
|
|
poke_eventloop()
|
2024-01-12 10:59:57 -07:00
|
|
|
|
api.nvim_input_mouse('left', 'press', '', 0, 0, 0)
|
2022-08-16 00:21:46 -07:00
|
|
|
|
poke_eventloop()
|
2024-01-12 10:59:57 -07:00
|
|
|
|
api.nvim_input_mouse('left', 'drag', '', 0, 0, 1)
|
2022-08-16 00:21:46 -07:00
|
|
|
|
poke_eventloop()
|
2022-04-05 06:38:53 -07:00
|
|
|
|
eq('n', eval('mode()'))
|
|
|
|
|
end)
|
2022-06-06 09:19:57 -07:00
|
|
|
|
|
2024-04-17 15:23:11 -07:00
|
|
|
|
-- oldtest: Test_map_after_timed_out_nop()
|
|
|
|
|
it('timeout works after an <Nop> mapping is triggered on timeout', function()
|
2022-06-06 09:19:57 -07:00
|
|
|
|
command('set timeout timeoutlen=400')
|
|
|
|
|
command('inoremap ab TEST')
|
|
|
|
|
command('inoremap a <Nop>')
|
|
|
|
|
-- Enter Insert mode
|
|
|
|
|
feed('i')
|
|
|
|
|
-- Wait for the "a" mapping to time out
|
|
|
|
|
feed('a')
|
|
|
|
|
sleep(500)
|
|
|
|
|
-- Send "a" and wait for a period shorter than 'timeoutlen'
|
|
|
|
|
feed('a')
|
|
|
|
|
sleep(100)
|
|
|
|
|
-- Send "b", should trigger the "ab" mapping
|
|
|
|
|
feed('b')
|
|
|
|
|
expect('TEST')
|
|
|
|
|
end)
|
2024-04-17 15:23:11 -07:00
|
|
|
|
|
|
|
|
|
-- oldtest: Test_showcmd_part_map()
|
|
|
|
|
it("'showcmd' with a partial mapping", function()
|
|
|
|
|
local screen = Screen.new(60, 6)
|
|
|
|
|
screen:attach()
|
|
|
|
|
exec([[
|
|
|
|
|
set notimeout showcmd
|
|
|
|
|
nnoremap ,a <Ignore>
|
|
|
|
|
nnoremap ;a <Ignore>
|
|
|
|
|
nnoremap Àa <Ignore>
|
|
|
|
|
nnoremap Ëa <Ignore>
|
|
|
|
|
nnoremap βa <Ignore>
|
|
|
|
|
nnoremap ωa <Ignore>
|
|
|
|
|
nnoremap …a <Ignore>
|
|
|
|
|
nnoremap <C-W>a <Ignore>
|
|
|
|
|
]])
|
|
|
|
|
|
|
|
|
|
for _, c in ipairs({ ',', ';', 'À', 'Ë', 'β', 'ω', '…' }) do
|
|
|
|
|
feed(c)
|
|
|
|
|
screen:expect(([[
|
|
|
|
|
^ |
|
|
|
|
|
{1:~ }|*4
|
|
|
|
|
%s |
|
|
|
|
|
]]):format(c))
|
2024-04-18 14:45:25 -07:00
|
|
|
|
feed('a')
|
2024-04-17 15:23:11 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
^ |
|
|
|
|
|
{1:~ }|*4
|
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
feed('\23')
|
|
|
|
|
screen:expect([[
|
|
|
|
|
^ |
|
|
|
|
|
{1:~ }|*4
|
|
|
|
|
^W |
|
|
|
|
|
]])
|
2024-04-18 14:45:25 -07:00
|
|
|
|
feed('a')
|
2024-04-17 15:23:11 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
^ |
|
|
|
|
|
{1:~ }|*4
|
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
|
|
|
|
|
feed('<C-W>')
|
|
|
|
|
screen:expect([[
|
|
|
|
|
^ |
|
|
|
|
|
{1:~ }|*4
|
|
|
|
|
^W |
|
|
|
|
|
]])
|
2024-04-18 14:45:25 -07:00
|
|
|
|
feed('a')
|
2024-04-17 15:23:11 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
^ |
|
|
|
|
|
{1:~ }|*4
|
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
2014-12-23 04:24:54 -07:00
|
|
|
|
end)
|