local t = require('test.functional.testutil')() local Screen = require('test.functional.ui.screen') local eq = t.eq local exec = t.exec local exec_capture = t.exec_capture local feed = t.feed local api = t.api local clear = t.clear local command = t.command local expect = t.expect local insert = t.insert local eval = t.eval describe(':*map', function() before_each(clear) it('are not affected by &isident', function() api.nvim_set_var('counter', 0) command('nnoremap :let counter+=1') api.nvim_set_option_value('isident', ('%u'):format(('>'):byte()), {}) command('nnoremap :let counter+=1') -- &isident used to disable keycode parsing here as well feed('\24\25') eq(4, api.nvim_get_var('counter')) end) it(':imap ', function() command('imap foo') feed('i--') expect('-foo-') end) it('shows as mapping rhs', function() command('nmap asdf ') eq( [[ n asdf ]], exec_capture('nmap asdf') ) end) it('mappings with description can be filtered', function() api.nvim_set_keymap('n', 'asdf1', 'qwert', { desc = 'do the one thing' }) api.nvim_set_keymap('n', 'asdf2', 'qwert', { desc = 'doesnot really do anything' }) api.nvim_set_keymap('n', 'asdf3', 'qwert', { desc = 'do the other thing' }) eq( [[ n asdf3 qwert do the other thing n asdf1 qwert do the one thing]], exec_capture('filter the nmap') ) end) it(' mappings ignore nore', function() command('let x = 0') eq(0, api.nvim_eval('x')) command [[ nnoremap (Increase_x) let x+=1 nmap increase_x_remap (Increase_x) nnoremap increase_x_noremap (Increase_x) ]] feed('increase_x_remap') eq(1, api.nvim_eval('x')) feed('increase_x_noremap') eq(2, api.nvim_eval('x')) end) it("Doesn't auto ignore nore for keys before or after mapping", function() command('let x = 0') eq(0, api.nvim_eval('x')) command [[ nnoremap x nnoremap (Increase_x) let x+=1 nmap increase_x_remap x(Increase_x)x nnoremap increase_x_noremap x(Increase_x)x ]] insert('Some text') eq('Some text', eval("getline('.')")) feed('increase_x_remap') eq(1, api.nvim_eval('x')) eq('Some text', eval("getline('.')")) feed('increase_x_noremap') eq(2, api.nvim_eval('x')) eq('Some te', eval("getline('.')")) end) it(':unmap with rhs works when lhs is in another bucket #21530', function() command('map F Foo') command('unmap Foo') eq('\nNo mapping found', exec_capture('map F')) end) end) describe('Screen', function() local screen before_each(function() clear() screen = Screen.new(20, 5) screen:attach() end) it('cursor is restored after :map which calls input()', function() command('map x input("> ")') screen:expect([[ ^ | {1:~ }|*3 | ]]) feed('x') screen:expect([[ | {1:~ }|*3 > ^ | ]]) feed('\n') screen:expect([[ ^ | {1:~ }|*3 > | ]]) end) it('cursor is restored after :imap which calls input()', function() command('imap x input("> ")') feed('i') screen:expect([[ ^ | {1:~ }|*3 {5:-- INSERT --} | ]]) feed('x') screen:expect([[ | {1:~ }|*3 > ^ | ]]) feed('\n') screen:expect([[ ^ | {1:~ }|*3 {5:-- INSERT --} | ]]) end) it('cursor position does not move after empty-string :cmap #19046', function() command([[cnoremap '']]) feed(':') screen:expect([[ | {1:~ }|*3 :^ | ]]) end) -- oldtest: Test_expr_map_restore_cursor() it('cursor is restored after :map which redraws statusline vim-patch:8.1.2336', function() exec([[ call setline(1, ['one', 'two', 'three']) 2 set ls=2 hi! link StatusLine ErrorMsg noremap Func() func Func() let g:on = !get(g:, 'on', 0) redraws return '' endfunc func Status() return get(g:, 'on', 0) ? '[on]' : '' endfunc set stl=%{Status()} ]]) feed('') screen:expect([[ one | ^two | three | {9:[on] }| | ]]) end) it('error in :nmap does not mess up display vim-patch:4.2.4338', function() screen:try_resize(40, 5) command('nmap execute("throw 42")') feed('') screen:expect([[ | {3: }| {9:Error detected while processing :} | {9:E605: Exception not caught: 42} | {6:Press ENTER or type command to continue}^ | ]]) feed('') screen:expect([[ ^ | {1:~ }|*3 | ]]) end) it('error in :cmap handled correctly vim-patch:4.2.4338', function() screen:try_resize(40, 5) command('cmap execute("throw 42")') feed(':echo "foo') screen:expect([[ | {1:~ }|*3 :echo "foo^ | ]]) feed('') screen:expect([[ {3: }| :echo "foo | {9:Error detected while processing :} | {9:E605: Exception not caught: 42} | :echo "foo^ | ]]) feed('"') screen:expect([[ {3: }| :echo "foo | {9:Error detected while processing :} | {9:E605: Exception not caught: 42} | :echo "foo"^ | ]]) feed('\n') screen:expect([[ :echo "foo | {9:Error detected while processing :} | {9:E605: Exception not caught: 42} | foo | {6:Press ENTER or type command to continue}^ | ]]) end) -- oldtest: Test_map_listing() it('listing mappings clears command line vim-patch:8.2.4401', function() screen:try_resize(40, 5) command('nmap a b') feed(': nmap a') screen:expect([[ ^ | {1:~ }|*3 n a b | ]]) end) end)