12d1a2487SBram Moolenaar" Tests for mappings and abbreviations 22d1a2487SBram Moolenaar 326d98218SBram Moolenaarsource shared.vim 48c5a278fSBram Moolenaarsource check.vim 54ebe0e62SBram Moolenaarsource screendump.vim 6957cf67dSBram Moolenaarsource term_util.vim 726d98218SBram Moolenaar 82d1a2487SBram Moolenaarfunc Test_abbreviation() 92d1a2487SBram Moolenaar " abbreviation with 0x80 should work 102d1a2487SBram Moolenaar inoreab чкпр vim 112d1a2487SBram Moolenaar call feedkeys("Goчкпр \<Esc>", "xt") 122d1a2487SBram Moolenaar call assert_equal('vim ', getline('$')) 132d1a2487SBram Moolenaar iunab чкпр 142d1a2487SBram Moolenaar set nomodified 152d1a2487SBram Moolenaarendfunc 162d1a2487SBram Moolenaar 178485be4eSBram Moolenaarfunc Test_abclear() 188485be4eSBram Moolenaar abbrev foo foobar 198485be4eSBram Moolenaar iabbrev fooi foobari 208485be4eSBram Moolenaar cabbrev fooc foobarc 218485be4eSBram Moolenaar call assert_equal("\n\n" 228485be4eSBram Moolenaar \ .. "c fooc foobarc\n" 238485be4eSBram Moolenaar \ .. "i fooi foobari\n" 248485be4eSBram Moolenaar \ .. "! foo foobar", execute('abbrev')) 258485be4eSBram Moolenaar 268485be4eSBram Moolenaar iabclear 278485be4eSBram Moolenaar call assert_equal("\n\n" 288485be4eSBram Moolenaar \ .. "c fooc foobarc\n" 298485be4eSBram Moolenaar \ .. "c foo foobar", execute('abbrev')) 308485be4eSBram Moolenaar abbrev foo foobar 318485be4eSBram Moolenaar iabbrev fooi foobari 328485be4eSBram Moolenaar 338485be4eSBram Moolenaar cabclear 348485be4eSBram Moolenaar call assert_equal("\n\n" 358485be4eSBram Moolenaar \ .. "i fooi foobari\n" 368485be4eSBram Moolenaar \ .. "i foo foobar", execute('abbrev')) 378485be4eSBram Moolenaar abbrev foo foobar 388485be4eSBram Moolenaar cabbrev fooc foobarc 398485be4eSBram Moolenaar 408485be4eSBram Moolenaar abclear 418485be4eSBram Moolenaar call assert_equal("\n\nNo abbreviation found", execute('abbrev')) 42f0cee197SBram Moolenaar call assert_fails('%abclear', 'E481:') 438485be4eSBram Moolenaarendfunc 448485be4eSBram Moolenaar 458485be4eSBram Moolenaarfunc Test_abclear_buffer() 468485be4eSBram Moolenaar abbrev foo foobar 478485be4eSBram Moolenaar new X1 488485be4eSBram Moolenaar abbrev <buffer> foo1 foobar1 498485be4eSBram Moolenaar new X2 508485be4eSBram Moolenaar abbrev <buffer> foo2 foobar2 518485be4eSBram Moolenaar 528485be4eSBram Moolenaar call assert_equal("\n\n" 538485be4eSBram Moolenaar \ .. "! foo2 @foobar2\n" 548485be4eSBram Moolenaar \ .. "! foo foobar", execute('abbrev')) 558485be4eSBram Moolenaar 568485be4eSBram Moolenaar abclear <buffer> 578485be4eSBram Moolenaar call assert_equal("\n\n" 588485be4eSBram Moolenaar \ .. "! foo foobar", execute('abbrev')) 598485be4eSBram Moolenaar 608485be4eSBram Moolenaar b X1 618485be4eSBram Moolenaar call assert_equal("\n\n" 628485be4eSBram Moolenaar \ .. "! foo1 @foobar1\n" 638485be4eSBram Moolenaar \ .. "! foo foobar", execute('abbrev')) 648485be4eSBram Moolenaar abclear <buffer> 658485be4eSBram Moolenaar call assert_equal("\n\n" 668485be4eSBram Moolenaar \ .. "! foo foobar", execute('abbrev')) 678485be4eSBram Moolenaar 688485be4eSBram Moolenaar abclear 698485be4eSBram Moolenaar call assert_equal("\n\nNo abbreviation found", execute('abbrev')) 708485be4eSBram Moolenaar 718485be4eSBram Moolenaar %bwipe 728485be4eSBram Moolenaarendfunc 738485be4eSBram Moolenaar 742d1a2487SBram Moolenaarfunc Test_map_ctrl_c_insert() 752d1a2487SBram Moolenaar " mapping of ctrl-c in Insert mode 762d1a2487SBram Moolenaar set cpo-=< cpo-=k 772d1a2487SBram Moolenaar inoremap <c-c> <ctrl-c> 782d1a2487SBram Moolenaar cnoremap <c-c> dummy 792d1a2487SBram Moolenaar cunmap <c-c> 80fccd93f0SBram Moolenaar call feedkeys("GoTEST2: CTRL-C |\<*C-C>A|\<Esc>", "xt") 812d1a2487SBram Moolenaar call assert_equal('TEST2: CTRL-C |<ctrl-c>A|', getline('$')) 822d1a2487SBram Moolenaar unmap! <c-c> 832d1a2487SBram Moolenaar set nomodified 842d1a2487SBram Moolenaarendfunc 852d1a2487SBram Moolenaar 862d1a2487SBram Moolenaarfunc Test_map_ctrl_c_visual() 872d1a2487SBram Moolenaar " mapping of ctrl-c in Visual mode 882d1a2487SBram Moolenaar vnoremap <c-c> :<C-u>$put ='vmap works' 89fccd93f0SBram Moolenaar call feedkeys("GV\<*C-C>\<CR>", "xt") 902d1a2487SBram Moolenaar call assert_equal('vmap works', getline('$')) 912d1a2487SBram Moolenaar vunmap <c-c> 922d1a2487SBram Moolenaar set nomodified 932d1a2487SBram Moolenaarendfunc 942d1a2487SBram Moolenaar 952d1a2487SBram Moolenaarfunc Test_map_langmap() 966d91bcb4SBram Moolenaar CheckFeature langmap 97920694c1SBram Moolenaar 98920694c1SBram Moolenaar " check langmap applies in normal mode 99920694c1SBram Moolenaar set langmap=+- nolangremap 100920694c1SBram Moolenaar new 101920694c1SBram Moolenaar call setline(1, ['a', 'b', 'c']) 102920694c1SBram Moolenaar 2 103920694c1SBram Moolenaar call assert_equal('b', getline('.')) 104920694c1SBram Moolenaar call feedkeys("+", "xt") 105920694c1SBram Moolenaar call assert_equal('a', getline('.')) 106920694c1SBram Moolenaar 107920694c1SBram Moolenaar " check no remapping 108920694c1SBram Moolenaar map x + 109920694c1SBram Moolenaar 2 110920694c1SBram Moolenaar call feedkeys("x", "xt") 111920694c1SBram Moolenaar call assert_equal('c', getline('.')) 112920694c1SBram Moolenaar 113920694c1SBram Moolenaar " check with remapping 114920694c1SBram Moolenaar set langremap 115920694c1SBram Moolenaar 2 116920694c1SBram Moolenaar call feedkeys("x", "xt") 117920694c1SBram Moolenaar call assert_equal('a', getline('.')) 118920694c1SBram Moolenaar 119920694c1SBram Moolenaar unmap x 120920694c1SBram Moolenaar bwipe! 121920694c1SBram Moolenaar 122920694c1SBram Moolenaar " 'langnoremap' follows 'langremap' and vise versa 123920694c1SBram Moolenaar set langremap 124920694c1SBram Moolenaar set langnoremap 125920694c1SBram Moolenaar call assert_equal(0, &langremap) 126920694c1SBram Moolenaar set langremap 127920694c1SBram Moolenaar call assert_equal(0, &langnoremap) 128920694c1SBram Moolenaar set nolangremap 129920694c1SBram Moolenaar call assert_equal(1, &langnoremap) 130920694c1SBram Moolenaar 131da9ce2cdSBram Moolenaar " check default values 132da9ce2cdSBram Moolenaar set langnoremap& 133da9ce2cdSBram Moolenaar call assert_equal(0, &langnoremap) 134da9ce2cdSBram Moolenaar call assert_equal(1, &langremap) 135da9ce2cdSBram Moolenaar set langremap& 136da9ce2cdSBram Moolenaar call assert_equal(0, &langnoremap) 137da9ce2cdSBram Moolenaar call assert_equal(1, &langremap) 138da9ce2cdSBram Moolenaar 139920694c1SBram Moolenaar " langmap should not apply in insert mode, 'langremap' doesn't matter 140920694c1SBram Moolenaar set langmap=+{ nolangremap 141920694c1SBram Moolenaar call feedkeys("Go+\<Esc>", "xt") 142920694c1SBram Moolenaar call assert_equal('+', getline('$')) 143920694c1SBram Moolenaar set langmap=+{ langremap 1442d1a2487SBram Moolenaar call feedkeys("Go+\<Esc>", "xt") 1452d1a2487SBram Moolenaar call assert_equal('+', getline('$')) 1462d1a2487SBram Moolenaar 147920694c1SBram Moolenaar " langmap used for register name in insert mode. 148920694c1SBram Moolenaar call setreg('a', 'aaaa') 149920694c1SBram Moolenaar call setreg('b', 'bbbb') 150920694c1SBram Moolenaar call setreg('c', 'cccc') 151920694c1SBram Moolenaar set langmap=ab langremap 152920694c1SBram Moolenaar call feedkeys("Go\<C-R>a\<Esc>", "xt") 153920694c1SBram Moolenaar call assert_equal('bbbb', getline('$')) 154920694c1SBram Moolenaar call feedkeys("Go\<C-R>\<C-R>a\<Esc>", "xt") 155920694c1SBram Moolenaar call assert_equal('bbbb', getline('$')) 156920694c1SBram Moolenaar " mapping does not apply 157920694c1SBram Moolenaar imap c a 158920694c1SBram Moolenaar call feedkeys("Go\<C-R>c\<Esc>", "xt") 159920694c1SBram Moolenaar call assert_equal('cccc', getline('$')) 160920694c1SBram Moolenaar imap a c 161920694c1SBram Moolenaar call feedkeys("Go\<C-R>a\<Esc>", "xt") 162920694c1SBram Moolenaar call assert_equal('bbbb', getline('$')) 1632d1a2487SBram Moolenaar 164920694c1SBram Moolenaar " langmap should not apply in Command-line mode 165920694c1SBram Moolenaar set langmap=+{ nolangremap 1662d1a2487SBram Moolenaar call feedkeys(":call append(line('$'), '+')\<CR>", "xt") 1672d1a2487SBram Moolenaar call assert_equal('+', getline('$')) 1682d1a2487SBram Moolenaar 169e90858d0SBram Moolenaar iunmap a 170e90858d0SBram Moolenaar iunmap c 1712d1a2487SBram Moolenaar set nomodified 1722d1a2487SBram Moolenaarendfunc 1732d1a2487SBram Moolenaar 1742d1a2487SBram Moolenaarfunc Test_map_feedkeys() 1752d1a2487SBram Moolenaar " issue #212 (feedkeys insert mapping at current position) 1762d1a2487SBram Moolenaar nnoremap . :call feedkeys(".", "in")<cr> 1772d1a2487SBram Moolenaar call setline('$', ['a b c d', 'a b c d']) 1782d1a2487SBram Moolenaar $-1 1792d1a2487SBram Moolenaar call feedkeys("0qqdw.ifoo\<Esc>qj0@q\<Esc>", "xt") 1802d1a2487SBram Moolenaar call assert_equal(['fooc d', 'fooc d'], getline(line('$') - 1, line('$'))) 181e90858d0SBram Moolenaar nunmap . 1822d1a2487SBram Moolenaar set nomodified 1832d1a2487SBram Moolenaarendfunc 1842d1a2487SBram Moolenaar 1852d1a2487SBram Moolenaarfunc Test_map_cursor() 1862d1a2487SBram Moolenaar " <c-g>U<cursor> works only within a single line 1872d1a2487SBram Moolenaar imapclear 1882d1a2487SBram Moolenaar imap ( ()<c-g>U<left> 1892d1a2487SBram Moolenaar call feedkeys("G2o\<Esc>ki\<CR>Test1: text with a (here some more text\<Esc>k.", "xt") 1902d1a2487SBram Moolenaar call assert_equal('Test1: text with a (here some more text)', getline(line('$') - 2)) 1912d1a2487SBram Moolenaar call assert_equal('Test1: text with a (here some more text)', getline(line('$') - 1)) 1922d1a2487SBram Moolenaar 1932d1a2487SBram Moolenaar " test undo 1942d1a2487SBram Moolenaar call feedkeys("G2o\<Esc>ki\<CR>Test2: text wit a (here some more text [und undo]\<C-G>u\<Esc>k.u", "xt") 1952d1a2487SBram Moolenaar call assert_equal('', getline(line('$') - 2)) 1962d1a2487SBram Moolenaar call assert_equal('Test2: text wit a (here some more text [und undo])', getline(line('$') - 1)) 1972d1a2487SBram Moolenaar set nomodified 1982d1a2487SBram Moolenaar imapclear 1992d1a2487SBram Moolenaarendfunc 2002d1a2487SBram Moolenaar 20175bf3d22SBram Moolenaarfunc Test_map_cursor_ctrl_gU() 20275bf3d22SBram Moolenaar " <c-g>U<cursor> works only within a single line 20375bf3d22SBram Moolenaar nnoremap c<* *Ncgn<C-r>"<C-G>U<S-Left> 20475bf3d22SBram Moolenaar call setline(1, ['foo', 'foobar', '', 'foo']) 20575bf3d22SBram Moolenaar call cursor(1,2) 20675bf3d22SBram Moolenaar call feedkeys("c<*PREFIX\<esc>.", 'xt') 20775bf3d22SBram Moolenaar call assert_equal(['PREFIXfoo', 'foobar', '', 'PREFIXfoo'], getline(1,'$')) 20875bf3d22SBram Moolenaar " break undo manually 20975bf3d22SBram Moolenaar set ul=1000 21075bf3d22SBram Moolenaar exe ":norm! uu" 21175bf3d22SBram Moolenaar call assert_equal(['foo', 'foobar', '', 'foo'], getline(1,'$')) 21275bf3d22SBram Moolenaar 21375bf3d22SBram Moolenaar " Test that it does not work if the cursor moves to the previous line 21475bf3d22SBram Moolenaar " 2 times <S-Left> move to the previous line 21575bf3d22SBram Moolenaar nnoremap c<* *Ncgn<C-r>"<C-G>U<S-Left><C-G>U<S-Left> 21675bf3d22SBram Moolenaar call setline(1, ['', ' foo', 'foobar', '', 'foo']) 21775bf3d22SBram Moolenaar call cursor(2,3) 21875bf3d22SBram Moolenaar call feedkeys("c<*PREFIX\<esc>.", 'xt') 21975bf3d22SBram Moolenaar call assert_equal(['PREFIXPREFIX', ' foo', 'foobar', '', 'foo'], getline(1,'$')) 22075bf3d22SBram Moolenaar nmapclear 22175bf3d22SBram Moolenaarendfunc 22275bf3d22SBram Moolenaar 22375bf3d22SBram Moolenaar 2242d1a2487SBram Moolenaar" This isn't actually testing a mapping, but similar use of CTRL-G U as above. 2252d1a2487SBram Moolenaarfunc Test_break_undo() 22675bf3d22SBram Moolenaar set whichwrap=<,>,[,] 2272d1a2487SBram Moolenaar call feedkeys("G4o2k", "xt") 2282d1a2487SBram Moolenaar exe ":norm! iTest3: text with a (parenthesis here\<C-G>U\<Right>new line here\<esc>\<up>\<up>." 2292d1a2487SBram Moolenaar call assert_equal('new line here', getline(line('$') - 3)) 2302d1a2487SBram Moolenaar call assert_equal('Test3: text with a (parenthesis here', getline(line('$') - 2)) 2312d1a2487SBram Moolenaar call assert_equal('new line here', getline(line('$') - 1)) 2322d1a2487SBram Moolenaar set nomodified 2332d1a2487SBram Moolenaarendfunc 23435a4cfa2SBram Moolenaar 23535a4cfa2SBram Moolenaarfunc Test_map_meta_quotes() 23635a4cfa2SBram Moolenaar imap <M-"> foo 237fccd93f0SBram Moolenaar call feedkeys("Go-\<*M-\">-\<Esc>", "xt") 23835a4cfa2SBram Moolenaar call assert_equal("-foo-", getline('$')) 23935a4cfa2SBram Moolenaar set nomodified 24035a4cfa2SBram Moolenaar iunmap <M-"> 24135a4cfa2SBram Moolenaarendfunc 242878c263aSBram Moolenaar 243c8fd33d1SBram Moolenaarfunc Test_map_meta_multibyte() 244c8fd33d1SBram Moolenaar imap <M-á> foo 2452f710afeSBram Moolenaar call assert_match('i <M-á>\s*foo', execute('imap')) 246c8fd33d1SBram Moolenaar iunmap <M-á> 247c8fd33d1SBram Moolenaarendfunc 248c8fd33d1SBram Moolenaar 249878c263aSBram Moolenaarfunc Test_abbr_after_line_join() 250878c263aSBram Moolenaar new 251878c263aSBram Moolenaar abbr foo bar 252878c263aSBram Moolenaar set backspace=indent,eol,start 253878c263aSBram Moolenaar exe "normal o\<BS>foo " 254878c263aSBram Moolenaar call assert_equal("bar ", getline(1)) 255878c263aSBram Moolenaar bwipe! 256878c263aSBram Moolenaar unabbr foo 257878c263aSBram Moolenaar set backspace& 258878c263aSBram Moolenaarendfunc 259b7637c44SBram Moolenaar 260b7637c44SBram Moolenaarfunc Test_map_timeout() 2616d91bcb4SBram Moolenaar CheckFeature timers 262b7637c44SBram Moolenaar nnoremap aaaa :let got_aaaa = 1<CR> 263b7637c44SBram Moolenaar nnoremap bb :let got_bb = 1<CR> 264b7637c44SBram Moolenaar nmap b aaa 265b7637c44SBram Moolenaar new 266b7637c44SBram Moolenaar func ExitInsert(timer) 267b7637c44SBram Moolenaar let g:line = getline(1) 268b7637c44SBram Moolenaar call feedkeys("\<Esc>", "t") 269b7637c44SBram Moolenaar endfunc 270b7637c44SBram Moolenaar set timeout timeoutlen=200 27126d98218SBram Moolenaar let timer = timer_start(300, 'ExitInsert') 272b7637c44SBram Moolenaar " After the 'b' Vim waits for another character to see if it matches 'bb'. 273b7637c44SBram Moolenaar " When it times out it is expanded to "aaa", but there is no wait for 274b7637c44SBram Moolenaar " "aaaa". Can't check that reliably though. 275b7637c44SBram Moolenaar call feedkeys("b", "xt!") 276b7637c44SBram Moolenaar call assert_equal("aa", g:line) 277b7637c44SBram Moolenaar call assert_false(exists('got_aaa')) 278b7637c44SBram Moolenaar call assert_false(exists('got_bb')) 279b7637c44SBram Moolenaar 280b7637c44SBram Moolenaar bwipe! 281b7637c44SBram Moolenaar nunmap aaaa 282b7637c44SBram Moolenaar nunmap bb 283b7637c44SBram Moolenaar nunmap b 284b7637c44SBram Moolenaar set timeoutlen& 285b7637c44SBram Moolenaar delfunc ExitInsert 28626d98218SBram Moolenaar call timer_stop(timer) 28726d98218SBram Moolenaarendfunc 28826d98218SBram Moolenaar 28926d98218SBram Moolenaarfunc Test_map_timeout_with_timer_interrupt() 2906d91bcb4SBram Moolenaar CheckFeature job 2916d91bcb4SBram Moolenaar CheckFeature timers 292*f08b0eb8SBram Moolenaar let g:test_is_flaky = 1 29326d98218SBram Moolenaar 29426d98218SBram Moolenaar " Confirm the timer invoked in exit_cb of the job doesn't disturb mapped key 29526d98218SBram Moolenaar " sequence. 29626d98218SBram Moolenaar new 29726d98218SBram Moolenaar let g:val = 0 29826d98218SBram Moolenaar nnoremap \12 :let g:val = 1<CR> 29926d98218SBram Moolenaar nnoremap \123 :let g:val = 2<CR> 300ea94c855SBram Moolenaar set timeout timeoutlen=200 30126d98218SBram Moolenaar 30226d98218SBram Moolenaar func ExitCb(job, status) 3038d4ce56aSBram Moolenaar let g:timer = timer_start(1, {-> feedkeys("3\<Esc>", 't')}) 30426d98218SBram Moolenaar endfunc 30526d98218SBram Moolenaar 30626d98218SBram Moolenaar call job_start([&shell, &shellcmdflag, 'echo'], {'exit_cb': 'ExitCb'}) 30726d98218SBram Moolenaar call feedkeys('\12', 'xt!') 30826d98218SBram Moolenaar call assert_equal(2, g:val) 30926d98218SBram Moolenaar 31026d98218SBram Moolenaar bwipe! 31126d98218SBram Moolenaar nunmap \12 31226d98218SBram Moolenaar nunmap \123 31326d98218SBram Moolenaar set timeoutlen& 31426d98218SBram Moolenaar call WaitFor({-> exists('g:timer')}) 31526d98218SBram Moolenaar call timer_stop(g:timer) 31626d98218SBram Moolenaar unlet g:timer 31726d98218SBram Moolenaar unlet g:val 31826d98218SBram Moolenaar delfunc ExitCb 319b7637c44SBram Moolenaarendfunc 320c3c3e698SBram Moolenaar 321c3c3e698SBram Moolenaarfunc Test_abbreviation_CR() 322c3c3e698SBram Moolenaar new 323c3c3e698SBram Moolenaar func Eatchar(pat) 324c3c3e698SBram Moolenaar let c = nr2char(getchar(0)) 325c3c3e698SBram Moolenaar return (c =~ a:pat) ? '' : c 326c3c3e698SBram Moolenaar endfunc 327c3c3e698SBram Moolenaar iabbrev <buffer><silent> ~~7 <c-r>=repeat('~', 7)<CR><c-r>=Eatchar('\s')<cr> 328c3c3e698SBram Moolenaar call feedkeys("GA~~7 \<esc>", 'xt') 329c3c3e698SBram Moolenaar call assert_equal('~~~~~~~', getline('$')) 330c3c3e698SBram Moolenaar %d 331c3c3e698SBram Moolenaar call feedkeys("GA~~7\<cr>\<esc>", 'xt') 332c3c3e698SBram Moolenaar call assert_equal(['~~~~~~~', ''], getline(1,'$')) 333c3c3e698SBram Moolenaar delfunc Eatchar 334c3c3e698SBram Moolenaar bw! 335c3c3e698SBram Moolenaarendfunc 3365e3423d1SBram Moolenaar 3375e3423d1SBram Moolenaarfunc Test_cabbr_visual_mode() 3385e3423d1SBram Moolenaar cabbr s su 3395e3423d1SBram Moolenaar call feedkeys(":s \<c-B>\"\<CR>", 'itx') 3405e3423d1SBram Moolenaar call assert_equal('"su ', getreg(':')) 3415e3423d1SBram Moolenaar call feedkeys(":'<,'>s \<c-B>\"\<CR>", 'itx') 3425e3423d1SBram Moolenaar let expected = '"'. "'<,'>su " 3435e3423d1SBram Moolenaar call assert_equal(expected, getreg(':')) 3445e3423d1SBram Moolenaar call feedkeys(": '<,'>s \<c-B>\"\<CR>", 'itx') 3455e3423d1SBram Moolenaar let expected = '" '. "'<,'>su " 3465e3423d1SBram Moolenaar call assert_equal(expected, getreg(':')) 3475e3423d1SBram Moolenaar call feedkeys(":'a,'bs \<c-B>\"\<CR>", 'itx') 3485e3423d1SBram Moolenaar let expected = '"'. "'a,'bsu " 3495e3423d1SBram Moolenaar call assert_equal(expected, getreg(':')) 3505e3423d1SBram Moolenaar cunabbr s 3515e3423d1SBram Moolenaarendfunc 3525976f8ffSBram Moolenaar 3535976f8ffSBram Moolenaarfunc Test_motionforce_omap() 3545976f8ffSBram Moolenaar func GetCommand() 3555976f8ffSBram Moolenaar let g:m=mode(1) 3565976f8ffSBram Moolenaar let [g:lnum1, g:col1] = searchpos('-', 'Wb') 3575976f8ffSBram Moolenaar if g:lnum1 == 0 3585976f8ffSBram Moolenaar return "\<Esc>" 3595976f8ffSBram Moolenaar endif 3605976f8ffSBram Moolenaar let [g:lnum2, g:col2] = searchpos('-', 'W') 3615976f8ffSBram Moolenaar if g:lnum2 == 0 3625976f8ffSBram Moolenaar return "\<Esc>" 3635976f8ffSBram Moolenaar endif 3645976f8ffSBram Moolenaar return ":call Select()\<CR>" 3655976f8ffSBram Moolenaar endfunc 3665976f8ffSBram Moolenaar func Select() 3675976f8ffSBram Moolenaar call cursor([g:lnum1, g:col1]) 3685976f8ffSBram Moolenaar exe "normal! 1 ". (strlen(g:m) == 2 ? 'v' : g:m[2]) 3695976f8ffSBram Moolenaar call cursor([g:lnum2, g:col2]) 3705976f8ffSBram Moolenaar execute "normal! \<BS>" 3715976f8ffSBram Moolenaar endfunc 3725976f8ffSBram Moolenaar new 3735976f8ffSBram Moolenaar onoremap <buffer><expr> i- GetCommand() 3745976f8ffSBram Moolenaar " 1) default omap mapping 3755976f8ffSBram Moolenaar %d_ 3765976f8ffSBram Moolenaar call setline(1, ['aaa - bbb', 'x', 'ddd - eee']) 3775976f8ffSBram Moolenaar call cursor(2, 1) 3785976f8ffSBram Moolenaar norm di- 3795976f8ffSBram Moolenaar call assert_equal('no', g:m) 3805976f8ffSBram Moolenaar call assert_equal(['aaa -- eee'], getline(1, '$')) 3815976f8ffSBram Moolenaar " 2) forced characterwise operation 3825976f8ffSBram Moolenaar %d_ 3835976f8ffSBram Moolenaar call setline(1, ['aaa - bbb', 'x', 'ddd - eee']) 3845976f8ffSBram Moolenaar call cursor(2, 1) 3855976f8ffSBram Moolenaar norm dvi- 3865976f8ffSBram Moolenaar call assert_equal('nov', g:m) 3875976f8ffSBram Moolenaar call assert_equal(['aaa -- eee'], getline(1, '$')) 3885976f8ffSBram Moolenaar " 3) forced linewise operation 3895976f8ffSBram Moolenaar %d_ 3905976f8ffSBram Moolenaar call setline(1, ['aaa - bbb', 'x', 'ddd - eee']) 3915976f8ffSBram Moolenaar call cursor(2, 1) 3925976f8ffSBram Moolenaar norm dVi- 3935976f8ffSBram Moolenaar call assert_equal('noV', g:m) 3945976f8ffSBram Moolenaar call assert_equal([''], getline(1, '$')) 3955976f8ffSBram Moolenaar " 4) forced blockwise operation 3965976f8ffSBram Moolenaar %d_ 3975976f8ffSBram Moolenaar call setline(1, ['aaa - bbb', 'x', 'ddd - eee']) 3985976f8ffSBram Moolenaar call cursor(2, 1) 3995976f8ffSBram Moolenaar exe "norm d\<C-V>i-" 4005976f8ffSBram Moolenaar call assert_equal("no\<C-V>", g:m) 4015976f8ffSBram Moolenaar call assert_equal(['aaabbb', 'x', 'dddeee'], getline(1, '$')) 4025976f8ffSBram Moolenaar bwipe! 4035976f8ffSBram Moolenaar delfunc Select 4045976f8ffSBram Moolenaar delfunc GetCommand 4055976f8ffSBram Moolenaarendfunc 4067d491c42SBram Moolenaar 4077d491c42SBram Moolenaarfunc Test_error_in_map_expr() 4088c5a278fSBram Moolenaar " Unlike CheckRunVimInTerminal this does work in a win32 console 4098c5a278fSBram Moolenaar CheckFeature terminal 4108c5a278fSBram Moolenaar if has('win32') && has('gui_running') 4117d491c42SBram Moolenaar throw 'Skipped: cannot run Vim in a terminal window' 4127d491c42SBram Moolenaar endif 4137d491c42SBram Moolenaar 4147d491c42SBram Moolenaar let lines =<< trim [CODE] 4157d491c42SBram Moolenaar func Func() 4167d491c42SBram Moolenaar " fail to create list 4177d491c42SBram Moolenaar let x = [ 4187d491c42SBram Moolenaar endfunc 4197d491c42SBram Moolenaar nmap <expr> ! Func() 4207d491c42SBram Moolenaar set updatetime=50 4217d491c42SBram Moolenaar [CODE] 4227d491c42SBram Moolenaar call writefile(lines, 'Xtest.vim') 4237d491c42SBram Moolenaar 4240d702028SBram Moolenaar let buf = term_start(GetVimCommandCleanTerm() .. ' -S Xtest.vim', {'term_rows': 8}) 4257d491c42SBram Moolenaar let job = term_getjob(buf) 4267d491c42SBram Moolenaar call WaitForAssert({-> assert_notequal('', term_getline(buf, 8))}) 4277d491c42SBram Moolenaar 4287d491c42SBram Moolenaar " GC must not run during map-expr processing, which can make Vim crash. 4297d491c42SBram Moolenaar call term_sendkeys(buf, '!') 4306a2c5a7dSBram Moolenaar call TermWait(buf, 50) 4317d491c42SBram Moolenaar call term_sendkeys(buf, "\<CR>") 4326a2c5a7dSBram Moolenaar call TermWait(buf, 50) 4337d491c42SBram Moolenaar call assert_equal('run', job_status(job)) 4347d491c42SBram Moolenaar 4357d491c42SBram Moolenaar call term_sendkeys(buf, ":qall!\<CR>") 4367d491c42SBram Moolenaar call WaitFor({-> job_status(job) ==# 'dead'}) 4377d491c42SBram Moolenaar if has('unix') 4387d491c42SBram Moolenaar call assert_equal('', job_info(job).termsig) 4397d491c42SBram Moolenaar endif 4407d491c42SBram Moolenaar 4417d491c42SBram Moolenaar call delete('Xtest.vim') 4427d491c42SBram Moolenaar exe buf .. 'bwipe!' 4437d491c42SBram Moolenaarendfunc 444fafb4b18SBram Moolenaar 445fafb4b18SBram Moolenaarfunc Test_list_mappings() 4462559a478SBram Moolenaar " Remove default mappings 4472559a478SBram Moolenaar imapclear 4484f2f61a0SBram Moolenaar 449e3d1f4c9SBram Moolenaar " reset 'isident' to check it isn't used 450e3d1f4c9SBram Moolenaar set isident= 451e3d1f4c9SBram Moolenaar inoremap <C-m> CtrlM 452fafb4b18SBram Moolenaar inoremap <A-S> AltS 453fafb4b18SBram Moolenaar inoremap <S-/> ShiftSlash 454e3d1f4c9SBram Moolenaar set isident& 455fafb4b18SBram Moolenaar call assert_equal([ 456fafb4b18SBram Moolenaar \ 'i <S-/> * ShiftSlash', 457fafb4b18SBram Moolenaar \ 'i <M-S> * AltS', 458fafb4b18SBram Moolenaar \ 'i <C-M> * CtrlM', 459fafb4b18SBram Moolenaar \], execute('imap')->trim()->split("\n")) 460fafb4b18SBram Moolenaar iunmap <C-M> 461fafb4b18SBram Moolenaar iunmap <A-S> 462fafb4b18SBram Moolenaar call assert_equal(['i <S-/> * ShiftSlash'], execute('imap')->trim()->split("\n")) 463fafb4b18SBram Moolenaar iunmap <S-/> 464fafb4b18SBram Moolenaar call assert_equal(['No mapping found'], execute('imap')->trim()->split("\n")) 465c2a60ae1SBram Moolenaar 466c2a60ae1SBram Moolenaar " List global, buffer local and script local mappings 467c2a60ae1SBram Moolenaar nmap ,f /^\k\+ (<CR> 468c2a60ae1SBram Moolenaar nmap <buffer> ,f /^\k\+ (<CR> 469c2a60ae1SBram Moolenaar nmap <script> ,fs /^\k\+ (<CR> 470c2a60ae1SBram Moolenaar call assert_equal(['n ,f @/^\k\+ (<CR>', 471c2a60ae1SBram Moolenaar \ 'n ,fs & /^\k\+ (<CR>', 472c2a60ae1SBram Moolenaar \ 'n ,f /^\k\+ (<CR>'], 473c2a60ae1SBram Moolenaar \ execute('nmap ,f')->trim()->split("\n")) 474c2a60ae1SBram Moolenaar 475c2a60ae1SBram Moolenaar " List <Nop> mapping 476c2a60ae1SBram Moolenaar nmap ,n <Nop> 477c2a60ae1SBram Moolenaar call assert_equal(['n ,n <Nop>'], 478c2a60ae1SBram Moolenaar \ execute('nmap ,n')->trim()->split("\n")) 479c2a60ae1SBram Moolenaar 4807f51bbe0SBram Moolenaar " verbose map 4817f51bbe0SBram Moolenaar call assert_match("\tLast set from .*/test_mapping.vim line \\d\\+$", 4827f51bbe0SBram Moolenaar \ execute('verbose map ,n')->trim()->split("\n")[1]) 4837f51bbe0SBram Moolenaar 4847f51bbe0SBram Moolenaar " map to CTRL-V 4857f51bbe0SBram Moolenaar exe "nmap ,k \<C-V>" 4867f51bbe0SBram Moolenaar call assert_equal(['n ,k <Nop>'], 4877f51bbe0SBram Moolenaar \ execute('nmap ,k')->trim()->split("\n")) 4887f51bbe0SBram Moolenaar 4892d6d718dSYegappan Lakshmanan " map with space at the beginning 4902d6d718dSYegappan Lakshmanan exe "nmap \<C-V> w <Nop>" 4912d6d718dSYegappan Lakshmanan call assert_equal(['n <Space>w <Nop>'], 4922d6d718dSYegappan Lakshmanan \ execute("nmap \<C-V> w")->trim()->split("\n")) 4932d6d718dSYegappan Lakshmanan 494c2a60ae1SBram Moolenaar nmapclear 495fafb4b18SBram Moolenaarendfunc 4964ebe0e62SBram Moolenaar 49718b7d86dSBram Moolenaarfunc Test_expr_map_gets_cursor() 49818b7d86dSBram Moolenaar new 49918b7d86dSBram Moolenaar call setline(1, ['one', 'some w!rd']) 50018b7d86dSBram Moolenaar func StoreColumn() 50118b7d86dSBram Moolenaar let g:exprLine = line('.') 50218b7d86dSBram Moolenaar let g:exprCol = col('.') 50318b7d86dSBram Moolenaar return 'x' 50418b7d86dSBram Moolenaar endfunc 50518b7d86dSBram Moolenaar nnoremap <expr> x StoreColumn() 50618b7d86dSBram Moolenaar 2 50718b7d86dSBram Moolenaar nmap ! f!<Ignore>x 50818b7d86dSBram Moolenaar call feedkeys("!", 'xt') 50918b7d86dSBram Moolenaar call assert_equal('some wrd', getline(2)) 51018b7d86dSBram Moolenaar call assert_equal(2, g:exprLine) 51118b7d86dSBram Moolenaar call assert_equal(7, g:exprCol) 51218b7d86dSBram Moolenaar 51318b7d86dSBram Moolenaar bwipe! 51418b7d86dSBram Moolenaar unlet g:exprLine 51518b7d86dSBram Moolenaar unlet g:exprCol 5166ccfd99bSBram Moolenaar delfunc StoreColumn 51718b7d86dSBram Moolenaar nunmap x 51818b7d86dSBram Moolenaar nunmap ! 51918b7d86dSBram Moolenaarendfunc 52018b7d86dSBram Moolenaar 5214ebe0e62SBram Moolenaarfunc Test_expr_map_restore_cursor() 5224ebe0e62SBram Moolenaar CheckScreendump 5234ebe0e62SBram Moolenaar 5244ebe0e62SBram Moolenaar let lines =<< trim END 5254ebe0e62SBram Moolenaar call setline(1, ['one', 'two', 'three']) 5264ebe0e62SBram Moolenaar 2 5274ebe0e62SBram Moolenaar set ls=2 5284ebe0e62SBram Moolenaar hi! link StatusLine ErrorMsg 5294ebe0e62SBram Moolenaar noremap <expr> <C-B> Func() 5304ebe0e62SBram Moolenaar func Func() 5314ebe0e62SBram Moolenaar let g:on = !get(g:, 'on', 0) 5324ebe0e62SBram Moolenaar redraws 5334ebe0e62SBram Moolenaar return '' 5344ebe0e62SBram Moolenaar endfunc 5354ebe0e62SBram Moolenaar func Status() 5364ebe0e62SBram Moolenaar return get(g:, 'on', 0) ? '[on]' : '' 5374ebe0e62SBram Moolenaar endfunc 5384ebe0e62SBram Moolenaar set stl=%{Status()} 5394ebe0e62SBram Moolenaar END 5404ebe0e62SBram Moolenaar call writefile(lines, 'XtestExprMap') 5414ebe0e62SBram Moolenaar let buf = RunVimInTerminal('-S XtestExprMap', #{rows: 10}) 5426a2c5a7dSBram Moolenaar call TermWait(buf) 5434ebe0e62SBram Moolenaar call term_sendkeys(buf, "\<C-B>") 5444ebe0e62SBram Moolenaar call VerifyScreenDump(buf, 'Test_map_expr_1', {}) 5454ebe0e62SBram Moolenaar 5464ebe0e62SBram Moolenaar " clean up 5474ebe0e62SBram Moolenaar call StopVimInTerminal(buf) 5484ebe0e62SBram Moolenaar call delete('XtestExprMap') 5494ebe0e62SBram Moolenaarendfunc 5508ba6bb7cSBram Moolenaar 5518ba6bb7cSBram Moolenaar" Test for mapping errors 5528ba6bb7cSBram Moolenaarfunc Test_map_error() 5538ba6bb7cSBram Moolenaar call assert_fails('unmap', 'E474:') 5548ba6bb7cSBram Moolenaar call assert_fails("exe 'map ' .. repeat('a', 51) .. ' :ls'", 'E474:') 5558ba6bb7cSBram Moolenaar call assert_fails('unmap abc', 'E31:') 5568ba6bb7cSBram Moolenaar call assert_fails('unabbr abc', 'E24:') 5578ba6bb7cSBram Moolenaar call assert_equal('', maparg('')) 5588ba6bb7cSBram Moolenaar call assert_fails('echo maparg("abc", [])', 'E730:') 5598ba6bb7cSBram Moolenaar 5608ba6bb7cSBram Moolenaar " unique map 5618ba6bb7cSBram Moolenaar map ,w /[#&!]<CR> 5628ba6bb7cSBram Moolenaar call assert_fails("map <unique> ,w /[#&!]<CR>", 'E227:') 5638ba6bb7cSBram Moolenaar " unique buffer-local map 5648ba6bb7cSBram Moolenaar call assert_fails("map <buffer> <unique> ,w /[.,;]<CR>", 'E225:') 5658ba6bb7cSBram Moolenaar unmap ,w 5668ba6bb7cSBram Moolenaar 5678ba6bb7cSBram Moolenaar " unique abbreviation 5688ba6bb7cSBram Moolenaar abbr SP special 5698ba6bb7cSBram Moolenaar call assert_fails("abbr <unique> SP special", 'E226:') 5708ba6bb7cSBram Moolenaar " unique buffer-local map 5718ba6bb7cSBram Moolenaar call assert_fails("abbr <buffer> <unique> SP special", 'E224:') 5728ba6bb7cSBram Moolenaar unabbr SP 5738ba6bb7cSBram Moolenaar 5748ba6bb7cSBram Moolenaar call assert_fails('mapclear abc', 'E474:') 5758ba6bb7cSBram Moolenaar call assert_fails('abclear abc', 'E474:') 576c2a60ae1SBram Moolenaar call assert_fails('abbr $xyz abc', 'E474:') 577c2a60ae1SBram Moolenaar 578c2a60ae1SBram Moolenaar " space character in an abbreviation 579c2a60ae1SBram Moolenaar call assert_fails('abbr ab<space> ABC', 'E474:') 580c2a60ae1SBram Moolenaar 581c2a60ae1SBram Moolenaar " invalid <expr> map 582c2a60ae1SBram Moolenaar map <expr> ,f abc 583c2a60ae1SBram Moolenaar call assert_fails('normal ,f', 'E121:') 584c2a60ae1SBram Moolenaar unmap <expr> ,f 5859f6277bdSBram Moolenaar 5869f6277bdSBram Moolenaar " Recursive use of :normal in a map 5879f6277bdSBram Moolenaar set maxmapdepth=100 5889f6277bdSBram Moolenaar map gq :normal gq<CR> 5899f6277bdSBram Moolenaar call assert_fails('normal gq', 'E192:') 5909f6277bdSBram Moolenaar unmap gq 5919f6277bdSBram Moolenaar set maxmapdepth& 5928ba6bb7cSBram Moolenaarendfunc 5938ba6bb7cSBram Moolenaar 5948ba6bb7cSBram Moolenaar" Test for <special> key mapping 5958ba6bb7cSBram Moolenaarfunc Test_map_special() 5968ba6bb7cSBram Moolenaar new 5978ba6bb7cSBram Moolenaar let old_cpo = &cpo 5988ba6bb7cSBram Moolenaar set cpo+=< 5998ba6bb7cSBram Moolenaar imap <F12> Blue 6008ba6bb7cSBram Moolenaar call feedkeys("i\<F12>", "x") 6018ba6bb7cSBram Moolenaar call assert_equal("<F12>", getline(1)) 6028ba6bb7cSBram Moolenaar call feedkeys("ddi<F12>", "x") 6038ba6bb7cSBram Moolenaar call assert_equal("Blue", getline(1)) 6048ba6bb7cSBram Moolenaar iunmap <F12> 6058ba6bb7cSBram Moolenaar imap <special> <F12> Green 6068ba6bb7cSBram Moolenaar call feedkeys("ddi\<F12>", "x") 6078ba6bb7cSBram Moolenaar call assert_equal("Green", getline(1)) 6088ba6bb7cSBram Moolenaar call feedkeys("ddi<F12>", "x") 6098ba6bb7cSBram Moolenaar call assert_equal("<F12>", getline(1)) 6108ba6bb7cSBram Moolenaar iunmap <special> <F12> 6118ba6bb7cSBram Moolenaar let &cpo = old_cpo 6128ba6bb7cSBram Moolenaar %bwipe! 6138ba6bb7cSBram Moolenaarendfunc 6148ba6bb7cSBram Moolenaar 6158ba6bb7cSBram Moolenaar" Test for hasmapto() 6168ba6bb7cSBram Moolenaarfunc Test_hasmapto() 6178ba6bb7cSBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (')) 618c2a60ae1SBram Moolenaar map ,f /^\k\+ (<CR> 619c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (')) 620c2a60ae1SBram Moolenaar unmap ,f 621c2a60ae1SBram Moolenaar 622c2a60ae1SBram Moolenaar " Insert mode mapping 623c2a60ae1SBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 'i')) 624c2a60ae1SBram Moolenaar imap ,f /^\k\+ (<CR> 625c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 'i')) 626c2a60ae1SBram Moolenaar iunmap ,f 627c2a60ae1SBram Moolenaar 628c2a60ae1SBram Moolenaar " Normal mode mapping 6298ba6bb7cSBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 'n')) 6308ba6bb7cSBram Moolenaar nmap ,f /^\k\+ (<CR> 6318ba6bb7cSBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (')) 6328ba6bb7cSBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 'n')) 633c2a60ae1SBram Moolenaar nunmap ,f 634c2a60ae1SBram Moolenaar 635c2a60ae1SBram Moolenaar " Visual and Select mode mapping 6368ba6bb7cSBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 'v')) 637c2a60ae1SBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 'x')) 638c2a60ae1SBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 's')) 639c2a60ae1SBram Moolenaar vmap ,f /^\k\+ (<CR> 640c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 'v')) 641c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 'x')) 642c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 's')) 643c2a60ae1SBram Moolenaar vunmap ,f 644c2a60ae1SBram Moolenaar 645c2a60ae1SBram Moolenaar " Visual mode mapping 646c2a60ae1SBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 'x')) 647c2a60ae1SBram Moolenaar xmap ,f /^\k\+ (<CR> 648c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 'v')) 649c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 'x')) 650c2a60ae1SBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 's')) 651c2a60ae1SBram Moolenaar xunmap ,f 652c2a60ae1SBram Moolenaar 653c2a60ae1SBram Moolenaar " Select mode mapping 654c2a60ae1SBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 's')) 655c2a60ae1SBram Moolenaar smap ,f /^\k\+ (<CR> 656c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 'v')) 657c2a60ae1SBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 'x')) 658c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 's')) 659c2a60ae1SBram Moolenaar sunmap ,f 660c2a60ae1SBram Moolenaar 661c2a60ae1SBram Moolenaar " Operator-pending mode mapping 662c2a60ae1SBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 'o')) 663c2a60ae1SBram Moolenaar omap ,f /^\k\+ (<CR> 664c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 'o')) 665c2a60ae1SBram Moolenaar ounmap ,f 666c2a60ae1SBram Moolenaar 667c2a60ae1SBram Moolenaar " Language mapping 668c2a60ae1SBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 'l')) 669c2a60ae1SBram Moolenaar lmap ,f /^\k\+ (<CR> 670c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 'l')) 671c2a60ae1SBram Moolenaar lunmap ,f 672c2a60ae1SBram Moolenaar 673c2a60ae1SBram Moolenaar " Cmdline mode mapping 674c2a60ae1SBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 'c')) 675c2a60ae1SBram Moolenaar cmap ,f /^\k\+ (<CR> 676c2a60ae1SBram Moolenaar call assert_equal(1, hasmapto('/^\k\+ (', 'c')) 677c2a60ae1SBram Moolenaar cunmap ,f 6788ba6bb7cSBram Moolenaar 6798ba6bb7cSBram Moolenaar call assert_equal(0, hasmapto('/^\k\+ (', 'n', 1)) 6808ba6bb7cSBram Moolenaarendfunc 6818ba6bb7cSBram Moolenaar 6828ba6bb7cSBram Moolenaar" Test for command-line completion of maps 6838ba6bb7cSBram Moolenaarfunc Test_mapcomplete() 6848ba6bb7cSBram Moolenaar call assert_equal(['<buffer>', '<expr>', '<nowait>', '<script>', 6858ba6bb7cSBram Moolenaar \ '<silent>', '<special>', '<unique>'], 6868ba6bb7cSBram Moolenaar \ getcompletion('', 'mapping')) 6878ba6bb7cSBram Moolenaar call assert_equal([], getcompletion(',d', 'mapping')) 6888ba6bb7cSBram Moolenaar 689c2a60ae1SBram Moolenaar call feedkeys(":unmap <buf\<C-A>\<C-B>\"\<CR>", 'tx') 690c2a60ae1SBram Moolenaar call assert_equal('"unmap <buffer>', @:) 691c2a60ae1SBram Moolenaar 692c2a60ae1SBram Moolenaar call feedkeys(":unabbr <buf\<C-A>\<C-B>\"\<CR>", 'tx') 693c2a60ae1SBram Moolenaar call assert_equal('"unabbr <buffer>', @:) 694c2a60ae1SBram Moolenaar 6958ba6bb7cSBram Moolenaar call feedkeys(":abbr! \<C-A>\<C-B>\"\<CR>", 'tx') 696c2a60ae1SBram Moolenaar call assert_equal("\"abbr! \x01", @:) 697c2a60ae1SBram Moolenaar 698c2a60ae1SBram Moolenaar " Multiple matches for a map 699c2a60ae1SBram Moolenaar nmap ,f /H<CR> 700c2a60ae1SBram Moolenaar omap ,f /H<CR> 701c2a60ae1SBram Moolenaar call feedkeys(":map ,\<C-A>\<C-B>\"\<CR>", 'tx') 702c2a60ae1SBram Moolenaar call assert_equal('"map ,f', @:) 703c2a60ae1SBram Moolenaar mapclear 704c2a60ae1SBram Moolenaarendfunc 705c2a60ae1SBram Moolenaar 706c2a60ae1SBram Moolenaar" Test for <expr> in abbreviation 707c2a60ae1SBram Moolenaarfunc Test_expr_abbr() 708c2a60ae1SBram Moolenaar new 709c2a60ae1SBram Moolenaar iabbr <expr> teh "the" 710c2a60ae1SBram Moolenaar call feedkeys("iteh ", "tx") 711c2a60ae1SBram Moolenaar call assert_equal('the ', getline(1)) 712c2a60ae1SBram Moolenaar iabclear 713c2a60ae1SBram Moolenaar call setline(1, '') 714c2a60ae1SBram Moolenaar 715c2a60ae1SBram Moolenaar " invalid <expr> abbreviation 716c2a60ae1SBram Moolenaar abbr <expr> hte GetAbbr() 717c2a60ae1SBram Moolenaar call assert_fails('normal ihte ', 'E117:') 718c2a60ae1SBram Moolenaar call assert_equal('', getline(1)) 719c2a60ae1SBram Moolenaar unabbr <expr> hte 720c2a60ae1SBram Moolenaar 721c2a60ae1SBram Moolenaar close! 722c2a60ae1SBram Moolenaarendfunc 723c2a60ae1SBram Moolenaar 724c2a60ae1SBram Moolenaar" Test for storing mappings in different modes in a vimrc file 725c2a60ae1SBram Moolenaarfunc Test_mkvimrc_mapmodes() 726c2a60ae1SBram Moolenaar map a1 /a1 727c2a60ae1SBram Moolenaar nmap a2 /a2 728c2a60ae1SBram Moolenaar vmap a3 /a3 729c2a60ae1SBram Moolenaar smap a4 /a4 730c2a60ae1SBram Moolenaar xmap a5 /a5 731c2a60ae1SBram Moolenaar omap a6 /a6 732c2a60ae1SBram Moolenaar map! a7 /a7 733c2a60ae1SBram Moolenaar imap a8 /a8 734c2a60ae1SBram Moolenaar lmap a9 /a9 735c2a60ae1SBram Moolenaar cmap a10 /a10 736c2a60ae1SBram Moolenaar tmap a11 /a11 737c2a60ae1SBram Moolenaar " Normal + Visual map 738c2a60ae1SBram Moolenaar map a12 /a12 739c2a60ae1SBram Moolenaar sunmap a12 740c2a60ae1SBram Moolenaar ounmap a12 741c2a60ae1SBram Moolenaar " Normal + Selectmode map 742c2a60ae1SBram Moolenaar map a13 /a13 743c2a60ae1SBram Moolenaar xunmap a13 744c2a60ae1SBram Moolenaar ounmap a13 745c2a60ae1SBram Moolenaar " Normal + OpPending map 746c2a60ae1SBram Moolenaar map a14 /a14 747c2a60ae1SBram Moolenaar vunmap a14 748c2a60ae1SBram Moolenaar " Visual + Selectmode map 749c2a60ae1SBram Moolenaar map a15 /a15 750c2a60ae1SBram Moolenaar nunmap a15 751c2a60ae1SBram Moolenaar ounmap a15 752c2a60ae1SBram Moolenaar " Visual + OpPending map 753c2a60ae1SBram Moolenaar map a16 /a16 754c2a60ae1SBram Moolenaar nunmap a16 755c2a60ae1SBram Moolenaar sunmap a16 756c2a60ae1SBram Moolenaar " Selectmode + OpPending map 757c2a60ae1SBram Moolenaar map a17 /a17 758c2a60ae1SBram Moolenaar nunmap a17 759c2a60ae1SBram Moolenaar xunmap a17 760c2a60ae1SBram Moolenaar " Normal + Visual + Selectmode map 761c2a60ae1SBram Moolenaar map a18 /a18 762c2a60ae1SBram Moolenaar ounmap a18 763c2a60ae1SBram Moolenaar " Normal + Visual + OpPending map 764c2a60ae1SBram Moolenaar map a19 /a19 765c2a60ae1SBram Moolenaar sunmap a19 766c2a60ae1SBram Moolenaar " Normal + Selectmode + OpPending map 767c2a60ae1SBram Moolenaar map a20 /a20 768c2a60ae1SBram Moolenaar xunmap a20 769c2a60ae1SBram Moolenaar " Visual + Selectmode + OpPending map 770c2a60ae1SBram Moolenaar map a21 /a21 771c2a60ae1SBram Moolenaar nunmap a21 772c2a60ae1SBram Moolenaar " Mapping to Nop 773c2a60ae1SBram Moolenaar map a22 <Nop> 774c2a60ae1SBram Moolenaar " Script local mapping 775c2a60ae1SBram Moolenaar map <script> a23 /a23 776c2a60ae1SBram Moolenaar 777c2a60ae1SBram Moolenaar " Newline in {lhs} and {rhs} of a map 778c2a60ae1SBram Moolenaar exe "map a24\<C-V>\<C-J> ia24\<C-V>\<C-J><Esc>" 779c2a60ae1SBram Moolenaar 780c2a60ae1SBram Moolenaar " Abbreviation 781c2a60ae1SBram Moolenaar abbr a25 A25 782c2a60ae1SBram Moolenaar cabbr a26 A26 783c2a60ae1SBram Moolenaar iabbr a27 A27 784c2a60ae1SBram Moolenaar 785c2a60ae1SBram Moolenaar mkvimrc! Xvimrc 786c2a60ae1SBram Moolenaar let l = readfile('Xvimrc') 787c2a60ae1SBram Moolenaar call assert_equal(['map a1 /a1'], filter(copy(l), 'v:val =~ " a1 "')) 788c2a60ae1SBram Moolenaar call assert_equal(['nmap a2 /a2'], filter(copy(l), 'v:val =~ " a2 "')) 789c2a60ae1SBram Moolenaar call assert_equal(['vmap a3 /a3'], filter(copy(l), 'v:val =~ " a3 "')) 790c2a60ae1SBram Moolenaar call assert_equal(['smap a4 /a4'], filter(copy(l), 'v:val =~ " a4 "')) 791c2a60ae1SBram Moolenaar call assert_equal(['xmap a5 /a5'], filter(copy(l), 'v:val =~ " a5 "')) 792c2a60ae1SBram Moolenaar call assert_equal(['omap a6 /a6'], filter(copy(l), 'v:val =~ " a6 "')) 793c2a60ae1SBram Moolenaar call assert_equal(['map! a7 /a7'], filter(copy(l), 'v:val =~ " a7 "')) 794c2a60ae1SBram Moolenaar call assert_equal(['imap a8 /a8'], filter(copy(l), 'v:val =~ " a8 "')) 795c2a60ae1SBram Moolenaar call assert_equal(['lmap a9 /a9'], filter(copy(l), 'v:val =~ " a9 "')) 796c2a60ae1SBram Moolenaar call assert_equal(['cmap a10 /a10'], filter(copy(l), 'v:val =~ " a10 "')) 797c2a60ae1SBram Moolenaar call assert_equal(['tmap a11 /a11'], filter(copy(l), 'v:val =~ " a11 "')) 798c2a60ae1SBram Moolenaar call assert_equal(['nmap a12 /a12', 'xmap a12 /a12'], 799c2a60ae1SBram Moolenaar \ filter(copy(l), 'v:val =~ " a12 "')) 800c2a60ae1SBram Moolenaar call assert_equal(['nmap a13 /a13', 'smap a13 /a13'], 801c2a60ae1SBram Moolenaar \ filter(copy(l), 'v:val =~ " a13 "')) 802c2a60ae1SBram Moolenaar call assert_equal(['nmap a14 /a14', 'omap a14 /a14'], 803c2a60ae1SBram Moolenaar \ filter(copy(l), 'v:val =~ " a14 "')) 804c2a60ae1SBram Moolenaar call assert_equal(['vmap a15 /a15'], filter(copy(l), 'v:val =~ " a15 "')) 805c2a60ae1SBram Moolenaar call assert_equal(['xmap a16 /a16', 'omap a16 /a16'], 806c2a60ae1SBram Moolenaar \ filter(copy(l), 'v:val =~ " a16 "')) 807c2a60ae1SBram Moolenaar call assert_equal(['smap a17 /a17', 'omap a17 /a17'], 808c2a60ae1SBram Moolenaar \ filter(copy(l), 'v:val =~ " a17 "')) 809c2a60ae1SBram Moolenaar call assert_equal(['nmap a18 /a18', 'vmap a18 /a18'], 810c2a60ae1SBram Moolenaar \ filter(copy(l), 'v:val =~ " a18 "')) 811c2a60ae1SBram Moolenaar call assert_equal(['nmap a19 /a19', 'xmap a19 /a19', 'omap a19 /a19'], 812c2a60ae1SBram Moolenaar \ filter(copy(l), 'v:val =~ " a19 "')) 813c2a60ae1SBram Moolenaar call assert_equal(['nmap a20 /a20', 'smap a20 /a20', 'omap a20 /a20'], 814c2a60ae1SBram Moolenaar \ filter(copy(l), 'v:val =~ " a20 "')) 815c2a60ae1SBram Moolenaar call assert_equal(['vmap a21 /a21', 'omap a21 /a21'], 816c2a60ae1SBram Moolenaar \ filter(copy(l), 'v:val =~ " a21 "')) 817c2a60ae1SBram Moolenaar call assert_equal(['map a22 <Nop>'], filter(copy(l), 'v:val =~ " a22 "')) 818c2a60ae1SBram Moolenaar call assert_equal([], filter(copy(l), 'v:val =~ " a23 "')) 819c2a60ae1SBram Moolenaar call assert_equal(["map a24<NL> ia24<NL>\x16\e"], 820c2a60ae1SBram Moolenaar \ filter(copy(l), 'v:val =~ " a24"')) 821c2a60ae1SBram Moolenaar 822c2a60ae1SBram Moolenaar call assert_equal(['abbr a25 A25'], filter(copy(l), 'v:val =~ " a25 "')) 823c2a60ae1SBram Moolenaar call assert_equal(['cabbr a26 A26'], filter(copy(l), 'v:val =~ " a26 "')) 824c2a60ae1SBram Moolenaar call assert_equal(['iabbr a27 A27'], filter(copy(l), 'v:val =~ " a27 "')) 825c2a60ae1SBram Moolenaar call delete('Xvimrc') 826c2a60ae1SBram Moolenaar 827c2a60ae1SBram Moolenaar mapclear 828c2a60ae1SBram Moolenaar nmapclear 829c2a60ae1SBram Moolenaar vmapclear 830c2a60ae1SBram Moolenaar xmapclear 831c2a60ae1SBram Moolenaar smapclear 832c2a60ae1SBram Moolenaar omapclear 833c2a60ae1SBram Moolenaar imapclear 834c2a60ae1SBram Moolenaar lmapclear 835c2a60ae1SBram Moolenaar cmapclear 836c2a60ae1SBram Moolenaar tmapclear 837c2a60ae1SBram Moolenaarendfunc 838c2a60ae1SBram Moolenaar 839c2a60ae1SBram Moolenaar" Test for recursive mapping ('maxmapdepth') 840c2a60ae1SBram Moolenaarfunc Test_map_recursive() 841c2a60ae1SBram Moolenaar map x y 842c2a60ae1SBram Moolenaar map y x 843c2a60ae1SBram Moolenaar call assert_fails('normal x', 'E223:') 844c2a60ae1SBram Moolenaar unmap x 845c2a60ae1SBram Moolenaar unmap y 846c2a60ae1SBram Moolenaarendfunc 847c2a60ae1SBram Moolenaar 848c2a60ae1SBram Moolenaar" Test for removing an abbreviation using {rhs} and with space after {lhs} 849c2a60ae1SBram Moolenaarfunc Test_abbr_remove() 850c2a60ae1SBram Moolenaar abbr foo bar 851c2a60ae1SBram Moolenaar let d = maparg('foo', 'i', 1, 1) 852c2a60ae1SBram Moolenaar call assert_equal(['foo', 'bar', '!'], [d.lhs, d.rhs, d.mode]) 853c2a60ae1SBram Moolenaar unabbr bar 854c2a60ae1SBram Moolenaar call assert_equal({}, maparg('foo', 'i', 1, 1)) 855c2a60ae1SBram Moolenaar 856c2a60ae1SBram Moolenaar abbr foo bar 857c2a60ae1SBram Moolenaar unabbr foo<space><tab> 858c2a60ae1SBram Moolenaar call assert_equal({}, maparg('foo', 'i', 1, 1)) 8598ba6bb7cSBram Moolenaarendfunc 8608ba6bb7cSBram Moolenaar 8617f51bbe0SBram Moolenaar" Trigger an abbreviation using a special key 8627f51bbe0SBram Moolenaarfunc Test_abbr_trigger_special() 8637f51bbe0SBram Moolenaar new 8647f51bbe0SBram Moolenaar iabbr teh the 8657f51bbe0SBram Moolenaar call feedkeys("iteh\<F2>\<Esc>", 'xt') 8667f51bbe0SBram Moolenaar call assert_equal('the<F2>', getline(1)) 8677f51bbe0SBram Moolenaar iunab teh 8687f51bbe0SBram Moolenaar close! 8697f51bbe0SBram Moolenaarendfunc 8707f51bbe0SBram Moolenaar 8717f51bbe0SBram Moolenaar" Test for '<' in 'cpoptions' 8727f51bbe0SBram Moolenaarfunc Test_map_cpo_special_keycode() 8737f51bbe0SBram Moolenaar set cpo-=< 8747f51bbe0SBram Moolenaar imap x<Bslash>k Test 8757f51bbe0SBram Moolenaar let d = maparg('x<Bslash>k', 'i', 0, 1) 8767f51bbe0SBram Moolenaar call assert_equal(['x\k', 'Test', 'i'], [d.lhs, d.rhs, d.mode]) 8777f51bbe0SBram Moolenaar call feedkeys(":imap x\<C-A>\<C-B>\"\<CR>", 'tx') 8787f51bbe0SBram Moolenaar call assert_equal('"imap x\k', @:) 8797f51bbe0SBram Moolenaar iunmap x<Bslash>k 8807f51bbe0SBram Moolenaar set cpo+=< 8817f51bbe0SBram Moolenaar imap x<Bslash>k Test 8827f51bbe0SBram Moolenaar let d = maparg('x<Bslash>k', 'i', 0, 1) 8837f51bbe0SBram Moolenaar call assert_equal(['x<Bslash>k', 'Test', 'i'], [d.lhs, d.rhs, d.mode]) 8847f51bbe0SBram Moolenaar call feedkeys(":imap x\<C-A>\<C-B>\"\<CR>", 'tx') 8857f51bbe0SBram Moolenaar call assert_equal('"imap x<Bslash>k', @:) 8867f51bbe0SBram Moolenaar iunmap x<Bslash>k 8877f51bbe0SBram Moolenaar set cpo-=< 8887f51bbe0SBram Moolenaar " Modifying 'cpo' above adds some default mappings, remove them 8897f51bbe0SBram Moolenaar mapclear 8907f51bbe0SBram Moolenaar mapclear! 8917f51bbe0SBram Moolenaarendfunc 8927f51bbe0SBram Moolenaar 893957cf67dSBram Moolenaar" Test for <Cmd> key in maps to execute commands 894957cf67dSBram Moolenaarfunc Test_map_cmdkey() 895957cf67dSBram Moolenaar new 896957cf67dSBram Moolenaar 897957cf67dSBram Moolenaar " Error cases 898957cf67dSBram Moolenaar let x = 0 899957cf67dSBram Moolenaar noremap <F3> <Cmd><Cmd>let x = 1<CR> 900957cf67dSBram Moolenaar call assert_fails('call feedkeys("\<F3>", "xt")', 'E1136:') 901957cf67dSBram Moolenaar call assert_equal(0, x) 902957cf67dSBram Moolenaar 903957cf67dSBram Moolenaar noremap <F3> <Cmd><F3>let x = 2<CR> 904957cf67dSBram Moolenaar call assert_fails('call feedkeys("\<F3>", "xt")', 'E1137:') 905957cf67dSBram Moolenaar call assert_equal(0, x) 906957cf67dSBram Moolenaar 907957cf67dSBram Moolenaar noremap <F3> <Cmd>let x = 3 908957cf67dSBram Moolenaar call assert_fails('call feedkeys("\<F3>", "xt!")', 'E1135:') 909957cf67dSBram Moolenaar call assert_equal(0, x) 910957cf67dSBram Moolenaar 911957cf67dSBram Moolenaar " works in various modes and sees the correct mode() 912957cf67dSBram Moolenaar noremap <F3> <Cmd>let m = mode(1)<CR> 913957cf67dSBram Moolenaar noremap! <F3> <Cmd>let m = mode(1)<CR> 914957cf67dSBram Moolenaar 915957cf67dSBram Moolenaar " normal mode 916957cf67dSBram Moolenaar call feedkeys("\<F3>", 'xt') 917957cf67dSBram Moolenaar call assert_equal('n', m) 918957cf67dSBram Moolenaar 919957cf67dSBram Moolenaar " visual mode 920957cf67dSBram Moolenaar call feedkeys("v\<F3>", 'xt!') 921957cf67dSBram Moolenaar call assert_equal('v', m) 922957cf67dSBram Moolenaar " shouldn't leave the visual mode 923957cf67dSBram Moolenaar call assert_equal('v', mode(1)) 924957cf67dSBram Moolenaar call feedkeys("\<Esc>", 'xt') 925957cf67dSBram Moolenaar call assert_equal('n', mode(1)) 926957cf67dSBram Moolenaar 927957cf67dSBram Moolenaar " visual mapping in select mode 928957cf67dSBram Moolenaar call feedkeys("gh\<F3>", 'xt!') 929957cf67dSBram Moolenaar call assert_equal('v', m) 930957cf67dSBram Moolenaar " shouldn't leave select mode 931957cf67dSBram Moolenaar call assert_equal('s', mode(1)) 932957cf67dSBram Moolenaar call feedkeys("\<Esc>", 'xt') 933957cf67dSBram Moolenaar call assert_equal('n', mode(1)) 934957cf67dSBram Moolenaar 935957cf67dSBram Moolenaar " select mode mapping 936957cf67dSBram Moolenaar snoremap <F3> <Cmd>let m = mode(1)<cr> 937957cf67dSBram Moolenaar call feedkeys("gh\<F3>", 'xt!') 938957cf67dSBram Moolenaar call assert_equal('s', m) 939957cf67dSBram Moolenaar " shouldn't leave select mode 940957cf67dSBram Moolenaar call assert_equal('s', mode(1)) 941957cf67dSBram Moolenaar call feedkeys("\<Esc>", 'xt') 942957cf67dSBram Moolenaar call assert_equal('n', mode(1)) 943957cf67dSBram Moolenaar 944957cf67dSBram Moolenaar " operator-pending mode 945957cf67dSBram Moolenaar call feedkeys("d\<F3>", 'xt!') 946957cf67dSBram Moolenaar call assert_equal('no', m) 947957cf67dSBram Moolenaar " leaves the operator-pending mode 948957cf67dSBram Moolenaar call assert_equal('n', mode(1)) 949957cf67dSBram Moolenaar 950957cf67dSBram Moolenaar " insert mode 951957cf67dSBram Moolenaar call feedkeys("i\<F3>abc", 'xt') 952957cf67dSBram Moolenaar call assert_equal('i', m) 953957cf67dSBram Moolenaar call assert_equal('abc', getline('.')) 954957cf67dSBram Moolenaar 955957cf67dSBram Moolenaar " replace mode 956957cf67dSBram Moolenaar call feedkeys("0R\<F3>two", 'xt') 957957cf67dSBram Moolenaar call assert_equal('R', m) 958957cf67dSBram Moolenaar call assert_equal('two', getline('.')) 959957cf67dSBram Moolenaar 960957cf67dSBram Moolenaar " virtual replace mode 961957cf67dSBram Moolenaar call setline('.', "one\ttwo") 962957cf67dSBram Moolenaar call feedkeys("4|gR\<F3>xxx", 'xt') 963957cf67dSBram Moolenaar call assert_equal('Rv', m) 964957cf67dSBram Moolenaar call assert_equal("onexxx\ttwo", getline('.')) 965957cf67dSBram Moolenaar 966957cf67dSBram Moolenaar " cmdline mode 967957cf67dSBram Moolenaar call feedkeys(":\<F3>\"xxx\<CR>", 'xt!') 968957cf67dSBram Moolenaar call assert_equal('c', m) 969957cf67dSBram Moolenaar call assert_equal('"xxx', @:) 970957cf67dSBram Moolenaar 971957cf67dSBram Moolenaar " terminal mode 972957cf67dSBram Moolenaar if CanRunVimInTerminal() 973957cf67dSBram Moolenaar tnoremap <F3> <Cmd>let m = mode(1)<CR> 974957cf67dSBram Moolenaar let buf = Run_shell_in_terminal({}) 975957cf67dSBram Moolenaar call feedkeys("\<F3>", 'xt') 976957cf67dSBram Moolenaar call assert_equal('t', m) 977957cf67dSBram Moolenaar call assert_equal('t', mode(1)) 978957cf67dSBram Moolenaar call StopShellInTerminal(buf) 979957cf67dSBram Moolenaar call TermWait(buf) 980957cf67dSBram Moolenaar close! 981957cf67dSBram Moolenaar tunmap <F3> 982957cf67dSBram Moolenaar endif 983957cf67dSBram Moolenaar 984957cf67dSBram Moolenaar " invoke cmdline mode recursively 985957cf67dSBram Moolenaar noremap! <F2> <Cmd>norm! :foo<CR> 986957cf67dSBram Moolenaar %d 987957cf67dSBram Moolenaar call setline(1, ['some short lines', 'of test text']) 988957cf67dSBram Moolenaar call feedkeys(":bar\<F2>x\<C-B>\"\r", 'xt') 989957cf67dSBram Moolenaar call assert_equal('"barx', @:) 990957cf67dSBram Moolenaar unmap! <F2> 991957cf67dSBram Moolenaar 992957cf67dSBram Moolenaar " test for calling a <SID> function 993957cf67dSBram Moolenaar let lines =<< trim END 994957cf67dSBram Moolenaar map <F2> <Cmd>call <SID>do_it()<CR> 995957cf67dSBram Moolenaar func s:do_it() 996957cf67dSBram Moolenaar let g:x = 32 997957cf67dSBram Moolenaar endfunc 998957cf67dSBram Moolenaar END 999957cf67dSBram Moolenaar call writefile(lines, 'Xscript') 1000957cf67dSBram Moolenaar source Xscript 1001957cf67dSBram Moolenaar call feedkeys("\<F2>", 'xt') 1002957cf67dSBram Moolenaar call assert_equal(32, g:x) 1003957cf67dSBram Moolenaar call delete('Xscript') 1004957cf67dSBram Moolenaar 1005957cf67dSBram Moolenaar unmap <F3> 1006957cf67dSBram Moolenaar unmap! <F3> 1007957cf67dSBram Moolenaar %bw! 10084a44120eSBram Moolenaar 10094a44120eSBram Moolenaar " command line ending in "0" is handled without errors 10104a44120eSBram Moolenaar onoremap ix <cmd>eval 0<cr> 10114a44120eSBram Moolenaar call feedkeys('dix.', 'xt') 10124a44120eSBram Moolenaar ounmap ix 1013957cf67dSBram Moolenaarendfunc 1014957cf67dSBram Moolenaar 1015957cf67dSBram Moolenaar" text object enters visual mode 1016957cf67dSBram Moolenaarfunc TextObj() 1017957cf67dSBram Moolenaar if mode() !=# "v" 1018957cf67dSBram Moolenaar normal! v 1019957cf67dSBram Moolenaar end 1020957cf67dSBram Moolenaar call cursor(1, 3) 1021957cf67dSBram Moolenaar normal! o 1022957cf67dSBram Moolenaar call cursor(2, 4) 1023957cf67dSBram Moolenaarendfunc 1024957cf67dSBram Moolenaar 1025957cf67dSBram Moolenaarfunc s:cmdmap(lhs, rhs) 1026957cf67dSBram Moolenaar exe 'noremap ' .. a:lhs .. ' <Cmd>' .. a:rhs .. '<CR>' 1027957cf67dSBram Moolenaar exe 'noremap! ' .. a:lhs .. ' <Cmd>' .. a:rhs .. '<CR>' 1028957cf67dSBram Moolenaarendfunc 1029957cf67dSBram Moolenaar 1030957cf67dSBram Moolenaarfunc s:cmdunmap(lhs) 1031957cf67dSBram Moolenaar exe 'unmap ' .. a:lhs 1032957cf67dSBram Moolenaar exe 'unmap! ' .. a:lhs 1033957cf67dSBram Moolenaarendfunc 1034957cf67dSBram Moolenaar 1035957cf67dSBram Moolenaar" Map various <Fx> keys used by the <Cmd> key tests 1036957cf67dSBram Moolenaarfunc s:setupMaps() 1037957cf67dSBram Moolenaar call s:cmdmap('<F3>', 'let m = mode(1)') 1038957cf67dSBram Moolenaar call s:cmdmap('<F4>', 'normal! ww') 1039957cf67dSBram Moolenaar call s:cmdmap('<F5>', 'normal! "ay') 1040957cf67dSBram Moolenaar call s:cmdmap('<F6>', 'throw "very error"') 1041957cf67dSBram Moolenaar call s:cmdmap('<F7>', 'call TextObj()') 1042957cf67dSBram Moolenaar call s:cmdmap('<F8>', 'startinsert') 1043957cf67dSBram Moolenaar call s:cmdmap('<F9>', 'stopinsert') 1044957cf67dSBram Moolenaarendfunc 1045957cf67dSBram Moolenaar 1046957cf67dSBram Moolenaar" Remove the mappings setup by setupMaps() 1047957cf67dSBram Moolenaarfunc s:cleanupMaps() 1048957cf67dSBram Moolenaar call s:cmdunmap('<F3>') 1049957cf67dSBram Moolenaar call s:cmdunmap('<F4>') 1050957cf67dSBram Moolenaar call s:cmdunmap('<F5>') 1051957cf67dSBram Moolenaar call s:cmdunmap('<F6>') 1052957cf67dSBram Moolenaar call s:cmdunmap('<F7>') 1053957cf67dSBram Moolenaar call s:cmdunmap('<F8>') 1054957cf67dSBram Moolenaar call s:cmdunmap('<F9>') 1055957cf67dSBram Moolenaarendfunc 1056957cf67dSBram Moolenaar 1057957cf67dSBram Moolenaar" Test for <Cmd> mapping in normal mode 1058957cf67dSBram Moolenaarfunc Test_map_cmdkey_normal_mode() 1059957cf67dSBram Moolenaar new 1060957cf67dSBram Moolenaar call s:setupMaps() 1061957cf67dSBram Moolenaar 1062957cf67dSBram Moolenaar " check v:count and v:register works 1063957cf67dSBram Moolenaar call s:cmdmap('<F2>', 'let s = [mode(1), v:count, v:register]') 1064957cf67dSBram Moolenaar call feedkeys("\<F2>", 'xt') 1065957cf67dSBram Moolenaar call assert_equal(['n', 0, '"'], s) 1066957cf67dSBram Moolenaar call feedkeys("7\<F2>", 'xt') 1067957cf67dSBram Moolenaar call assert_equal(['n', 7, '"'], s) 1068957cf67dSBram Moolenaar call feedkeys("\"e\<F2>", 'xt') 1069957cf67dSBram Moolenaar call assert_equal(['n', 0, 'e'], s) 1070957cf67dSBram Moolenaar call feedkeys("5\"k\<F2>", 'xt') 1071957cf67dSBram Moolenaar call assert_equal(['n', 5, 'k'], s) 1072957cf67dSBram Moolenaar call s:cmdunmap('<F2>') 1073957cf67dSBram Moolenaar 1074957cf67dSBram Moolenaar call setline(1, ['some short lines', 'of test text']) 1075957cf67dSBram Moolenaar call feedkeys("\<F7>y", 'xt') 1076957cf67dSBram Moolenaar call assert_equal("me short lines\nof t", @") 1077957cf67dSBram Moolenaar call assert_equal('v', getregtype('"')) 1078957cf67dSBram Moolenaar call assert_equal([0, 1, 3, 0], getpos("'<")) 1079957cf67dSBram Moolenaar call assert_equal([0, 2, 4, 0], getpos("'>")) 1080957cf67dSBram Moolenaar 1081957cf67dSBram Moolenaar " startinsert 1082957cf67dSBram Moolenaar %d 1083957cf67dSBram Moolenaar call feedkeys("\<F8>abc", 'xt') 1084957cf67dSBram Moolenaar call assert_equal('abc', getline(1)) 1085957cf67dSBram Moolenaar 1086957cf67dSBram Moolenaar " feedkeys are not executed immediately 1087957cf67dSBram Moolenaar noremap ,a <Cmd>call feedkeys("aalpha") \| let g:a = getline(2)<CR> 1088957cf67dSBram Moolenaar %d 1089957cf67dSBram Moolenaar call setline(1, ['some short lines', 'of test text']) 1090957cf67dSBram Moolenaar call cursor(2, 3) 1091957cf67dSBram Moolenaar call feedkeys(",a\<F3>", 'xt') 1092957cf67dSBram Moolenaar call assert_equal('of test text', g:a) 1093957cf67dSBram Moolenaar call assert_equal('n', m) 1094957cf67dSBram Moolenaar call assert_equal(['some short lines', 'of alphatest text'], getline(1, '$')) 1095957cf67dSBram Moolenaar nunmap ,a 1096957cf67dSBram Moolenaar 1097957cf67dSBram Moolenaar " feedkeys(..., 'x') is executed immediately, but insert mode is aborted 1098957cf67dSBram Moolenaar noremap ,b <Cmd>call feedkeys("abeta", 'x') \| let g:b = getline(2)<CR> 1099957cf67dSBram Moolenaar call feedkeys(",b\<F3>", 'xt') 1100957cf67dSBram Moolenaar call assert_equal('n', m) 1101957cf67dSBram Moolenaar call assert_equal('of alphabetatest text', g:b) 1102957cf67dSBram Moolenaar nunmap ,b 1103957cf67dSBram Moolenaar 1104957cf67dSBram Moolenaar call s:cleanupMaps() 1105957cf67dSBram Moolenaar %bw! 1106957cf67dSBram Moolenaarendfunc 1107957cf67dSBram Moolenaar 1108957cf67dSBram Moolenaar" Test for <Cmd> mapping with the :normal command 1109957cf67dSBram Moolenaarfunc Test_map_cmdkey_normal_cmd() 1110957cf67dSBram Moolenaar new 1111957cf67dSBram Moolenaar noremap ,x <Cmd>call append(1, "xx") \| call append(1, "aa")<CR> 1112957cf67dSBram Moolenaar noremap ,f <Cmd>nosuchcommand<CR> 1113957cf67dSBram Moolenaar noremap ,e <Cmd>throw "very error" \| call append(1, "yy")<CR> 1114957cf67dSBram Moolenaar noremap ,m <Cmd>echoerr "The message." \| call append(1, "zz")<CR> 1115957cf67dSBram Moolenaar noremap ,w <Cmd>for i in range(5) \| if i==1 \| echoerr "Err" \| endif \| call append(1, i) \| endfor<CR> 1116957cf67dSBram Moolenaar 1117957cf67dSBram Moolenaar call setline(1, ['some short lines', 'of test text']) 1118957cf67dSBram Moolenaar exe "norm ,x\r" 1119957cf67dSBram Moolenaar call assert_equal(['some short lines', 'aa', 'xx', 'of test text'], getline(1, '$')) 1120957cf67dSBram Moolenaar 1121957cf67dSBram Moolenaar call assert_fails('norm ,f', 'E492:') 1122957cf67dSBram Moolenaar call assert_fails('norm ,e', 'very error') 1123957cf67dSBram Moolenaar call assert_fails('norm ,m', 'The message.') 1124957cf67dSBram Moolenaar call assert_equal(['some short lines', 'aa', 'xx', 'of test text'], getline(1, '$')) 1125957cf67dSBram Moolenaar 1126957cf67dSBram Moolenaar %d 1127957cf67dSBram Moolenaar let caught_err = 0 1128957cf67dSBram Moolenaar try 1129957cf67dSBram Moolenaar exe "normal ,w" 1130957cf67dSBram Moolenaar catch /Vim(echoerr):Err/ 1131957cf67dSBram Moolenaar let caught_err = 1 1132957cf67dSBram Moolenaar endtry 1133957cf67dSBram Moolenaar call assert_equal(1, caught_err) 1134957cf67dSBram Moolenaar call assert_equal(['', '0'], getline(1, '$')) 1135957cf67dSBram Moolenaar 1136957cf67dSBram Moolenaar %d 1137957cf67dSBram Moolenaar call assert_fails('normal ,w', 'Err') 1138957cf67dSBram Moolenaar call assert_equal(['', '4', '3', '2' ,'1', '0'], getline(1, '$')) 1139957cf67dSBram Moolenaar call assert_equal(1, line('.')) 1140957cf67dSBram Moolenaar 1141957cf67dSBram Moolenaar nunmap ,x 1142957cf67dSBram Moolenaar nunmap ,f 1143957cf67dSBram Moolenaar nunmap ,e 1144957cf67dSBram Moolenaar nunmap ,m 1145957cf67dSBram Moolenaar nunmap ,w 1146957cf67dSBram Moolenaar %bw! 1147957cf67dSBram Moolenaarendfunc 1148957cf67dSBram Moolenaar 1149957cf67dSBram Moolenaar" Test for <Cmd> mapping in visual mode 1150957cf67dSBram Moolenaarfunc Test_map_cmdkey_visual_mode() 1151957cf67dSBram Moolenaar new 1152957cf67dSBram Moolenaar set showmode 1153957cf67dSBram Moolenaar call s:setupMaps() 1154957cf67dSBram Moolenaar 1155957cf67dSBram Moolenaar call setline(1, ['some short lines', 'of test text']) 1156957cf67dSBram Moolenaar call feedkeys("v\<F4>", 'xt!') 1157957cf67dSBram Moolenaar call assert_equal(['v', 1, 12], [mode(1), col('v'), col('.')]) 1158957cf67dSBram Moolenaar 1159*f08b0eb8SBram Moolenaar " can invoke an operator, ending the visual mode 1160957cf67dSBram Moolenaar let @a = '' 1161957cf67dSBram Moolenaar call feedkeys("\<F5>", 'xt!') 1162957cf67dSBram Moolenaar call assert_equal('n', mode(1)) 1163957cf67dSBram Moolenaar call assert_equal('some short l', @a) 1164957cf67dSBram Moolenaar 1165957cf67dSBram Moolenaar " error doesn't interrupt visual mode 1166957cf67dSBram Moolenaar call assert_fails('call feedkeys("ggvw\<F6>", "xt!")', 'E605:') 1167957cf67dSBram Moolenaar call assert_equal(['v', 1, 6], [mode(1), col('v'), col('.')]) 1168957cf67dSBram Moolenaar call feedkeys("\<F7>", 'xt!') 1169957cf67dSBram Moolenaar call assert_equal(['v', 1, 3, 2, 4], [mode(1), line('v'), col('v'), line('.'), col('.')]) 1170957cf67dSBram Moolenaar 1171957cf67dSBram Moolenaar " startinsert gives "-- (insert) VISUAL --" mode 1172957cf67dSBram Moolenaar call feedkeys("\<F8>", 'xt!') 1173957cf67dSBram Moolenaar call assert_equal(['v', 1, 3, 2, 4], [mode(1), line('v'), col('v'), line('.'), col('.')]) 1174957cf67dSBram Moolenaar redraw! 1175957cf67dSBram Moolenaar call assert_match('^-- (insert) VISUAL --', Screenline(&lines)) 1176957cf67dSBram Moolenaar call feedkeys("\<Esc>new ", 'x') 1177957cf67dSBram Moolenaar call assert_equal(['some short lines', 'of new test text'], getline(1, '$')) 1178957cf67dSBram Moolenaar 1179957cf67dSBram Moolenaar call s:cleanupMaps() 1180957cf67dSBram Moolenaar set showmode& 1181957cf67dSBram Moolenaar %bw! 1182957cf67dSBram Moolenaarendfunc 1183957cf67dSBram Moolenaar 1184957cf67dSBram Moolenaar" Test for <Cmd> mapping in select mode 1185957cf67dSBram Moolenaarfunc Test_map_cmdkey_select_mode() 1186957cf67dSBram Moolenaar new 1187957cf67dSBram Moolenaar set showmode 1188957cf67dSBram Moolenaar call s:setupMaps() 1189957cf67dSBram Moolenaar 1190957cf67dSBram Moolenaar snoremap <F1> <cmd>throw "very error"<CR> 1191957cf67dSBram Moolenaar snoremap <F2> <cmd>normal! <c-g>"by<CR> 1192957cf67dSBram Moolenaar call setline(1, ['some short lines', 'of test text']) 1193957cf67dSBram Moolenaar 1194957cf67dSBram Moolenaar call feedkeys("gh\<F4>", "xt!") 1195957cf67dSBram Moolenaar call assert_equal(['s', 1, 12], [mode(1), col('v'), col('.')]) 1196957cf67dSBram Moolenaar redraw! 1197957cf67dSBram Moolenaar call assert_match('^-- SELECT --', Screenline(&lines)) 1198957cf67dSBram Moolenaar 1199957cf67dSBram Moolenaar " visual mapping in select mode restarts select mode after operator 1200957cf67dSBram Moolenaar let @a = '' 1201957cf67dSBram Moolenaar call feedkeys("\<F5>", 'xt!') 1202957cf67dSBram Moolenaar call assert_equal('s', mode(1)) 1203957cf67dSBram Moolenaar call assert_equal('some short l', @a) 1204957cf67dSBram Moolenaar 1205957cf67dSBram Moolenaar " select mode mapping works, and does not restart select mode 1206957cf67dSBram Moolenaar let @b = '' 1207957cf67dSBram Moolenaar call feedkeys("\<F2>", 'xt!') 1208957cf67dSBram Moolenaar call assert_equal('n', mode(1)) 1209957cf67dSBram Moolenaar call assert_equal('some short l', @b) 1210957cf67dSBram Moolenaar 1211957cf67dSBram Moolenaar " error doesn't interrupt temporary visual mode 1212957cf67dSBram Moolenaar call assert_fails('call feedkeys("\<Esc>ggvw\<C-G>\<F6>", "xt!")', 'E605:') 1213957cf67dSBram Moolenaar redraw! 1214957cf67dSBram Moolenaar call assert_match('^-- VISUAL --', Screenline(&lines)) 1215957cf67dSBram Moolenaar " quirk: restoration of select mode is not performed 1216957cf67dSBram Moolenaar call assert_equal(['v', 1, 6], [mode(1), col('v'), col('.')]) 1217957cf67dSBram Moolenaar 1218957cf67dSBram Moolenaar " error doesn't interrupt select mode 1219957cf67dSBram Moolenaar call assert_fails('call feedkeys("\<Esc>ggvw\<C-G>\<F1>", "xt!")', 'E605:') 1220957cf67dSBram Moolenaar redraw! 1221957cf67dSBram Moolenaar call assert_match('^-- SELECT --', Screenline(&lines)) 1222957cf67dSBram Moolenaar call assert_equal(['s', 1, 6], [mode(1), col('v'), col('.')]) 1223957cf67dSBram Moolenaar 1224957cf67dSBram Moolenaar call feedkeys("\<F7>", 'xt!') 1225957cf67dSBram Moolenaar redraw! 1226957cf67dSBram Moolenaar call assert_match('^-- SELECT --', Screenline(&lines)) 1227957cf67dSBram Moolenaar call assert_equal(['s', 1, 3, 2, 4], [mode(1), line('v'), col('v'), line('.'), col('.')]) 1228957cf67dSBram Moolenaar 1229957cf67dSBram Moolenaar " startinsert gives "-- SELECT (insert) --" mode 1230957cf67dSBram Moolenaar call feedkeys("\<F8>", 'xt!') 1231957cf67dSBram Moolenaar redraw! 1232957cf67dSBram Moolenaar call assert_match('^-- (insert) SELECT --', Screenline(&lines)) 1233957cf67dSBram Moolenaar call assert_equal(['s', 1, 3, 2, 4], [mode(1), line('v'), col('v'), line('.'), col('.')]) 1234957cf67dSBram Moolenaar call feedkeys("\<Esc>new ", 'x') 1235957cf67dSBram Moolenaar call assert_equal(['some short lines', 'of new test text'], getline(1, '$')) 1236957cf67dSBram Moolenaar 1237957cf67dSBram Moolenaar sunmap <F1> 1238957cf67dSBram Moolenaar sunmap <F2> 1239957cf67dSBram Moolenaar call s:cleanupMaps() 1240957cf67dSBram Moolenaar set showmode& 1241957cf67dSBram Moolenaar %bw! 1242957cf67dSBram Moolenaarendfunc 1243957cf67dSBram Moolenaar 1244957cf67dSBram Moolenaar" Test for <Cmd> mapping in operator-pending mode 1245957cf67dSBram Moolenaarfunc Test_map_cmdkey_op_pending_mode() 1246957cf67dSBram Moolenaar new 1247957cf67dSBram Moolenaar call s:setupMaps() 1248957cf67dSBram Moolenaar 1249957cf67dSBram Moolenaar call setline(1, ['some short lines', 'of test text']) 1250957cf67dSBram Moolenaar call feedkeys("d\<F4>", 'xt') 1251957cf67dSBram Moolenaar call assert_equal(['lines', 'of test text'], getline(1, '$')) 1252957cf67dSBram Moolenaar call assert_equal(['some short '], getreg('"', 1, 1)) 1253957cf67dSBram Moolenaar " create a new undo point 1254957cf67dSBram Moolenaar let &undolevels = &undolevels 1255957cf67dSBram Moolenaar 1256957cf67dSBram Moolenaar call feedkeys(".", 'xt') 1257957cf67dSBram Moolenaar call assert_equal(['test text'], getline(1, '$')) 1258957cf67dSBram Moolenaar call assert_equal(['lines', 'of '], getreg('"', 1, 1)) 1259957cf67dSBram Moolenaar " create a new undo point 1260957cf67dSBram Moolenaar let &undolevels = &undolevels 1261957cf67dSBram Moolenaar 1262957cf67dSBram Moolenaar call feedkeys("uu", 'xt') 1263957cf67dSBram Moolenaar call assert_equal(['some short lines', 'of test text'], getline(1, '$')) 1264957cf67dSBram Moolenaar 1265957cf67dSBram Moolenaar " error aborts operator-pending, operator not performed 1266957cf67dSBram Moolenaar call assert_fails('call feedkeys("d\<F6>", "xt")', 'E605:') 1267957cf67dSBram Moolenaar call assert_equal(['some short lines', 'of test text'], getline(1, '$')) 1268957cf67dSBram Moolenaar 1269957cf67dSBram Moolenaar call feedkeys("\"bd\<F7>", 'xt') 1270957cf67dSBram Moolenaar call assert_equal(['soest text'], getline(1, '$')) 1271957cf67dSBram Moolenaar call assert_equal(['me short lines', 'of t'], getreg('b', 1, 1)) 1272957cf67dSBram Moolenaar 1273957cf67dSBram Moolenaar " startinsert aborts operator 1274957cf67dSBram Moolenaar call feedkeys("d\<F8>cc", 'xt') 1275957cf67dSBram Moolenaar call assert_equal(['soccest text'], getline(1, '$')) 1276957cf67dSBram Moolenaar 1277957cf67dSBram Moolenaar call s:cleanupMaps() 1278957cf67dSBram Moolenaar %bw! 1279957cf67dSBram Moolenaarendfunc 1280957cf67dSBram Moolenaar 1281957cf67dSBram Moolenaar" Test for <Cmd> mapping in insert mode 1282957cf67dSBram Moolenaarfunc Test_map_cmdkey_insert_mode() 1283957cf67dSBram Moolenaar new 1284957cf67dSBram Moolenaar call s:setupMaps() 1285957cf67dSBram Moolenaar 1286957cf67dSBram Moolenaar call setline(1, ['some short lines', 'of test text']) 1287957cf67dSBram Moolenaar " works the same as <C-O>w<C-O>w 1288957cf67dSBram Moolenaar call feedkeys("iindeed \<F4>little ", 'xt') 1289957cf67dSBram Moolenaar call assert_equal(['indeed some short little lines', 'of test text'], getline(1, '$')) 1290957cf67dSBram Moolenaar call assert_fails('call feedkeys("i\<F6> 2", "xt")', 'E605:') 1291957cf67dSBram Moolenaar call assert_equal(['indeed some short little 2 lines', 'of test text'], getline(1, '$')) 1292957cf67dSBram Moolenaar 1293957cf67dSBram Moolenaar " Note when entering visual mode from InsertEnter autocmd, an async event, 1294957cf67dSBram Moolenaar " or a <Cmd> mapping, vim ends up in undocumented "INSERT VISUAL" mode. 1295957cf67dSBram Moolenaar call feedkeys("i\<F7>stuff ", 'xt') 1296957cf67dSBram Moolenaar call assert_equal(['indeed some short little 2 lines', 'of stuff test text'], getline(1, '$')) 1297957cf67dSBram Moolenaar call assert_equal(['v', 1, 3, 2, 9], [mode(1), line('v'), col('v'), line('.'), col('.')]) 1298957cf67dSBram Moolenaar 1299957cf67dSBram Moolenaar call feedkeys("\<F5>", 'xt') 1300957cf67dSBram Moolenaar call assert_equal(['deed some short little 2 lines', 'of stuff '], getreg('a', 1, 1)) 1301957cf67dSBram Moolenaar 1302957cf67dSBram Moolenaar " also works as part of abbreviation 1303957cf67dSBram Moolenaar abbr foo <Cmd>let g:y = 17<CR>bar 1304957cf67dSBram Moolenaar exe "normal i\<space>foo " 1305957cf67dSBram Moolenaar call assert_equal(17, g:y) 1306957cf67dSBram Moolenaar call assert_equal('in bar deed some short little 2 lines', getline(1)) 1307957cf67dSBram Moolenaar unabbr foo 1308957cf67dSBram Moolenaar 1309957cf67dSBram Moolenaar " :startinsert does nothing 1310957cf67dSBram Moolenaar call setline(1, 'foo bar') 1311957cf67dSBram Moolenaar call feedkeys("ggi\<F8>vim", 'xt') 1312957cf67dSBram Moolenaar call assert_equal('vimfoo bar', getline(1)) 1313957cf67dSBram Moolenaar 1314957cf67dSBram Moolenaar " :stopinsert works 1315957cf67dSBram Moolenaar call feedkeys("ggi\<F9>Abc", 'xt') 1316957cf67dSBram Moolenaar call assert_equal('vimfoo barbc', getline(1)) 1317957cf67dSBram Moolenaar 1318957cf67dSBram Moolenaar call s:cleanupMaps() 1319957cf67dSBram Moolenaar %bw! 1320957cf67dSBram Moolenaarendfunc 1321957cf67dSBram Moolenaar 1322957cf67dSBram Moolenaar" Test for <Cmd> mapping in insert-completion mode 1323957cf67dSBram Moolenaarfunc Test_map_cmdkey_insert_complete_mode() 1324957cf67dSBram Moolenaar new 1325957cf67dSBram Moolenaar call s:setupMaps() 1326957cf67dSBram Moolenaar 1327957cf67dSBram Moolenaar call setline(1, 'some short lines') 1328957cf67dSBram Moolenaar call feedkeys("os\<C-X>\<C-N>\<F3>\<C-N> ", 'xt') 1329957cf67dSBram Moolenaar call assert_equal('ic', m) 1330957cf67dSBram Moolenaar call assert_equal(['some short lines', 'short '], getline(1, '$')) 1331957cf67dSBram Moolenaar 1332957cf67dSBram Moolenaar call s:cleanupMaps() 1333957cf67dSBram Moolenaar %bw! 1334957cf67dSBram Moolenaarendfunc 1335957cf67dSBram Moolenaar 1336957cf67dSBram Moolenaar" Test for <Cmd> mapping in cmdline mode 1337957cf67dSBram Moolenaarfunc Test_map_cmdkey_cmdline_mode() 1338957cf67dSBram Moolenaar new 1339957cf67dSBram Moolenaar call s:setupMaps() 1340957cf67dSBram Moolenaar 1341957cf67dSBram Moolenaar call setline(1, ['some short lines', 'of test text']) 1342957cf67dSBram Moolenaar let x = 0 1343957cf67dSBram Moolenaar call feedkeys(":let x\<F3>= 10\r", 'xt') 1344957cf67dSBram Moolenaar call assert_equal('c', m) 1345957cf67dSBram Moolenaar call assert_equal(10, x) 1346957cf67dSBram Moolenaar 1347957cf67dSBram Moolenaar " exception doesn't leave cmdline mode 1348957cf67dSBram Moolenaar call assert_fails('call feedkeys(":let x\<F6>= 20\r", "xt")', 'E605:') 1349957cf67dSBram Moolenaar call assert_equal(20, x) 1350957cf67dSBram Moolenaar 1351957cf67dSBram Moolenaar " move cursor in the buffer from cmdline mode 1352957cf67dSBram Moolenaar call feedkeys(":let x\<F4>= 30\r", 'xt') 1353957cf67dSBram Moolenaar call assert_equal(30, x) 1354957cf67dSBram Moolenaar call assert_equal(12, col('.')) 1355957cf67dSBram Moolenaar 1356957cf67dSBram Moolenaar " :startinsert takes effect after leaving cmdline mode 1357957cf67dSBram Moolenaar call feedkeys(":let x\<F8>= 40\rnew ", 'xt') 1358957cf67dSBram Moolenaar call assert_equal(40, x) 1359957cf67dSBram Moolenaar call assert_equal('some short new lines', getline(1)) 1360957cf67dSBram Moolenaar 1361957cf67dSBram Moolenaar call s:cleanupMaps() 1362957cf67dSBram Moolenaar %bw! 1363957cf67dSBram Moolenaarendfunc 1364957cf67dSBram Moolenaar 1365c77534c3SBram Moolenaarfunc Test_map_cmdkey_redo() 1366c77534c3SBram Moolenaar func SelectDash() 1367c77534c3SBram Moolenaar call search('^---\n\zs', 'bcW') 1368c77534c3SBram Moolenaar norm! V 1369c77534c3SBram Moolenaar call search('\n\ze---$', 'W') 1370c77534c3SBram Moolenaar endfunc 1371c77534c3SBram Moolenaar 1372c77534c3SBram Moolenaar let text =<< trim END 1373c77534c3SBram Moolenaar --- 1374c77534c3SBram Moolenaar aaa 1375c77534c3SBram Moolenaar --- 1376c77534c3SBram Moolenaar bbb 1377c77534c3SBram Moolenaar bbb 1378c77534c3SBram Moolenaar --- 1379c77534c3SBram Moolenaar ccc 1380c77534c3SBram Moolenaar ccc 1381c77534c3SBram Moolenaar ccc 1382c77534c3SBram Moolenaar --- 1383c77534c3SBram Moolenaar END 1384c77534c3SBram Moolenaar new Xcmdtext 1385c77534c3SBram Moolenaar call setline(1, text) 1386c77534c3SBram Moolenaar 1387c77534c3SBram Moolenaar onoremap <silent> i- <Cmd>call SelectDash()<CR> 1388c77534c3SBram Moolenaar call feedkeys('2Gdi-', 'xt') 1389c77534c3SBram Moolenaar call assert_equal(['---', '---'], getline(1, 2)) 1390c77534c3SBram Moolenaar call feedkeys('j.', 'xt') 1391c77534c3SBram Moolenaar call assert_equal(['---', '---', '---'], getline(1, 3)) 1392c77534c3SBram Moolenaar call feedkeys('j.', 'xt') 1393c77534c3SBram Moolenaar call assert_equal(['---', '---', '---', '---'], getline(1, 4)) 1394c77534c3SBram Moolenaar 1395c77534c3SBram Moolenaar bwipe! 1396c77534c3SBram Moolenaar call delete('Xcmdtext') 1397c77534c3SBram Moolenaar delfunc SelectDash 1398c77534c3SBram Moolenaar ounmap i- 1399c77534c3SBram Moolenaarendfunc 1400c77534c3SBram Moolenaar 14011f448d90SBram Moolenaar" Test for using <script> with a map to remap characters in rhs 14021f448d90SBram Moolenaarfunc Test_script_local_remap() 14031f448d90SBram Moolenaar new 14041f448d90SBram Moolenaar inoremap <buffer> <SID>xyz mno 14051f448d90SBram Moolenaar inoremap <buffer> <script> abc st<SID>xyzre 14061f448d90SBram Moolenaar normal iabc 14071f448d90SBram Moolenaar call assert_equal('stmnore', getline(1)) 14081f448d90SBram Moolenaar bwipe! 14091f448d90SBram Moolenaarendfunc 14101f448d90SBram Moolenaar 14114934ed34SBram Moolenaarfunc Test_abbreviate_multi_byte() 14124934ed34SBram Moolenaar new 14134934ed34SBram Moolenaar iabbrev foo bar 14144934ed34SBram Moolenaar call feedkeys("ifoo…\<Esc>", 'xt') 14154934ed34SBram Moolenaar call assert_equal("bar…", getline(1)) 14164934ed34SBram Moolenaar iunabbrev foo 14174934ed34SBram Moolenaar bwipe! 14184934ed34SBram Moolenaarendfunc 14194934ed34SBram Moolenaar 14202d6d718dSYegappan Lakshmanan" Test for abbreviations with 'latin1' encoding 14212d6d718dSYegappan Lakshmananfunc Test_abbreviate_latin1_encoding() 14222d6d718dSYegappan Lakshmanan set encoding=latin1 14232d6d718dSYegappan Lakshmanan call assert_fails('abbr ab#$c ABC', 'E474:') 14242d6d718dSYegappan Lakshmanan new 14252d6d718dSYegappan Lakshmanan iabbr <buffer> #i #include 14262d6d718dSYegappan Lakshmanan iabbr <buffer> ## #enddef 14272d6d718dSYegappan Lakshmanan exe "normal i#i\<C-]>" 14282d6d718dSYegappan Lakshmanan call assert_equal('#include', getline(1)) 14292d6d718dSYegappan Lakshmanan exe "normal 0Di##\<C-]>" 14302d6d718dSYegappan Lakshmanan call assert_equal('#enddef', getline(1)) 14312d6d718dSYegappan Lakshmanan %bw! 14322d6d718dSYegappan Lakshmanan set encoding=utf-8 14332d6d718dSYegappan Lakshmananendfunc 14342d6d718dSYegappan Lakshmanan 14358ba6bb7cSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 1436