1eb992cb9SBram Moolenaar" Test for edit functions 2215ba3b6SBram Moolenaar 3eb992cb9SBram Moolenaarif exists("+t_kD") 4eb992cb9SBram Moolenaar let &t_kD="[3;*~" 5eb992cb9SBram Moolenaarendif 6eb992cb9SBram Moolenaar 7215ba3b6SBram Moolenaarsource check.vim 8215ba3b6SBram Moolenaar 9eb992cb9SBram Moolenaar" Needed for testing basic rightleft: Test_edit_rightleft 10eb992cb9SBram Moolenaarsource view_util.vim 11eb992cb9SBram Moolenaar 12eb992cb9SBram Moolenaar" Needs to come first until the bug in getchar() is 13eb992cb9SBram Moolenaar" fixed: https://groups.google.com/d/msg/vim_dev/fXL9yme4H4c/bOR-U6_bAQAJ 141e115360SBram Moolenaarfunc Test_edit_00b() 15eb992cb9SBram Moolenaar new 16eb992cb9SBram Moolenaar call setline(1, ['abc ']) 17eb992cb9SBram Moolenaar inoreabbr <buffer> h here some more 18eb992cb9SBram Moolenaar call cursor(1, 4) 19eb992cb9SBram Moolenaar " <c-l> expands the abbreviation and ends insertmode 20eb992cb9SBram Moolenaar call feedkeys(":set im\<cr> h\<c-l>:set noim\<cr>", 'tix') 21eb992cb9SBram Moolenaar call assert_equal(['abc here some more '], getline(1,'$')) 22eb992cb9SBram Moolenaar iunabbr <buffer> h 23eb992cb9SBram Moolenaar bw! 24eb992cb9SBram Moolenaarendfunc 25eb992cb9SBram Moolenaar 261e115360SBram Moolenaarfunc Test_edit_01() 27eb992cb9SBram Moolenaar " set for Travis CI? 28eb992cb9SBram Moolenaar " set nocp noesckeys 29eb992cb9SBram Moolenaar new 30eb992cb9SBram Moolenaar " 1) empty buffer 31eb992cb9SBram Moolenaar call assert_equal([''], getline(1,'$')) 32eb992cb9SBram Moolenaar " 2) delete in an empty line 33eb992cb9SBram Moolenaar call feedkeys("i\<del>\<esc>", 'tnix') 34eb992cb9SBram Moolenaar call assert_equal([''], getline(1,'$')) 35eb992cb9SBram Moolenaar %d 36eb992cb9SBram Moolenaar " 3) delete one character 37eb992cb9SBram Moolenaar call setline(1, 'a') 38eb992cb9SBram Moolenaar call feedkeys("i\<del>\<esc>", 'tnix') 39eb992cb9SBram Moolenaar call assert_equal([''], getline(1,'$')) 40eb992cb9SBram Moolenaar %d 41eb992cb9SBram Moolenaar " 4) delete a multibyte character 42eb992cb9SBram Moolenaar call setline(1, "\u0401") 43eb992cb9SBram Moolenaar call feedkeys("i\<del>\<esc>", 'tnix') 44eb992cb9SBram Moolenaar call assert_equal([''], getline(1,'$')) 45eb992cb9SBram Moolenaar %d 46eb992cb9SBram Moolenaar " 5.1) delete linebreak with 'bs' option containing eol 47eb992cb9SBram Moolenaar let _bs=&bs 48eb992cb9SBram Moolenaar set bs=eol 49eb992cb9SBram Moolenaar call setline(1, ["abc def", "ghi jkl"]) 50eb992cb9SBram Moolenaar call cursor(1, 1) 51eb992cb9SBram Moolenaar call feedkeys("A\<del>\<esc>", 'tnix') 52eb992cb9SBram Moolenaar call assert_equal(['abc defghi jkl'], getline(1, 2)) 53eb992cb9SBram Moolenaar %d 54eb992cb9SBram Moolenaar " 5.2) delete linebreak with backspace option w/out eol 55eb992cb9SBram Moolenaar set bs= 56eb992cb9SBram Moolenaar call setline(1, ["abc def", "ghi jkl"]) 57eb992cb9SBram Moolenaar call cursor(1, 1) 58eb992cb9SBram Moolenaar call feedkeys("A\<del>\<esc>", 'tnix') 59eb992cb9SBram Moolenaar call assert_equal(["abc def", "ghi jkl"], getline(1, 2)) 60eb992cb9SBram Moolenaar let &bs=_bs 61eb992cb9SBram Moolenaar bw! 62eb992cb9SBram Moolenaarendfunc 63eb992cb9SBram Moolenaar 641e115360SBram Moolenaarfunc Test_edit_02() 65eb992cb9SBram Moolenaar " Change cursor position in InsertCharPre command 66eb992cb9SBram Moolenaar new 67eb992cb9SBram Moolenaar call setline(1, 'abc') 68eb992cb9SBram Moolenaar call cursor(1, 1) 69eb992cb9SBram Moolenaar fu! DoIt(...) 70eb992cb9SBram Moolenaar call cursor(1, 4) 71eb992cb9SBram Moolenaar if len(a:000) 72eb992cb9SBram Moolenaar let v:char=a:1 73eb992cb9SBram Moolenaar endif 74eb992cb9SBram Moolenaar endfu 75eb992cb9SBram Moolenaar au InsertCharPre <buffer> :call DoIt('y') 76eb992cb9SBram Moolenaar call feedkeys("ix\<esc>", 'tnix') 77eb992cb9SBram Moolenaar call assert_equal(['abcy'], getline(1, '$')) 78eb992cb9SBram Moolenaar " Setting <Enter> in InsertCharPre 79eb992cb9SBram Moolenaar au! InsertCharPre <buffer> :call DoIt("\n") 80eb992cb9SBram Moolenaar call setline(1, 'abc') 81eb992cb9SBram Moolenaar call cursor(1, 1) 82eb992cb9SBram Moolenaar call feedkeys("ix\<esc>", 'tnix') 83eb992cb9SBram Moolenaar call assert_equal(['abc', ''], getline(1, '$')) 84eb992cb9SBram Moolenaar %d 85eb992cb9SBram Moolenaar au! InsertCharPre 86eb992cb9SBram Moolenaar " Change cursor position in InsertEnter command 87eb992cb9SBram Moolenaar " 1) when setting v:char, keeps changed cursor position 88eb992cb9SBram Moolenaar au! InsertEnter <buffer> :call DoIt('y') 89eb992cb9SBram Moolenaar call setline(1, 'abc') 90eb992cb9SBram Moolenaar call cursor(1, 1) 91eb992cb9SBram Moolenaar call feedkeys("ix\<esc>", 'tnix') 92eb992cb9SBram Moolenaar call assert_equal(['abxc'], getline(1, '$')) 93eb992cb9SBram Moolenaar " 2) when not setting v:char, restores changed cursor position 94eb992cb9SBram Moolenaar au! InsertEnter <buffer> :call DoIt() 95eb992cb9SBram Moolenaar call setline(1, 'abc') 96eb992cb9SBram Moolenaar call cursor(1, 1) 97eb992cb9SBram Moolenaar call feedkeys("ix\<esc>", 'tnix') 98eb992cb9SBram Moolenaar call assert_equal(['xabc'], getline(1, '$')) 99eb992cb9SBram Moolenaar au! InsertEnter 100eb992cb9SBram Moolenaar delfu DoIt 101eb992cb9SBram Moolenaar bw! 102eb992cb9SBram Moolenaarendfunc 103eb992cb9SBram Moolenaar 1041e115360SBram Moolenaarfunc Test_edit_03() 105eb992cb9SBram Moolenaar " Change cursor after <c-o> command to end of line 106eb992cb9SBram Moolenaar new 107eb992cb9SBram Moolenaar call setline(1, 'abc') 108eb992cb9SBram Moolenaar call cursor(1, 1) 109eb992cb9SBram Moolenaar call feedkeys("i\<c-o>$y\<esc>", 'tnix') 110eb992cb9SBram Moolenaar call assert_equal(['abcy'], getline(1, '$')) 111eb992cb9SBram Moolenaar %d 112eb992cb9SBram Moolenaar call setline(1, 'abc') 113eb992cb9SBram Moolenaar call cursor(1, 1) 114eb992cb9SBram Moolenaar call feedkeys("i\<c-o>80|y\<esc>", 'tnix') 115eb992cb9SBram Moolenaar call assert_equal(['abcy'], getline(1, '$')) 116eb992cb9SBram Moolenaar %d 117eb992cb9SBram Moolenaar call setline(1, 'abc') 118eb992cb9SBram Moolenaar call feedkeys("Ad\<c-o>:s/$/efg/\<cr>hij", 'tnix') 119eb992cb9SBram Moolenaar call assert_equal(['hijabcdefg'], getline(1, '$')) 120eb992cb9SBram Moolenaar bw! 121eb992cb9SBram Moolenaarendfunc 122eb992cb9SBram Moolenaar 1231e115360SBram Moolenaarfunc Test_edit_04() 124eb992cb9SBram Moolenaar " test for :stopinsert 125eb992cb9SBram Moolenaar new 126eb992cb9SBram Moolenaar call setline(1, 'abc') 127eb992cb9SBram Moolenaar call cursor(1, 1) 128eb992cb9SBram Moolenaar call feedkeys("i\<c-o>:stopinsert\<cr>$", 'tnix') 129eb992cb9SBram Moolenaar call feedkeys("aX\<esc>", 'tnix') 130eb992cb9SBram Moolenaar call assert_equal(['abcX'], getline(1, '$')) 131eb992cb9SBram Moolenaar %d 132eb992cb9SBram Moolenaar bw! 133eb992cb9SBram Moolenaarendfunc 134eb992cb9SBram Moolenaar 1351e115360SBram Moolenaarfunc Test_edit_05() 136eb992cb9SBram Moolenaar " test for folds being opened 137eb992cb9SBram Moolenaar new 138eb992cb9SBram Moolenaar call setline(1, ['abcX', 'abcX', 'zzzZ']) 139eb992cb9SBram Moolenaar call cursor(1, 1) 140eb992cb9SBram Moolenaar set foldmethod=manual foldopen+=insert 141eb992cb9SBram Moolenaar " create fold for those two lines 142eb992cb9SBram Moolenaar norm! Vjzf 143eb992cb9SBram Moolenaar call feedkeys("$ay\<esc>", 'tnix') 144eb992cb9SBram Moolenaar call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$')) 145eb992cb9SBram Moolenaar %d 146eb992cb9SBram Moolenaar call setline(1, ['abcX', 'abcX', 'zzzZ']) 147eb992cb9SBram Moolenaar call cursor(1, 1) 148eb992cb9SBram Moolenaar set foldmethod=manual foldopen-=insert 149eb992cb9SBram Moolenaar " create fold for those two lines 150eb992cb9SBram Moolenaar norm! Vjzf 151eb992cb9SBram Moolenaar call feedkeys("$ay\<esc>", 'tnix') 152eb992cb9SBram Moolenaar call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$')) 153eb992cb9SBram Moolenaar %d 154eb992cb9SBram Moolenaar bw! 155eb992cb9SBram Moolenaarendfunc 156eb992cb9SBram Moolenaar 1571e115360SBram Moolenaarfunc Test_edit_06() 158eb992cb9SBram Moolenaar " Test in diff mode 1596d91bcb4SBram Moolenaar CheckFeature diff 1606d91bcb4SBram Moolenaar CheckExecutable diff 161eb992cb9SBram Moolenaar new 162eb992cb9SBram Moolenaar call setline(1, ['abc', 'xxx', 'yyy']) 163eb992cb9SBram Moolenaar vnew 164eb992cb9SBram Moolenaar call setline(1, ['abc', 'zzz', 'xxx', 'yyy']) 165eb992cb9SBram Moolenaar wincmd p 166eb992cb9SBram Moolenaar diffthis 167eb992cb9SBram Moolenaar wincmd p 168eb992cb9SBram Moolenaar diffthis 169eb992cb9SBram Moolenaar wincmd p 170eb992cb9SBram Moolenaar call cursor(2, 1) 171eb992cb9SBram Moolenaar norm! zt 172eb992cb9SBram Moolenaar call feedkeys("Ozzz\<esc>", 'tnix') 173eb992cb9SBram Moolenaar call assert_equal(['abc', 'zzz', 'xxx', 'yyy'], getline(1,'$')) 174eb992cb9SBram Moolenaar bw! 175eb992cb9SBram Moolenaar bw! 176eb992cb9SBram Moolenaarendfunc 177eb992cb9SBram Moolenaar 1781e115360SBram Moolenaarfunc Test_edit_07() 179eb992cb9SBram Moolenaar " 1) Test with completion <c-l> when popupmenu is visible 180eb992cb9SBram Moolenaar new 181eb992cb9SBram Moolenaar call setline(1, 'J') 182eb992cb9SBram Moolenaar 183eb992cb9SBram Moolenaar func! ListMonths() 184eb992cb9SBram Moolenaar call complete(col('.')-1, ['January', 'February', 'March', 185eb992cb9SBram Moolenaar \ 'April', 'May', 'June', 'July', 'August', 'September', 186eb992cb9SBram Moolenaar \ 'October', 'November', 'December']) 187eb992cb9SBram Moolenaar return '' 188eb992cb9SBram Moolenaar endfunc 189eb992cb9SBram Moolenaar inoremap <buffer> <F5> <C-R>=ListMonths()<CR> 190eb992cb9SBram Moolenaar 191eb992cb9SBram Moolenaar call feedkeys("A\<f5>\<c-p>". repeat("\<down>", 6)."\<c-l>\<down>\<c-l>\<cr>", 'tx') 192eb992cb9SBram Moolenaar call assert_equal(['July'], getline(1,'$')) 193eb992cb9SBram Moolenaar " 1) Test completion when InsertCharPre kicks in 194eb992cb9SBram Moolenaar %d 195eb992cb9SBram Moolenaar call setline(1, 'J') 196eb992cb9SBram Moolenaar fu! DoIt() 197eb992cb9SBram Moolenaar if v:char=='u' 198eb992cb9SBram Moolenaar let v:char='an' 199eb992cb9SBram Moolenaar endif 200eb992cb9SBram Moolenaar endfu 201eb992cb9SBram Moolenaar au InsertCharPre <buffer> :call DoIt() 202eb992cb9SBram Moolenaar call feedkeys("A\<f5>\<c-p>u\<cr>\<c-l>\<cr>", 'tx') 2034c313b13SBram Moolenaar call assert_equal(["Jan\<c-l>",''], 1->getline('$')) 204eb992cb9SBram Moolenaar %d 205eb992cb9SBram Moolenaar call setline(1, 'J') 206eb992cb9SBram Moolenaar call feedkeys("A\<f5>\<c-p>u\<down>\<c-l>\<cr>", 'tx') 2074c313b13SBram Moolenaar call assert_equal(["January"], 1->getline('$')) 208eb992cb9SBram Moolenaar 209eb992cb9SBram Moolenaar delfu ListMonths 210eb992cb9SBram Moolenaar delfu DoIt 211eb992cb9SBram Moolenaar iunmap <buffer> <f5> 212eb992cb9SBram Moolenaar bw! 213eb992cb9SBram Moolenaarendfunc 214eb992cb9SBram Moolenaar 2151e115360SBram Moolenaarfunc Test_edit_08() 216eb992cb9SBram Moolenaar " reset insertmode from i_ctrl-r_= 2172a45d64dSBram Moolenaar let g:bufnr = bufnr('%') 218eb992cb9SBram Moolenaar new 219eb992cb9SBram Moolenaar call setline(1, ['abc']) 220eb992cb9SBram Moolenaar call cursor(1, 4) 2212a45d64dSBram Moolenaar call feedkeys(":set im\<cr>ZZZ\<c-r>=setbufvar(g:bufnr,'&im', 0)\<cr>",'tnix') 222eb992cb9SBram Moolenaar call assert_equal(['abZZZc'], getline(1,'$')) 223eb992cb9SBram Moolenaar call assert_equal([0, 1, 1, 0], getpos('.')) 224eb992cb9SBram Moolenaar call assert_false(0, '&im') 225eb992cb9SBram Moolenaar bw! 2262a45d64dSBram Moolenaar unlet g:bufnr 227eb992cb9SBram Moolenaarendfunc 228eb992cb9SBram Moolenaar 2291e115360SBram Moolenaarfunc Test_edit_09() 230eb992cb9SBram Moolenaar " test i_CTRL-\ combinations 231eb992cb9SBram Moolenaar new 232eb992cb9SBram Moolenaar call setline(1, ['abc', 'def', 'ghi']) 233eb992cb9SBram Moolenaar call cursor(1, 1) 234eb992cb9SBram Moolenaar " 1) CTRL-\ CTLR-N 235eb992cb9SBram Moolenaar call feedkeys(":set im\<cr>\<c-\>\<c-n>ccABC\<c-l>", 'txin') 236eb992cb9SBram Moolenaar call assert_equal(['ABC', 'def', 'ghi'], getline(1,'$')) 237eb992cb9SBram Moolenaar call setline(1, ['ABC', 'def', 'ghi']) 238eb992cb9SBram Moolenaar " 2) CTRL-\ CTLR-G 239eb992cb9SBram Moolenaar call feedkeys("j0\<c-\>\<c-g>ZZZ\<cr>\<c-l>", 'txin') 240eb992cb9SBram Moolenaar call assert_equal(['ABC', 'ZZZ', 'def', 'ghi'], getline(1,'$')) 241eb992cb9SBram Moolenaar call feedkeys("I\<c-\>\<c-g>YYY\<c-l>", 'txin') 242eb992cb9SBram Moolenaar call assert_equal(['ABC', 'ZZZ', 'YYYdef', 'ghi'], getline(1,'$')) 243eb992cb9SBram Moolenaar set noinsertmode 244eb992cb9SBram Moolenaar " 3) CTRL-\ CTRL-O 245eb992cb9SBram Moolenaar call setline(1, ['ABC', 'ZZZ', 'def', 'ghi']) 246eb992cb9SBram Moolenaar call cursor(1, 1) 247eb992cb9SBram Moolenaar call feedkeys("A\<c-o>ix", 'txin') 248eb992cb9SBram Moolenaar call assert_equal(['ABxC', 'ZZZ', 'def', 'ghi'], getline(1,'$')) 249eb992cb9SBram Moolenaar call feedkeys("A\<c-\>\<c-o>ix", 'txin') 250eb992cb9SBram Moolenaar call assert_equal(['ABxCx', 'ZZZ', 'def', 'ghi'], getline(1,'$')) 251eb992cb9SBram Moolenaar " 4) CTRL-\ a (should be inserted literally, not special after <c-\> 252eb992cb9SBram Moolenaar call setline(1, ['ABC', 'ZZZ', 'def', 'ghi']) 253eb992cb9SBram Moolenaar call cursor(1, 1) 254eb992cb9SBram Moolenaar call feedkeys("A\<c-\>a", 'txin') 255eb992cb9SBram Moolenaar call assert_equal(["ABC\<c-\>a", 'ZZZ', 'def', 'ghi'], getline(1, '$')) 256eb992cb9SBram Moolenaar bw! 257eb992cb9SBram Moolenaarendfunc 258eb992cb9SBram Moolenaar 2591e115360SBram Moolenaarfunc Test_edit_11() 260eb992cb9SBram Moolenaar " Test that indenting kicks in 261eb992cb9SBram Moolenaar new 262eb992cb9SBram Moolenaar set cindent 263eb992cb9SBram Moolenaar call setline(1, ['{', '', '']) 264eb992cb9SBram Moolenaar call cursor(2, 1) 265eb992cb9SBram Moolenaar call feedkeys("i\<c-f>int c;\<esc>", 'tnix') 266eb992cb9SBram Moolenaar call cursor(3, 1) 2671671f448SBram Moolenaar call feedkeys("\<Insert>/* comment */", 'tnix') 268eb992cb9SBram Moolenaar call assert_equal(['{', "\<tab>int c;", "/* comment */"], getline(1, '$')) 269eb992cb9SBram Moolenaar " added changed cindentkeys slightly 270eb992cb9SBram Moolenaar set cindent cinkeys+=*/ 271eb992cb9SBram Moolenaar call setline(1, ['{', '', '']) 272eb992cb9SBram Moolenaar call cursor(2, 1) 273eb992cb9SBram Moolenaar call feedkeys("i\<c-f>int c;\<esc>", 'tnix') 274eb992cb9SBram Moolenaar call cursor(3, 1) 275eb992cb9SBram Moolenaar call feedkeys("i/* comment */", 'tnix') 276eb992cb9SBram Moolenaar call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */"], getline(1, '$')) 277eb992cb9SBram Moolenaar set cindent cinkeys+==end 278eb992cb9SBram Moolenaar call feedkeys("oend\<cr>\<esc>", 'tnix') 279eb992cb9SBram Moolenaar call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */", "\tend", ''], getline(1, '$')) 280eb992cb9SBram Moolenaar set cinkeys-==end 281eb992cb9SBram Moolenaar %d 282eb992cb9SBram Moolenaar " Use indentexpr instead of cindenting 283eb992cb9SBram Moolenaar func! Do_Indent() 284eb992cb9SBram Moolenaar if v:lnum == 3 285eb992cb9SBram Moolenaar return 3*shiftwidth() 286eb992cb9SBram Moolenaar else 287eb992cb9SBram Moolenaar return 2*shiftwidth() 288eb992cb9SBram Moolenaar endif 289eb992cb9SBram Moolenaar endfunc 290eb992cb9SBram Moolenaar setl indentexpr=Do_Indent() indentkeys+=*/ 291eb992cb9SBram Moolenaar call setline(1, ['{', '', '']) 292eb992cb9SBram Moolenaar call cursor(2, 1) 293eb992cb9SBram Moolenaar call feedkeys("i\<c-f>int c;\<esc>", 'tnix') 294eb992cb9SBram Moolenaar call cursor(3, 1) 295eb992cb9SBram Moolenaar call feedkeys("i/* comment */", 'tnix') 296eb992cb9SBram Moolenaar call assert_equal(['{', "\<tab>\<tab>int c;", "\<tab>\<tab>\<tab>/* comment */"], getline(1, '$')) 297eb992cb9SBram Moolenaar set cinkeys&vim indentkeys&vim 298eb992cb9SBram Moolenaar set nocindent indentexpr= 299eb992cb9SBram Moolenaar delfu Do_Indent 300eb992cb9SBram Moolenaar bw! 301eb992cb9SBram Moolenaarendfunc 302eb992cb9SBram Moolenaar 3031e115360SBram Moolenaarfunc Test_edit_11_indentexpr() 3041b38344eSBram Moolenaar " Test that indenting kicks in 3051b38344eSBram Moolenaar new 3061b38344eSBram Moolenaar " Use indentexpr instead of cindenting 3071b38344eSBram Moolenaar func! Do_Indent() 3081b38344eSBram Moolenaar let pline=prevnonblank(v:lnum) 3091b38344eSBram Moolenaar if empty(getline(v:lnum)) 3101b38344eSBram Moolenaar if getline(pline) =~ 'if\|then' 3111b38344eSBram Moolenaar return shiftwidth() 3121b38344eSBram Moolenaar else 3131b38344eSBram Moolenaar return 0 3141b38344eSBram Moolenaar endif 3151b38344eSBram Moolenaar else 3161b38344eSBram Moolenaar return 0 3171b38344eSBram Moolenaar endif 3181b38344eSBram Moolenaar endfunc 3191b38344eSBram Moolenaar setl indentexpr=Do_Indent() indentkeys+=0=then,0=fi 3201b38344eSBram Moolenaar call setline(1, ['if [ $this ]']) 3211b38344eSBram Moolenaar call cursor(1, 1) 3221b38344eSBram Moolenaar call feedkeys("othen\<cr>that\<cr>fi", 'tnix') 3231b38344eSBram Moolenaar call assert_equal(['if [ $this ]', "then", "\<tab>that", "fi"], getline(1, '$')) 3241b38344eSBram Moolenaar set cinkeys&vim indentkeys&vim 3251b38344eSBram Moolenaar set nocindent indentexpr= 3261b38344eSBram Moolenaar delfu Do_Indent 3271b38344eSBram Moolenaar bw! 3281b38344eSBram Moolenaarendfunc 3291b38344eSBram Moolenaar 330eb992cb9SBram Moolenaar" Test changing indent in replace mode 331f9ab52e1SBram Moolenaarfunc Test_edit_12() 332eb992cb9SBram Moolenaar new 333eb992cb9SBram Moolenaar call setline(1, ["\tabc", "\tdef"]) 334eb992cb9SBram Moolenaar call cursor(2, 4) 335eb992cb9SBram Moolenaar call feedkeys("R^\<c-d>", 'tnix') 336eb992cb9SBram Moolenaar call assert_equal(["\tabc", "def"], getline(1, '$')) 3374c313b13SBram Moolenaar call assert_equal([0, 2, 2, 0], '.'->getpos()) 338eb992cb9SBram Moolenaar %d 339eb992cb9SBram Moolenaar call setline(1, ["\tabc", "\t\tdef"]) 340eb992cb9SBram Moolenaar call cursor(2, 2) 341eb992cb9SBram Moolenaar call feedkeys("R^\<c-d>", 'tnix') 342eb992cb9SBram Moolenaar call assert_equal(["\tabc", "def"], getline(1, '$')) 343eb992cb9SBram Moolenaar call assert_equal([0, 2, 1, 0], getpos('.')) 344eb992cb9SBram Moolenaar %d 345eb992cb9SBram Moolenaar call setline(1, ["\tabc", "\t\tdef"]) 346eb992cb9SBram Moolenaar call cursor(2, 2) 347eb992cb9SBram Moolenaar call feedkeys("R\<c-t>", 'tnix') 348eb992cb9SBram Moolenaar call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) 349eb992cb9SBram Moolenaar call assert_equal([0, 2, 2, 0], getpos('.')) 350eb992cb9SBram Moolenaar bw! 351eb992cb9SBram Moolenaar 10vnew 352eb992cb9SBram Moolenaar call setline(1, ["\tabc", "\t\tdef"]) 353eb992cb9SBram Moolenaar call cursor(2, 2) 354eb992cb9SBram Moolenaar call feedkeys("R\<c-t>", 'tnix') 355eb992cb9SBram Moolenaar call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) 356eb992cb9SBram Moolenaar call assert_equal([0, 2, 2, 0], getpos('.')) 357eb992cb9SBram Moolenaar %d 358eb992cb9SBram Moolenaar set sw=4 359eb992cb9SBram Moolenaar call setline(1, ["\tabc", "\t\tdef"]) 360eb992cb9SBram Moolenaar call cursor(2, 2) 361eb992cb9SBram Moolenaar call feedkeys("R\<c-t>\<c-t>", 'tnix') 362eb992cb9SBram Moolenaar call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) 363eb992cb9SBram Moolenaar call assert_equal([0, 2, 2, 0], getpos('.')) 364eb992cb9SBram Moolenaar %d 365eb992cb9SBram Moolenaar call setline(1, ["\tabc", "\t\tdef"]) 366eb992cb9SBram Moolenaar call cursor(2, 2) 367eb992cb9SBram Moolenaar call feedkeys("R\<c-t>\<c-t>", 'tnix') 368eb992cb9SBram Moolenaar call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) 369eb992cb9SBram Moolenaar call assert_equal([0, 2, 2, 0], getpos('.')) 370f9ab52e1SBram Moolenaar set sw& 371f9ab52e1SBram Moolenaar 372f9ab52e1SBram Moolenaar " In replace mode, after hitting enter in a line with tab characters, 373f9ab52e1SBram Moolenaar " pressing backspace should restore the tab characters. 374eb992cb9SBram Moolenaar %d 375f9ab52e1SBram Moolenaar setlocal autoindent backspace=2 376f9ab52e1SBram Moolenaar call setline(1, "\tone\t\ttwo") 377f9ab52e1SBram Moolenaar exe "normal ggRred\<CR>six" .. repeat("\<BS>", 8) 378f9ab52e1SBram Moolenaar call assert_equal(["\tone\t\ttwo"], getline(1, '$')) 379eb992cb9SBram Moolenaar bw! 380eb992cb9SBram Moolenaarendfunc 381eb992cb9SBram Moolenaar 3821e115360SBram Moolenaarfunc Test_edit_13() 383eb992cb9SBram Moolenaar " Test smartindenting 384eb992cb9SBram Moolenaar if exists("+smartindent") 385eb992cb9SBram Moolenaar new 386eb992cb9SBram Moolenaar set smartindent autoindent 387eb992cb9SBram Moolenaar call setline(1, ["\tabc"]) 388eb992cb9SBram Moolenaar call feedkeys("A {\<cr>more\<cr>}\<esc>", 'tnix') 389eb992cb9SBram Moolenaar call assert_equal(["\tabc {", "\t\tmore", "\t}"], getline(1, '$')) 390eb992cb9SBram Moolenaar set smartindent& autoindent& 3912ba42388SBram Moolenaar bwipe! 392eb992cb9SBram Moolenaar endif 3932ba42388SBram Moolenaar 3942ba42388SBram Moolenaar " Test autoindent removing indent of blank line. 3952ba42388SBram Moolenaar new 3962ba42388SBram Moolenaar call setline(1, ' foo bar baz') 3972ba42388SBram Moolenaar set autoindent 3982ba42388SBram Moolenaar exe "normal 0eea\<CR>\<CR>\<Esc>" 3992ba42388SBram Moolenaar call assert_equal(" foo bar", getline(1)) 4002ba42388SBram Moolenaar call assert_equal("", getline(2)) 4012ba42388SBram Moolenaar call assert_equal(" baz", getline(3)) 4022ba42388SBram Moolenaar set autoindent& 403845e0ee5SBram Moolenaar 404845e0ee5SBram Moolenaar " pressing <C-U> to erase line should keep the indent with 'autoindent' 405845e0ee5SBram Moolenaar set backspace=2 autoindent 406845e0ee5SBram Moolenaar %d 407845e0ee5SBram Moolenaar exe "normal i\tone\<CR>three\<C-U>two" 408845e0ee5SBram Moolenaar call assert_equal(["\tone", "\ttwo"], getline(1, '$')) 409845e0ee5SBram Moolenaar set backspace& autoindent& 410845e0ee5SBram Moolenaar 4112ba42388SBram Moolenaar bwipe! 412eb992cb9SBram Moolenaarendfunc 413eb992cb9SBram Moolenaar 4141f448d90SBram Moolenaar" Test for autoindent removing indent when insert mode is stopped. Some parts 4151f448d90SBram Moolenaar" of the code is exercised only when interactive mode is used. So use Vim in a 4161f448d90SBram Moolenaar" terminal. 4171f448d90SBram Moolenaarfunc Test_autoindent_remove_indent() 4181f448d90SBram Moolenaar CheckRunVimInTerminal 4191f448d90SBram Moolenaar let buf = RunVimInTerminal('-N Xfile', {'rows': 6, 'cols' : 20}) 4201f448d90SBram Moolenaar call TermWait(buf) 4211f448d90SBram Moolenaar call term_sendkeys(buf, ":set autoindent\n") 4221f448d90SBram Moolenaar " leaving insert mode in a new line with indent added by autoindent, should 4231f448d90SBram Moolenaar " remove the indent. 4241f448d90SBram Moolenaar call term_sendkeys(buf, "i\<Tab>foo\<CR>\<Esc>") 4251f448d90SBram Moolenaar " Need to delay for sometime, otherwise the code in getchar.c will not be 4261f448d90SBram Moolenaar " exercised. 4271f448d90SBram Moolenaar call TermWait(buf, 50) 4281f448d90SBram Moolenaar " when a line is wrapped and the cursor is at the start of the second line, 4291f448d90SBram Moolenaar " leaving insert mode, should move the cursor back to the first line. 4301f448d90SBram Moolenaar call term_sendkeys(buf, "o" .. repeat('x', 20) .. "\<Esc>") 4311f448d90SBram Moolenaar " Need to delay for sometime, otherwise the code in getchar.c will not be 4321f448d90SBram Moolenaar " exercised. 4331f448d90SBram Moolenaar call TermWait(buf, 50) 4341f448d90SBram Moolenaar call term_sendkeys(buf, ":w\n") 4351f448d90SBram Moolenaar call TermWait(buf) 4361f448d90SBram Moolenaar call StopVimInTerminal(buf) 4371f448d90SBram Moolenaar call assert_equal(["\tfoo", '', repeat('x', 20)], readfile('Xfile')) 4381f448d90SBram Moolenaar call delete('Xfile') 4391f448d90SBram Moolenaarendfunc 4401f448d90SBram Moolenaar 4411e115360SBram Moolenaarfunc Test_edit_CR() 442eb992cb9SBram Moolenaar " Test for <CR> in insert mode 443eb992cb9SBram Moolenaar " basically only in quickfix mode ist tested, the rest 444eb992cb9SBram Moolenaar " has been taken care of by other tests 4456d91bcb4SBram Moolenaar CheckFeature quickfix 446eb992cb9SBram Moolenaar botright new 447eb992cb9SBram Moolenaar call writefile(range(1, 10), 'Xqflist.txt') 448eb992cb9SBram Moolenaar call setqflist([{'filename': 'Xqflist.txt', 'lnum': 2}]) 449eb992cb9SBram Moolenaar copen 450eb992cb9SBram Moolenaar set modifiable 451eb992cb9SBram Moolenaar call feedkeys("A\<cr>", 'tnix') 452eb992cb9SBram Moolenaar call assert_equal('Xqflist.txt', bufname('')) 453eb992cb9SBram Moolenaar call assert_equal(2, line('.')) 454eb992cb9SBram Moolenaar cclose 455eb992cb9SBram Moolenaar botright new 456eb992cb9SBram Moolenaar call setloclist(0, [{'filename': 'Xqflist.txt', 'lnum': 10}]) 457eb992cb9SBram Moolenaar lopen 458eb992cb9SBram Moolenaar set modifiable 459eb992cb9SBram Moolenaar call feedkeys("A\<cr>", 'tnix') 460eb992cb9SBram Moolenaar call assert_equal('Xqflist.txt', bufname('')) 461eb992cb9SBram Moolenaar call assert_equal(10, line('.')) 462eb992cb9SBram Moolenaar call feedkeys("A\<Enter>", 'tnix') 463eb992cb9SBram Moolenaar call feedkeys("A\<kEnter>", 'tnix') 464eb992cb9SBram Moolenaar call feedkeys("A\n", 'tnix') 465eb992cb9SBram Moolenaar call feedkeys("A\r", 'tnix') 466eb992cb9SBram Moolenaar call assert_equal(map(range(1, 10), 'string(v:val)') + ['', '', '', ''], getline(1, '$')) 467eb992cb9SBram Moolenaar bw! 468eb992cb9SBram Moolenaar lclose 469eb992cb9SBram Moolenaar call delete('Xqflist.txt') 470eb992cb9SBram Moolenaarendfunc 471eb992cb9SBram Moolenaar 4721e115360SBram Moolenaarfunc Test_edit_CTRL_() 4736d91bcb4SBram Moolenaar CheckFeature rightleft 474eb992cb9SBram Moolenaar " disabled for Windows builds, why? 4756d91bcb4SBram Moolenaar CheckNotMSWindows 476eb992cb9SBram Moolenaar let _encoding=&encoding 477eb992cb9SBram Moolenaar set encoding=utf-8 478eb992cb9SBram Moolenaar " Test for CTRL-_ 479eb992cb9SBram Moolenaar new 480eb992cb9SBram Moolenaar call setline(1, ['abc']) 481eb992cb9SBram Moolenaar call cursor(1, 1) 482eb992cb9SBram Moolenaar call feedkeys("i\<c-_>xyz\<esc>", 'tnix') 483eb992cb9SBram Moolenaar call assert_equal(["\<C-_>xyzabc"], getline(1, '$')) 484eb992cb9SBram Moolenaar call assert_false(&revins) 485eb992cb9SBram Moolenaar set ari 486eb992cb9SBram Moolenaar call setline(1, ['abc']) 487eb992cb9SBram Moolenaar call cursor(1, 1) 488eb992cb9SBram Moolenaar call feedkeys("i\<c-_>xyz\<esc>", 'tnix') 489eb992cb9SBram Moolenaar call assert_equal(["æèñabc"], getline(1, '$')) 490eb992cb9SBram Moolenaar call assert_true(&revins) 491eb992cb9SBram Moolenaar call setline(1, ['abc']) 492eb992cb9SBram Moolenaar call cursor(1, 1) 493eb992cb9SBram Moolenaar call feedkeys("i\<c-_>xyz\<esc>", 'tnix') 494eb992cb9SBram Moolenaar call assert_equal(["xyzabc"], getline(1, '$')) 495eb992cb9SBram Moolenaar call assert_false(&revins) 496eb992cb9SBram Moolenaar set noari 497eb992cb9SBram Moolenaar let &encoding=_encoding 498eb992cb9SBram Moolenaar bw! 499eb992cb9SBram Moolenaarendfunc 500eb992cb9SBram Moolenaar 501eb992cb9SBram Moolenaar" needs to come first, to have the @. register empty 5021e115360SBram Moolenaarfunc Test_edit_00a_CTRL_A() 503eb992cb9SBram Moolenaar " Test pressing CTRL-A 504eb992cb9SBram Moolenaar new 505eb992cb9SBram Moolenaar call setline(1, repeat([''], 5)) 506eb992cb9SBram Moolenaar call cursor(1, 1) 507eb992cb9SBram Moolenaar try 508eb992cb9SBram Moolenaar call feedkeys("A\<NUL>", 'tnix') 509eb992cb9SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E29/ 510eb992cb9SBram Moolenaar call assert_true(1, 'E29 error caught') 511eb992cb9SBram Moolenaar endtry 512eb992cb9SBram Moolenaar call cursor(1, 1) 513eb992cb9SBram Moolenaar call feedkeys("Afoobar \<esc>", 'tnix') 514eb992cb9SBram Moolenaar call cursor(2, 1) 515eb992cb9SBram Moolenaar call feedkeys("A\<c-a>more\<esc>", 'tnix') 516eb992cb9SBram Moolenaar call cursor(3, 1) 517eb992cb9SBram Moolenaar call feedkeys("A\<NUL>and more\<esc>", 'tnix') 518eb992cb9SBram Moolenaar call assert_equal(['foobar ', 'foobar more', 'foobar morend more', '', ''], getline(1, '$')) 519eb992cb9SBram Moolenaar bw! 520eb992cb9SBram Moolenaarendfunc 521eb992cb9SBram Moolenaar 5221e115360SBram Moolenaarfunc Test_edit_CTRL_EY() 523eb992cb9SBram Moolenaar " Ctrl-E/ Ctrl-Y in insert mode completion to scroll 524eb992cb9SBram Moolenaar 10new 525eb992cb9SBram Moolenaar call setline(1, range(1, 100)) 526eb992cb9SBram Moolenaar call cursor(30, 1) 527eb992cb9SBram Moolenaar norm! z. 528eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix') 529eb992cb9SBram Moolenaar call assert_equal(30, winsaveview()['topline']) 530eb992cb9SBram Moolenaar call assert_equal([0, 30, 2, 0], getpos('.')) 531eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix') 532eb992cb9SBram Moolenaar call feedkeys("A\<c-x>".repeat("\<c-y>", 10), 'tnix') 533eb992cb9SBram Moolenaar call assert_equal(21, winsaveview()['topline']) 534eb992cb9SBram Moolenaar call assert_equal([0, 30, 2, 0], getpos('.')) 535eb992cb9SBram Moolenaar bw! 536eb992cb9SBram Moolenaarendfunc 537eb992cb9SBram Moolenaar 5381e115360SBram Moolenaarfunc Test_edit_CTRL_G() 539eb992cb9SBram Moolenaar new 540eb992cb9SBram Moolenaar call setline(1, ['foobar', 'foobar', 'foobar']) 541eb992cb9SBram Moolenaar call cursor(2, 4) 542eb992cb9SBram Moolenaar call feedkeys("ioooooooo\<c-g>k\<c-r>.\<esc>", 'tnix') 543eb992cb9SBram Moolenaar call assert_equal(['foooooooooobar', 'foooooooooobar', 'foobar'], getline(1, '$')) 544eb992cb9SBram Moolenaar call assert_equal([0, 1, 11, 0], getpos('.')) 545eb992cb9SBram Moolenaar call feedkeys("i\<c-g>k\<esc>", 'tnix') 546eb992cb9SBram Moolenaar call assert_equal([0, 1, 10, 0], getpos('.')) 547eb992cb9SBram Moolenaar call cursor(2, 4) 548eb992cb9SBram Moolenaar call feedkeys("i\<c-g>jzzzz\<esc>", 'tnix') 549eb992cb9SBram Moolenaar call assert_equal(['foooooooooobar', 'foooooooooobar', 'foozzzzbar'], getline(1, '$')) 550eb992cb9SBram Moolenaar call assert_equal([0, 3, 7, 0], getpos('.')) 551eb992cb9SBram Moolenaar call feedkeys("i\<c-g>j\<esc>", 'tnix') 552eb992cb9SBram Moolenaar call assert_equal([0, 3, 6, 0], getpos('.')) 553eb992cb9SBram Moolenaar bw! 554eb992cb9SBram Moolenaarendfunc 555eb992cb9SBram Moolenaar 5561e115360SBram Moolenaarfunc Test_edit_CTRL_I() 557eb992cb9SBram Moolenaar " Tab in completion mode 558eb992cb9SBram Moolenaar let path=expand("%:p:h") 559eb992cb9SBram Moolenaar new 560eb992cb9SBram Moolenaar call setline(1, [path. "/", '']) 561c5379471SBram Moolenaar call feedkeys("Arunt\<c-x>\<c-f>\<tab>\<cr>\<esc>", 'tnix') 562c5379471SBram Moolenaar call assert_match('runtest\.vim', getline(1)) 563eb992cb9SBram Moolenaar %d 564eb992cb9SBram Moolenaar call writefile(['one', 'two', 'three'], 'Xinclude.txt') 565eb992cb9SBram Moolenaar let include='#include Xinclude.txt' 566eb992cb9SBram Moolenaar call setline(1, [include, '']) 567eb992cb9SBram Moolenaar call cursor(2, 1) 568eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<tab>\<cr>\<esc>", 'tnix') 569eb992cb9SBram Moolenaar call assert_equal([include, 'one', ''], getline(1, '$')) 570eb992cb9SBram Moolenaar call feedkeys("2ggC\<c-x>\<tab>\<down>\<cr>\<esc>", 'tnix') 571eb992cb9SBram Moolenaar call assert_equal([include, 'two', ''], getline(1, '$')) 572eb992cb9SBram Moolenaar call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<cr>\<esc>", 'tnix') 573eb992cb9SBram Moolenaar call assert_equal([include, 'three', ''], getline(1, '$')) 574eb992cb9SBram Moolenaar call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<down>\<cr>\<esc>", 'tnix') 575eb992cb9SBram Moolenaar call assert_equal([include, '', ''], getline(1, '$')) 576eb992cb9SBram Moolenaar call delete("Xinclude.txt") 577eb992cb9SBram Moolenaar bw! 578eb992cb9SBram Moolenaarendfunc 579eb992cb9SBram Moolenaar 5801e115360SBram Moolenaarfunc Test_edit_CTRL_K() 581eb992cb9SBram Moolenaar " Test pressing CTRL-K (basically only dictionary completion and digraphs 582eb992cb9SBram Moolenaar " the rest is already covered 583eb992cb9SBram Moolenaar call writefile(['A', 'AA', 'AAA', 'AAAA'], 'Xdictionary.txt') 584eb992cb9SBram Moolenaar set dictionary=Xdictionary.txt 585eb992cb9SBram Moolenaar new 586eb992cb9SBram Moolenaar call setline(1, 'A') 587eb992cb9SBram Moolenaar call cursor(1, 1) 588eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-k>\<cr>\<esc>", 'tnix') 589eb992cb9SBram Moolenaar call assert_equal(['AA', ''], getline(1, '$')) 590eb992cb9SBram Moolenaar %d 591eb992cb9SBram Moolenaar call setline(1, 'A') 592eb992cb9SBram Moolenaar call cursor(1, 1) 593eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-k>\<down>\<cr>\<esc>", 'tnix') 594eb992cb9SBram Moolenaar call assert_equal(['AAA'], getline(1, '$')) 595eb992cb9SBram Moolenaar %d 596eb992cb9SBram Moolenaar call setline(1, 'A') 597eb992cb9SBram Moolenaar call cursor(1, 1) 598eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<cr>\<esc>", 'tnix') 599eb992cb9SBram Moolenaar call assert_equal(['AAAA'], getline(1, '$')) 600eb992cb9SBram Moolenaar %d 601eb992cb9SBram Moolenaar call setline(1, 'A') 602eb992cb9SBram Moolenaar call cursor(1, 1) 603eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<cr>\<esc>", 'tnix') 604eb992cb9SBram Moolenaar call assert_equal(['A'], getline(1, '$')) 605eb992cb9SBram Moolenaar %d 606eb992cb9SBram Moolenaar call setline(1, 'A') 607eb992cb9SBram Moolenaar call cursor(1, 1) 608eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<down>\<cr>\<esc>", 'tnix') 609eb992cb9SBram Moolenaar call assert_equal(['AA'], getline(1, '$')) 610eb992cb9SBram Moolenaar 6114b96df5aSBram Moolenaar " press an unexpected key after dictionary completion 612eb992cb9SBram Moolenaar %d 613eb992cb9SBram Moolenaar call setline(1, 'A') 614eb992cb9SBram Moolenaar call cursor(1, 1) 615eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-k>\<c-]>\<cr>\<esc>", 'tnix') 616eb992cb9SBram Moolenaar call assert_equal(['AA', ''], getline(1, '$')) 617eb992cb9SBram Moolenaar %d 618eb992cb9SBram Moolenaar call setline(1, 'A') 619eb992cb9SBram Moolenaar call cursor(1, 1) 620eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-k>\<c-s>\<cr>\<esc>", 'tnix') 621eb992cb9SBram Moolenaar call assert_equal(["AA\<c-s>", ''], getline(1, '$')) 622eb992cb9SBram Moolenaar %d 623eb992cb9SBram Moolenaar call setline(1, 'A') 624eb992cb9SBram Moolenaar call cursor(1, 1) 625eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-k>\<c-f>\<cr>\<esc>", 'tnix') 626eb992cb9SBram Moolenaar call assert_equal(["AA\<c-f>", ''], getline(1, '$')) 627eb992cb9SBram Moolenaar 628eb992cb9SBram Moolenaar set dictionary= 629eb992cb9SBram Moolenaar %d 630eb992cb9SBram Moolenaar call setline(1, 'A') 631eb992cb9SBram Moolenaar call cursor(1, 1) 632eb992cb9SBram Moolenaar let v:testing = 1 633eb992cb9SBram Moolenaar try 634eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-k>\<esc>", 'tnix') 635eb992cb9SBram Moolenaar catch 636eb992cb9SBram Moolenaar " error sleeps 2 seconds, when v:testing is not set 637eb992cb9SBram Moolenaar let v:testing = 0 638eb992cb9SBram Moolenaar endtry 639eb992cb9SBram Moolenaar call delete('Xdictionary.txt') 640eb992cb9SBram Moolenaar 641eb992cb9SBram Moolenaar call test_override("char_avail", 1) 642eb992cb9SBram Moolenaar set showcmd 643eb992cb9SBram Moolenaar %d 644eb992cb9SBram Moolenaar call feedkeys("A\<c-k>a:\<esc>", 'tnix') 645eb992cb9SBram Moolenaar call assert_equal(['ä'], getline(1, '$')) 646eb992cb9SBram Moolenaar call test_override("char_avail", 0) 647eb992cb9SBram Moolenaar set noshowcmd 64830276f2bSBram Moolenaar 649eb992cb9SBram Moolenaar bw! 650eb992cb9SBram Moolenaarendfunc 651eb992cb9SBram Moolenaar 6521e115360SBram Moolenaarfunc Test_edit_CTRL_L() 653eb992cb9SBram Moolenaar " Test Ctrl-X Ctrl-L (line completion) 654eb992cb9SBram Moolenaar new 655eb992cb9SBram Moolenaar set complete=. 656eb992cb9SBram Moolenaar call setline(1, ['one', 'two', 'three', '', '', '', '']) 657eb992cb9SBram Moolenaar call cursor(4, 1) 658eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-l>\<esc>", 'tnix') 659eb992cb9SBram Moolenaar call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) 660eb992cb9SBram Moolenaar call feedkeys("cct\<c-x>\<c-l>\<c-n>\<esc>", 'tnix') 661eb992cb9SBram Moolenaar call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) 662eb992cb9SBram Moolenaar call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<esc>", 'tnix') 663eb992cb9SBram Moolenaar call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$')) 66402ae9b4aSBram Moolenaar call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix') 665eb992cb9SBram Moolenaar call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) 66602ae9b4aSBram Moolenaar call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix') 66702ae9b4aSBram Moolenaar call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) 668eb992cb9SBram Moolenaar call feedkeys("cct\<c-x>\<c-l>\<c-p>\<esc>", 'tnix') 669eb992cb9SBram Moolenaar call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$')) 670eb992cb9SBram Moolenaar call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<esc>", 'tnix') 671eb992cb9SBram Moolenaar call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) 672eb992cb9SBram Moolenaar call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<c-p>\<esc>", 'tnix') 673eb992cb9SBram Moolenaar call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) 674eb992cb9SBram Moolenaar set complete= 675eb992cb9SBram Moolenaar call cursor(5, 1) 676eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-l>\<c-p>\<c-n>\<esc>", 'tnix') 677eb992cb9SBram Moolenaar call assert_equal(['one', 'two', 'three', 'three', "\<c-l>\<c-p>\<c-n>", '', ''], getline(1, '$')) 678eb992cb9SBram Moolenaar set complete& 679eb992cb9SBram Moolenaar %d 680eb992cb9SBram Moolenaar if has("conceal") && has("syntax") 681eb992cb9SBram Moolenaar call setline(1, ['foo', 'bar', 'foobar']) 682eb992cb9SBram Moolenaar call test_override("char_avail", 1) 683eb992cb9SBram Moolenaar set conceallevel=2 concealcursor=n 684eb992cb9SBram Moolenaar syn on 685eb992cb9SBram Moolenaar syn match ErrorMsg "^bar" 686eb992cb9SBram Moolenaar call matchadd("Conceal", 'oo', 10, -1, {'conceal': 'X'}) 687eb992cb9SBram Moolenaar func! DoIt() 688eb992cb9SBram Moolenaar let g:change=1 689eb992cb9SBram Moolenaar endfunc 690eb992cb9SBram Moolenaar au! TextChangedI <buffer> :call DoIt() 691eb992cb9SBram Moolenaar 692eb992cb9SBram Moolenaar call cursor(2, 1) 693eb992cb9SBram Moolenaar call assert_false(exists("g:change")) 694eb992cb9SBram Moolenaar call feedkeys("A \<esc>", 'tnix') 695eb992cb9SBram Moolenaar call assert_equal(['foo', 'bar ', 'foobar'], getline(1, '$')) 696eb992cb9SBram Moolenaar call assert_equal(1, g:change) 697eb992cb9SBram Moolenaar 698eb992cb9SBram Moolenaar call test_override("char_avail", 0) 699eb992cb9SBram Moolenaar call clearmatches() 700eb992cb9SBram Moolenaar syn off 701eb992cb9SBram Moolenaar au! TextChangedI 702eb992cb9SBram Moolenaar delfu DoIt 703eb992cb9SBram Moolenaar unlet! g:change 704eb992cb9SBram Moolenaar endif 705eb992cb9SBram Moolenaar bw! 706eb992cb9SBram Moolenaarendfunc 707eb992cb9SBram Moolenaar 7081e115360SBram Moolenaarfunc Test_edit_CTRL_N() 709eb992cb9SBram Moolenaar " Check keyword completion 710a1070eaeSBram Moolenaar for e in ['latin1', 'utf-8'] 711a1070eaeSBram Moolenaar exe 'set encoding=' .. e 712eb992cb9SBram Moolenaar new 713eb992cb9SBram Moolenaar set complete=. 714eb992cb9SBram Moolenaar call setline(1, ['INFER', 'loWER', '', '', ]) 715eb992cb9SBram Moolenaar call cursor(3, 1) 716eb992cb9SBram Moolenaar call feedkeys("Ai\<c-n>\<cr>\<esc>", "tnix") 717eb992cb9SBram Moolenaar call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix') 718a1070eaeSBram Moolenaar call assert_equal(['INFER', 'loWER', 'i', 'LO', '', ''], getline(1, '$'), e) 719eb992cb9SBram Moolenaar %d 720eb992cb9SBram Moolenaar call setline(1, ['INFER', 'loWER', '', '', ]) 721eb992cb9SBram Moolenaar call cursor(3, 1) 722eb992cb9SBram Moolenaar set ignorecase infercase 723eb992cb9SBram Moolenaar call feedkeys("Ii\<c-n>\<cr>\<esc>", "tnix") 724eb992cb9SBram Moolenaar call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix') 725a1070eaeSBram Moolenaar call assert_equal(['INFER', 'loWER', 'infer', 'LOWER', '', ''], getline(1, '$'), e) 726eb992cb9SBram Moolenaar 727eb992cb9SBram Moolenaar set noignorecase noinfercase complete& 728eb992cb9SBram Moolenaar bw! 729a1070eaeSBram Moolenaar endfor 730eb992cb9SBram Moolenaarendfunc 731eb992cb9SBram Moolenaar 7321e115360SBram Moolenaarfunc Test_edit_CTRL_O() 733eb992cb9SBram Moolenaar " Check for CTRL-O in insert mode 734eb992cb9SBram Moolenaar new 735eb992cb9SBram Moolenaar inoreabbr <buffer> h here some more 736eb992cb9SBram Moolenaar call setline(1, ['abc', 'def']) 737eb992cb9SBram Moolenaar call cursor(1, 1) 738eb992cb9SBram Moolenaar " Ctrl-O after an abbreviation 739eb992cb9SBram Moolenaar exe "norm A h\<c-o>:set nu\<cr> text" 740eb992cb9SBram Moolenaar call assert_equal(['abc here some more text', 'def'], getline(1, '$')) 741eb992cb9SBram Moolenaar call assert_true(&nu) 742eb992cb9SBram Moolenaar set nonu 743eb992cb9SBram Moolenaar iunabbr <buffer> h 744eb992cb9SBram Moolenaar " Ctrl-O at end of line with 've'=onemore 745eb992cb9SBram Moolenaar call cursor(1, 1) 746eb992cb9SBram Moolenaar call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix') 747eb992cb9SBram Moolenaar call assert_equal([0, 1, 23, 0], g:a) 748eb992cb9SBram Moolenaar call cursor(1, 1) 749eb992cb9SBram Moolenaar set ve=onemore 750eb992cb9SBram Moolenaar call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix') 751eb992cb9SBram Moolenaar call assert_equal([0, 1, 24, 0], g:a) 752eb992cb9SBram Moolenaar set ve= 753eb992cb9SBram Moolenaar unlet! g:a 754eb992cb9SBram Moolenaar bw! 755eb992cb9SBram Moolenaarendfunc 756eb992cb9SBram Moolenaar 7571e115360SBram Moolenaarfunc Test_edit_CTRL_R() 758eb992cb9SBram Moolenaar " Insert Register 759eb992cb9SBram Moolenaar new 760eb992cb9SBram Moolenaar call test_override("ALL", 1) 761eb992cb9SBram Moolenaar set showcmd 762eb992cb9SBram Moolenaar call feedkeys("AFOOBAR eins zwei\<esc>", 'tnix') 763eb992cb9SBram Moolenaar call feedkeys("O\<c-r>.", 'tnix') 764eb992cb9SBram Moolenaar call feedkeys("O\<c-r>=10*500\<cr>\<esc>", 'tnix') 765eb992cb9SBram Moolenaar call feedkeys("O\<c-r>=getreg('=', 1)\<cr>\<esc>", 'tnix') 766eb992cb9SBram Moolenaar call assert_equal(["getreg('=', 1)", '5000', "FOOBAR eins zwei", "FOOBAR eins zwei"], getline(1, '$')) 767eb992cb9SBram Moolenaar call test_override("ALL", 0) 768eb992cb9SBram Moolenaar set noshowcmd 769eb992cb9SBram Moolenaar bw! 770eb992cb9SBram Moolenaarendfunc 771eb992cb9SBram Moolenaar 7721e115360SBram Moolenaarfunc Test_edit_CTRL_S() 773eb992cb9SBram Moolenaar " Test pressing CTRL-S (basically only spellfile completion) 774eb992cb9SBram Moolenaar " the rest is already covered 775eb992cb9SBram Moolenaar new 776eb992cb9SBram Moolenaar if !has("spell") 777eb992cb9SBram Moolenaar call setline(1, 'vim') 778eb992cb9SBram Moolenaar call feedkeys("A\<c-x>ss\<cr>\<esc>", 'tnix') 779eb992cb9SBram Moolenaar call assert_equal(['vims', ''], getline(1, '$')) 780eb992cb9SBram Moolenaar bw! 781eb992cb9SBram Moolenaar return 782eb992cb9SBram Moolenaar endif 783eb992cb9SBram Moolenaar call setline(1, 'vim') 784eb992cb9SBram Moolenaar " spell option not yet set 785eb992cb9SBram Moolenaar try 786eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix') 787eb992cb9SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E756/ 788eb992cb9SBram Moolenaar call assert_true(1, 'error caught') 789eb992cb9SBram Moolenaar endtry 790eb992cb9SBram Moolenaar call assert_equal(['vim', ''], getline(1, '$')) 791eb992cb9SBram Moolenaar %d 792eb992cb9SBram Moolenaar setl spell spelllang=en 793eb992cb9SBram Moolenaar call setline(1, 'vim') 794eb992cb9SBram Moolenaar call cursor(1, 1) 795eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix') 796eb992cb9SBram Moolenaar call assert_equal(['Vim', ''], getline(1, '$')) 797eb992cb9SBram Moolenaar %d 798eb992cb9SBram Moolenaar call setline(1, 'vim') 799eb992cb9SBram Moolenaar call cursor(1, 1) 800eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-s>\<down>\<cr>\<esc>", 'tnix') 801eb992cb9SBram Moolenaar call assert_equal(['Aim'], getline(1, '$')) 802eb992cb9SBram Moolenaar %d 803eb992cb9SBram Moolenaar call setline(1, 'vim') 804eb992cb9SBram Moolenaar call cursor(1, 1) 805eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix') 806eb992cb9SBram Moolenaar call assert_equal(['vim', ''], getline(1, '$')) 807eb992cb9SBram Moolenaar %d 808eb992cb9SBram Moolenaar " empty buffer 809eb992cb9SBram Moolenaar call cursor(1, 1) 810eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix') 811eb992cb9SBram Moolenaar call assert_equal(['', ''], getline(1, '$')) 812eb992cb9SBram Moolenaar setl nospell 813eb992cb9SBram Moolenaar bw! 814eb992cb9SBram Moolenaarendfunc 815eb992cb9SBram Moolenaar 8161e115360SBram Moolenaarfunc Test_edit_CTRL_T() 817eb992cb9SBram Moolenaar " Check for CTRL-T and CTRL-X CTRL-T in insert mode 818eb992cb9SBram Moolenaar " 1) increase indent 819eb992cb9SBram Moolenaar new 820eb992cb9SBram Moolenaar call setline(1, "abc") 821eb992cb9SBram Moolenaar call cursor(1, 1) 822eb992cb9SBram Moolenaar call feedkeys("A\<c-t>xyz", 'tnix') 823eb992cb9SBram Moolenaar call assert_equal(["\<tab>abcxyz"], getline(1, '$')) 824eb992cb9SBram Moolenaar " 2) also when paste option is set 825eb992cb9SBram Moolenaar set paste 826eb992cb9SBram Moolenaar call setline(1, "abc") 827eb992cb9SBram Moolenaar call cursor(1, 1) 828eb992cb9SBram Moolenaar call feedkeys("A\<c-t>xyz", 'tnix') 829eb992cb9SBram Moolenaar call assert_equal(["\<tab>abcxyz"], getline(1, '$')) 830eb992cb9SBram Moolenaar set nopaste 831eb992cb9SBram Moolenaar " CTRL-X CTRL-T (thesaurus complete) 832eb992cb9SBram Moolenaar call writefile(['angry furious mad enraged'], 'Xthesaurus') 833eb992cb9SBram Moolenaar set thesaurus=Xthesaurus 834eb992cb9SBram Moolenaar call setline(1, 'mad') 835eb992cb9SBram Moolenaar call cursor(1, 1) 836eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-t>\<cr>\<esc>", 'tnix') 837eb992cb9SBram Moolenaar call assert_equal(['mad', ''], getline(1, '$')) 838eb992cb9SBram Moolenaar %d 839eb992cb9SBram Moolenaar call setline(1, 'mad') 840eb992cb9SBram Moolenaar call cursor(1, 1) 841eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix') 842eb992cb9SBram Moolenaar call assert_equal(['angry', ''], getline(1, '$')) 843eb992cb9SBram Moolenaar %d 844eb992cb9SBram Moolenaar call setline(1, 'mad') 845eb992cb9SBram Moolenaar call cursor(1, 1) 846eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<cr>\<esc>", 'tnix') 847eb992cb9SBram Moolenaar call assert_equal(['furious', ''], getline(1, '$')) 848eb992cb9SBram Moolenaar %d 849eb992cb9SBram Moolenaar call setline(1, 'mad') 850eb992cb9SBram Moolenaar call cursor(1, 1) 851eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix') 852eb992cb9SBram Moolenaar call assert_equal(['enraged', ''], getline(1, '$')) 853eb992cb9SBram Moolenaar %d 854eb992cb9SBram Moolenaar call setline(1, 'mad') 855eb992cb9SBram Moolenaar call cursor(1, 1) 856eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix') 857eb992cb9SBram Moolenaar call assert_equal(['mad', ''], getline(1, '$')) 858eb992cb9SBram Moolenaar %d 859eb992cb9SBram Moolenaar call setline(1, 'mad') 860eb992cb9SBram Moolenaar call cursor(1, 1) 861eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix') 862eb992cb9SBram Moolenaar call assert_equal(['mad', ''], getline(1, '$')) 863eb992cb9SBram Moolenaar " Using <c-p> <c-n> when 'complete' is empty 864eb992cb9SBram Moolenaar set complete= 865eb992cb9SBram Moolenaar %d 866eb992cb9SBram Moolenaar call setline(1, 'mad') 867eb992cb9SBram Moolenaar call cursor(1, 1) 868eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix') 869eb992cb9SBram Moolenaar call assert_equal(['angry', ''], getline(1, '$')) 870eb992cb9SBram Moolenaar %d 871eb992cb9SBram Moolenaar call setline(1, 'mad') 872eb992cb9SBram Moolenaar call cursor(1, 1) 873eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-t>\<c-p>\<cr>\<esc>", 'tnix') 874eb992cb9SBram Moolenaar call assert_equal(['mad', ''], getline(1, '$')) 875eb992cb9SBram Moolenaar set complete& 876eb992cb9SBram Moolenaar 877eb992cb9SBram Moolenaar set thesaurus= 878eb992cb9SBram Moolenaar %d 879eb992cb9SBram Moolenaar call setline(1, 'mad') 880eb992cb9SBram Moolenaar call cursor(1, 1) 881eb992cb9SBram Moolenaar let v:testing = 1 882eb992cb9SBram Moolenaar try 883eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-t>\<esc>", 'tnix') 884eb992cb9SBram Moolenaar catch 885eb992cb9SBram Moolenaar " error sleeps 2 seconds, when v:testing is not set 886eb992cb9SBram Moolenaar let v:testing = 0 887eb992cb9SBram Moolenaar endtry 888eb992cb9SBram Moolenaar call assert_equal(['mad'], getline(1, '$')) 889eb992cb9SBram Moolenaar call delete('Xthesaurus') 890eb992cb9SBram Moolenaar bw! 891eb992cb9SBram Moolenaarendfunc 892eb992cb9SBram Moolenaar 893160e994dSYegappan Lakshmanan" Test 'thesaurusfunc' 894160e994dSYegappan Lakshmananfunc MyThesaurus(findstart, base) 895160e994dSYegappan Lakshmanan let mythesaurus = [ 896160e994dSYegappan Lakshmanan \ #{word: "happy", 897160e994dSYegappan Lakshmanan \ synonyms: "cheerful,blissful,flying high,looking good,peppy"}, 898160e994dSYegappan Lakshmanan \ #{word: "kind", 899160e994dSYegappan Lakshmanan \ synonyms: "amiable,bleeding-heart,heart in right place"}] 900160e994dSYegappan Lakshmanan if a:findstart 901160e994dSYegappan Lakshmanan " locate the start of the word 902160e994dSYegappan Lakshmanan let line = getline('.') 903160e994dSYegappan Lakshmanan let start = col('.') - 1 904160e994dSYegappan Lakshmanan while start > 0 && line[start - 1] =~ '\a' 905160e994dSYegappan Lakshmanan let start -= 1 906160e994dSYegappan Lakshmanan endwhile 907160e994dSYegappan Lakshmanan return start 908160e994dSYegappan Lakshmanan else 909160e994dSYegappan Lakshmanan " find strings matching with "a:base" 910160e994dSYegappan Lakshmanan let res = [] 911160e994dSYegappan Lakshmanan for w in mythesaurus 912160e994dSYegappan Lakshmanan if w.word =~ '^' . a:base 913160e994dSYegappan Lakshmanan call add(res, w.word) 914160e994dSYegappan Lakshmanan call extend(res, split(w.synonyms, ",")) 915160e994dSYegappan Lakshmanan endif 916160e994dSYegappan Lakshmanan endfor 917160e994dSYegappan Lakshmanan return res 918160e994dSYegappan Lakshmanan endif 919160e994dSYegappan Lakshmananendfunc 920160e994dSYegappan Lakshmanan 921160e994dSYegappan Lakshmananfunc Test_thesaurus_func() 922160e994dSYegappan Lakshmanan new 923f4d8b76dSBram Moolenaar set thesaurus=notused 924f4d8b76dSBram Moolenaar set thesaurusfunc=NotUsed 925f4d8b76dSBram Moolenaar setlocal thesaurusfunc=MyThesaurus 926160e994dSYegappan Lakshmanan call setline(1, "an ki") 927160e994dSYegappan Lakshmanan call cursor(1, 1) 928160e994dSYegappan Lakshmanan call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix') 929160e994dSYegappan Lakshmanan call assert_equal(['an amiable', ''], getline(1, '$')) 930f4d8b76dSBram Moolenaar 931f4d8b76dSBram Moolenaar setlocal thesaurusfunc=NonExistingFunc 932f4d8b76dSBram Moolenaar call assert_fails("normal $a\<C-X>\<C-T>", 'E117:') 933f4d8b76dSBram Moolenaar 934f4d8b76dSBram Moolenaar setlocal thesaurusfunc= 935160e994dSYegappan Lakshmanan set thesaurusfunc=NonExistingFunc 936160e994dSYegappan Lakshmanan call assert_fails("normal $a\<C-X>\<C-T>", 'E117:') 937160e994dSYegappan Lakshmanan %bw! 938f4d8b76dSBram Moolenaar 939f4d8b76dSBram Moolenaar set thesaurusfunc= 940f4d8b76dSBram Moolenaar set thesaurus= 941160e994dSYegappan Lakshmananendfunc 942160e994dSYegappan Lakshmanan 9431e115360SBram Moolenaarfunc Test_edit_CTRL_U() 944eb992cb9SBram Moolenaar " Test 'completefunc' 945eb992cb9SBram Moolenaar new 946eb992cb9SBram Moolenaar " -1, -2 and -3 are special return values 947eb992cb9SBram Moolenaar let g:special=0 948eb992cb9SBram Moolenaar fun! CompleteMonths(findstart, base) 949eb992cb9SBram Moolenaar if a:findstart 950eb992cb9SBram Moolenaar " locate the start of the word 951eb992cb9SBram Moolenaar return g:special 952eb992cb9SBram Moolenaar else 953eb992cb9SBram Moolenaar " find months matching with "a:base" 954eb992cb9SBram Moolenaar let res = [] 955eb992cb9SBram Moolenaar for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec") 956eb992cb9SBram Moolenaar if m =~ '^\c'.a:base 957eb992cb9SBram Moolenaar call add(res, {'word': m, 'abbr': m.' Month', 'icase': 0}) 958eb992cb9SBram Moolenaar endif 959eb992cb9SBram Moolenaar endfor 960eb992cb9SBram Moolenaar return {'words': res, 'refresh': 'always'} 961eb992cb9SBram Moolenaar endif 962eb992cb9SBram Moolenaar endfun 963eb992cb9SBram Moolenaar set completefunc=CompleteMonths 964eb992cb9SBram Moolenaar call setline(1, ['', '']) 965eb992cb9SBram Moolenaar call cursor(1, 1) 966eb992cb9SBram Moolenaar call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix') 967eb992cb9SBram Moolenaar call assert_equal(['X', '', ''], getline(1, '$')) 968eb992cb9SBram Moolenaar %d 969eb992cb9SBram Moolenaar let g:special=-1 970eb992cb9SBram Moolenaar call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix') 971eb992cb9SBram Moolenaar call assert_equal(['XJan', ''], getline(1, '$')) 972eb992cb9SBram Moolenaar %d 973eb992cb9SBram Moolenaar let g:special=-2 974eb992cb9SBram Moolenaar call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix') 975eb992cb9SBram Moolenaar call assert_equal(['X', ''], getline(1, '$')) 976eb992cb9SBram Moolenaar %d 977eb992cb9SBram Moolenaar let g:special=-3 978eb992cb9SBram Moolenaar call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix') 979eb992cb9SBram Moolenaar call assert_equal(['X', ''], getline(1, '$')) 980eb992cb9SBram Moolenaar %d 981eb992cb9SBram Moolenaar let g:special=0 982eb992cb9SBram Moolenaar call feedkeys("AM\<c-x>\<c-u>\<cr>\<esc>", 'tnix') 983eb992cb9SBram Moolenaar call assert_equal(['Mar', ''], getline(1, '$')) 984eb992cb9SBram Moolenaar %d 985eb992cb9SBram Moolenaar call feedkeys("AM\<c-x>\<c-u>\<c-n>\<cr>\<esc>", 'tnix') 986eb992cb9SBram Moolenaar call assert_equal(['May', ''], getline(1, '$')) 987eb992cb9SBram Moolenaar %d 988eb992cb9SBram Moolenaar call feedkeys("AM\<c-x>\<c-u>\<c-n>\<c-n>\<cr>\<esc>", 'tnix') 989eb992cb9SBram Moolenaar call assert_equal(['M', ''], getline(1, '$')) 990eb992cb9SBram Moolenaar delfu CompleteMonths 991eb992cb9SBram Moolenaar %d 992eb992cb9SBram Moolenaar try 993eb992cb9SBram Moolenaar call feedkeys("A\<c-x>\<c-u>", 'tnix') 994eb992cb9SBram Moolenaar call assert_fails(1, 'unknown completion function') 995eb992cb9SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E117/ 996eb992cb9SBram Moolenaar call assert_true(1, 'E117 error caught') 997eb992cb9SBram Moolenaar endtry 998eb992cb9SBram Moolenaar set completefunc= 999eb992cb9SBram Moolenaar bw! 1000eb992cb9SBram Moolenaarendfunc 1001eb992cb9SBram Moolenaar 1002ff06f283SBram Moolenaarfunc Test_edit_completefunc_delete() 1003ff06f283SBram Moolenaar func CompleteFunc(findstart, base) 1004ff06f283SBram Moolenaar if a:findstart == 1 1005ff06f283SBram Moolenaar return col('.') - 1 1006ff06f283SBram Moolenaar endif 1007ff06f283SBram Moolenaar normal dd 1008ff06f283SBram Moolenaar return ['a', 'b'] 1009ff06f283SBram Moolenaar endfunc 1010ff06f283SBram Moolenaar new 1011ff06f283SBram Moolenaar set completefunc=CompleteFunc 1012ff06f283SBram Moolenaar call setline(1, ['', 'abcd', '']) 1013ff06f283SBram Moolenaar 2d 10146adb9ea0SBram Moolenaar call assert_fails("normal 2G$a\<C-X>\<C-U>", 'E578:') 1015ff06f283SBram Moolenaar bwipe! 1016ff06f283SBram Moolenaarendfunc 1017ff06f283SBram Moolenaar 1018ff06f283SBram Moolenaar 10191e115360SBram Moolenaarfunc Test_edit_CTRL_Z() 1020eb992cb9SBram Moolenaar " Ctrl-Z when insertmode is not set inserts it literally 1021eb992cb9SBram Moolenaar new 1022eb992cb9SBram Moolenaar call setline(1, 'abc') 1023eb992cb9SBram Moolenaar call feedkeys("A\<c-z>\<esc>", 'tnix') 1024eb992cb9SBram Moolenaar call assert_equal(["abc\<c-z>"], getline(1,'$')) 1025eb992cb9SBram Moolenaar bw! 1026eb992cb9SBram Moolenaar " TODO: How to Test Ctrl-Z in insert mode, e.g. suspend? 1027eb992cb9SBram Moolenaarendfunc 1028eb992cb9SBram Moolenaar 10291e115360SBram Moolenaarfunc Test_edit_DROP() 10306d91bcb4SBram Moolenaar CheckFeature dnd 1031eb992cb9SBram Moolenaar new 1032eb992cb9SBram Moolenaar call setline(1, ['abc def ghi']) 1033eb992cb9SBram Moolenaar call cursor(1, 1) 1034eb992cb9SBram Moolenaar try 1035eb992cb9SBram Moolenaar call feedkeys("i\<Drop>\<Esc>", 'tnix') 1036eb992cb9SBram Moolenaar call assert_fails(1, 'Invalid register name') 1037eb992cb9SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E353/ 1038eb992cb9SBram Moolenaar call assert_true(1, 'error caught') 1039eb992cb9SBram Moolenaar endtry 1040eb992cb9SBram Moolenaar bw! 1041eb992cb9SBram Moolenaarendfunc 1042eb992cb9SBram Moolenaar 10431e115360SBram Moolenaarfunc Test_edit_CTRL_V() 10446d91bcb4SBram Moolenaar CheckFeature ebcdic 1045eb992cb9SBram Moolenaar new 1046eb992cb9SBram Moolenaar call setline(1, ['abc']) 1047eb992cb9SBram Moolenaar call cursor(2, 1) 1048eb992cb9SBram Moolenaar " force some redraws 1049eb992cb9SBram Moolenaar set showmode showcmd 1050eb992cb9SBram Moolenaar "call test_override_char_avail(1) 1051eb992cb9SBram Moolenaar call test_override('ALL', 1) 1052eb992cb9SBram Moolenaar call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix') 1053eb992cb9SBram Moolenaar call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$')) 1054eb992cb9SBram Moolenaar 1055eb992cb9SBram Moolenaar if has("rightleft") && exists("+rl") 1056eb992cb9SBram Moolenaar set rl 1057eb992cb9SBram Moolenaar call setline(1, ['abc']) 1058eb992cb9SBram Moolenaar call cursor(2, 1) 1059eb992cb9SBram Moolenaar call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix') 1060eb992cb9SBram Moolenaar call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$')) 1061eb992cb9SBram Moolenaar set norl 1062eb992cb9SBram Moolenaar endif 1063eb992cb9SBram Moolenaar 1064eb992cb9SBram Moolenaar call test_override('ALL', 0) 1065eb992cb9SBram Moolenaar set noshowmode showcmd 1066eb992cb9SBram Moolenaar bw! 1067eb992cb9SBram Moolenaarendfunc 1068eb992cb9SBram Moolenaar 10691e115360SBram Moolenaarfunc Test_edit_F1() 10705a4c3082SBram Moolenaar CheckFeature quickfix 10715a4c3082SBram Moolenaar 1072eb992cb9SBram Moolenaar " Pressing <f1> 1073eb992cb9SBram Moolenaar new 1074eb992cb9SBram Moolenaar call feedkeys(":set im\<cr>\<f1>\<c-l>", 'tnix') 1075eb992cb9SBram Moolenaar set noinsertmode 1076eb992cb9SBram Moolenaar call assert_equal('help', &buftype) 1077eb992cb9SBram Moolenaar bw 1078eb992cb9SBram Moolenaar bw 1079eb992cb9SBram Moolenaarendfunc 1080eb992cb9SBram Moolenaar 10811e115360SBram Moolenaarfunc Test_edit_F21() 1082eb992cb9SBram Moolenaar " Pressing <f21> 1083eb992cb9SBram Moolenaar " sends a netbeans command 10846d91bcb4SBram Moolenaar CheckFeature netbeans_intg 1085eb992cb9SBram Moolenaar new 1086eb992cb9SBram Moolenaar " I have no idea what this is supposed to do :) 1087eb992cb9SBram Moolenaar call feedkeys("A\<F21>\<F1>\<esc>", 'tnix') 1088eb992cb9SBram Moolenaar bw 1089eb992cb9SBram Moolenaarendfunc 1090eb992cb9SBram Moolenaar 10911e115360SBram Moolenaarfunc Test_edit_HOME_END() 1092eb992cb9SBram Moolenaar " Test Home/End Keys 1093eb992cb9SBram Moolenaar new 1094eb992cb9SBram Moolenaar set foldopen+=hor 1095eb992cb9SBram Moolenaar call setline(1, ['abc', 'def']) 1096eb992cb9SBram Moolenaar call cursor(1, 1) 1097eb992cb9SBram Moolenaar call feedkeys("AX\<Home>Y\<esc>", 'tnix') 1098eb992cb9SBram Moolenaar call cursor(2, 1) 1099eb992cb9SBram Moolenaar call feedkeys("iZ\<End>Y\<esc>", 'tnix') 1100eb992cb9SBram Moolenaar call assert_equal(['YabcX', 'ZdefY'], getline(1, '$')) 1101eb992cb9SBram Moolenaar 1102eb992cb9SBram Moolenaar set foldopen-=hor 1103eb992cb9SBram Moolenaar bw! 1104eb992cb9SBram Moolenaarendfunc 1105eb992cb9SBram Moolenaar 11061e115360SBram Moolenaarfunc Test_edit_INS() 1107eb992cb9SBram Moolenaar " Test for Pressing <Insert> 1108eb992cb9SBram Moolenaar new 1109eb992cb9SBram Moolenaar call setline(1, ['abc', 'def']) 1110eb992cb9SBram Moolenaar call cursor(1, 1) 1111eb992cb9SBram Moolenaar call feedkeys("i\<Insert>ZYX>", 'tnix') 1112eb992cb9SBram Moolenaar call assert_equal(['ZYX>', 'def'], getline(1, '$')) 1113eb992cb9SBram Moolenaar call setline(1, ['abc', 'def']) 1114eb992cb9SBram Moolenaar call cursor(1, 1) 1115eb992cb9SBram Moolenaar call feedkeys("i\<Insert>Z\<Insert>YX>", 'tnix') 1116eb992cb9SBram Moolenaar call assert_equal(['ZYX>bc', 'def'], getline(1, '$')) 1117eb992cb9SBram Moolenaar bw! 1118eb992cb9SBram Moolenaarendfunc 1119eb992cb9SBram Moolenaar 11201e115360SBram Moolenaarfunc Test_edit_LEFT_RIGHT() 1121eb992cb9SBram Moolenaar " Left, Shift-Left, Right, Shift-Right 1122eb992cb9SBram Moolenaar new 1123eb992cb9SBram Moolenaar call setline(1, ['abc def ghi', 'ABC DEF GHI', 'ZZZ YYY XXX']) 1124eb992cb9SBram Moolenaar let _ww=&ww 1125eb992cb9SBram Moolenaar set ww= 1126eb992cb9SBram Moolenaar call cursor(2, 1) 1127eb992cb9SBram Moolenaar call feedkeys("i\<left>\<esc>", 'tnix') 1128eb992cb9SBram Moolenaar call assert_equal([0, 2, 1, 0], getpos('.')) 1129eb992cb9SBram Moolenaar " Is this a bug, <s-left> does not respect whichwrap option 1130eb992cb9SBram Moolenaar call feedkeys("i\<s-left>\<esc>", 'tnix') 1131eb992cb9SBram Moolenaar call assert_equal([0, 1, 8, 0], getpos('.')) 1132eb992cb9SBram Moolenaar call feedkeys("i". repeat("\<s-left>", 3). "\<esc>", 'tnix') 1133eb992cb9SBram Moolenaar call assert_equal([0, 1, 1, 0], getpos('.')) 1134eb992cb9SBram Moolenaar call feedkeys("i\<right>\<esc>", 'tnix') 1135eb992cb9SBram Moolenaar call assert_equal([0, 1, 1, 0], getpos('.')) 1136eb992cb9SBram Moolenaar call feedkeys("i\<right>\<right>\<esc>", 'tnix') 1137eb992cb9SBram Moolenaar call assert_equal([0, 1, 2, 0], getpos('.')) 1138eb992cb9SBram Moolenaar call feedkeys("A\<right>\<esc>", 'tnix') 1139eb992cb9SBram Moolenaar call assert_equal([0, 1, 11, 0], getpos('.')) 1140eb992cb9SBram Moolenaar call feedkeys("A\<s-right>\<esc>", 'tnix') 1141eb992cb9SBram Moolenaar call assert_equal([0, 2, 1, 0], getpos('.')) 1142eb992cb9SBram Moolenaar call feedkeys("i\<s-right>\<esc>", 'tnix') 1143eb992cb9SBram Moolenaar call assert_equal([0, 2, 4, 0], getpos('.')) 1144eb992cb9SBram Moolenaar call cursor(3, 11) 1145eb992cb9SBram Moolenaar call feedkeys("A\<right>\<esc>", 'tnix') 1146eb992cb9SBram Moolenaar call feedkeys("A\<s-right>\<esc>", 'tnix') 1147eb992cb9SBram Moolenaar call assert_equal([0, 3, 11, 0], getpos('.')) 1148eb992cb9SBram Moolenaar call cursor(2, 11) 1149eb992cb9SBram Moolenaar " <S-Right> does not respect 'whichwrap' option 1150eb992cb9SBram Moolenaar call feedkeys("A\<s-right>\<esc>", 'tnix') 1151eb992cb9SBram Moolenaar call assert_equal([0, 3, 1, 0], getpos('.')) 1152eb992cb9SBram Moolenaar " Check motion when 'whichwrap' contains cursor keys for insert mode 1153eb992cb9SBram Moolenaar set ww+=[,] 1154eb992cb9SBram Moolenaar call cursor(2, 1) 1155eb992cb9SBram Moolenaar call feedkeys("i\<left>\<esc>", 'tnix') 1156eb992cb9SBram Moolenaar call assert_equal([0, 1, 11, 0], getpos('.')) 1157eb992cb9SBram Moolenaar call cursor(2, 11) 1158eb992cb9SBram Moolenaar call feedkeys("A\<right>\<esc>", 'tnix') 1159eb992cb9SBram Moolenaar call assert_equal([0, 3, 1, 0], getpos('.')) 1160eb992cb9SBram Moolenaar call cursor(2, 11) 1161eb992cb9SBram Moolenaar call feedkeys("A\<s-right>\<esc>", 'tnix') 1162eb992cb9SBram Moolenaar call assert_equal([0, 3, 1, 0], getpos('.')) 1163eb992cb9SBram Moolenaar let &ww = _ww 1164eb992cb9SBram Moolenaar bw! 1165eb992cb9SBram Moolenaarendfunc 1166eb992cb9SBram Moolenaar 11671e115360SBram Moolenaarfunc Test_edit_MOUSE() 1168eb992cb9SBram Moolenaar " This is a simple test, since we not really using the mouse here 11696d91bcb4SBram Moolenaar CheckFeature mouse 1170eb992cb9SBram Moolenaar 10new 1171eb992cb9SBram Moolenaar call setline(1, range(1, 100)) 1172eb992cb9SBram Moolenaar call cursor(1, 1) 1173eb992cb9SBram Moolenaar set mouse=a 1174eb992cb9SBram Moolenaar call feedkeys("A\<ScrollWheelDown>\<esc>", 'tnix') 1175eb992cb9SBram Moolenaar call assert_equal([0, 4, 1, 0], getpos('.')) 1176eb992cb9SBram Moolenaar " This should move by one pageDown, but only moves 1177eb992cb9SBram Moolenaar " by one line when the test is run... 1178eb992cb9SBram Moolenaar call feedkeys("A\<S-ScrollWheelDown>\<esc>", 'tnix') 1179eb992cb9SBram Moolenaar call assert_equal([0, 5, 1, 0], getpos('.')) 1180eb992cb9SBram Moolenaar set nostartofline 1181eb992cb9SBram Moolenaar call feedkeys("A\<C-ScrollWheelDown>\<esc>", 'tnix') 1182eb992cb9SBram Moolenaar call assert_equal([0, 6, 1, 0], getpos('.')) 1183eb992cb9SBram Moolenaar call feedkeys("A\<LeftMouse>\<esc>", 'tnix') 1184eb992cb9SBram Moolenaar call assert_equal([0, 6, 1, 0], getpos('.')) 1185eb992cb9SBram Moolenaar call feedkeys("A\<RightMouse>\<esc>", 'tnix') 1186eb992cb9SBram Moolenaar call assert_equal([0, 6, 1, 0], getpos('.')) 1187eb992cb9SBram Moolenaar call cursor(1, 100) 1188eb992cb9SBram Moolenaar norm! zt 1189eb992cb9SBram Moolenaar " this should move by a screen up, but when the test 1190eb992cb9SBram Moolenaar " is run, it moves up to the top of the buffer... 1191eb992cb9SBram Moolenaar call feedkeys("A\<ScrollWheelUp>\<esc>", 'tnix') 1192eb992cb9SBram Moolenaar call assert_equal([0, 1, 1, 0], getpos('.')) 1193eb992cb9SBram Moolenaar call cursor(1, 30) 1194eb992cb9SBram Moolenaar norm! zt 1195eb992cb9SBram Moolenaar call feedkeys("A\<S-ScrollWheelUp>\<esc>", 'tnix') 1196eb992cb9SBram Moolenaar call assert_equal([0, 1, 1, 0], getpos('.')) 1197eb992cb9SBram Moolenaar call cursor(1, 30) 1198eb992cb9SBram Moolenaar norm! zt 1199eb992cb9SBram Moolenaar call feedkeys("A\<C-ScrollWheelUp>\<esc>", 'tnix') 1200eb992cb9SBram Moolenaar call assert_equal([0, 1, 1, 0], getpos('.')) 1201eb992cb9SBram Moolenaar %d 1202eb992cb9SBram Moolenaar call setline(1, repeat(["12345678901234567890"], 100)) 1203eb992cb9SBram Moolenaar call cursor(2, 1) 1204eb992cb9SBram Moolenaar call feedkeys("A\<ScrollWheelRight>\<esc>", 'tnix') 1205eb992cb9SBram Moolenaar call assert_equal([0, 2, 20, 0], getpos('.')) 1206eb992cb9SBram Moolenaar call feedkeys("A\<ScrollWheelLeft>\<esc>", 'tnix') 1207eb992cb9SBram Moolenaar call assert_equal([0, 2, 20, 0], getpos('.')) 1208eb992cb9SBram Moolenaar call feedkeys("A\<S-ScrollWheelRight>\<esc>", 'tnix') 1209eb992cb9SBram Moolenaar call assert_equal([0, 2, 20, 0], getpos('.')) 1210eb992cb9SBram Moolenaar call feedkeys("A\<S-ScrollWheelLeft>\<esc>", 'tnix') 1211eb992cb9SBram Moolenaar call assert_equal([0, 2, 20, 0], getpos('.')) 1212eb992cb9SBram Moolenaar call feedkeys("A\<C-ScrollWheelRight>\<esc>", 'tnix') 1213eb992cb9SBram Moolenaar call assert_equal([0, 2, 20, 0], getpos('.')) 1214eb992cb9SBram Moolenaar call feedkeys("A\<C-ScrollWheelLeft>\<esc>", 'tnix') 1215eb992cb9SBram Moolenaar call assert_equal([0, 2, 20, 0], getpos('.')) 1216eb992cb9SBram Moolenaar set mouse& startofline 1217eb992cb9SBram Moolenaar bw! 1218eb992cb9SBram Moolenaarendfunc 1219eb992cb9SBram Moolenaar 12201e115360SBram Moolenaarfunc Test_edit_PAGEUP_PAGEDOWN() 1221eb992cb9SBram Moolenaar 10new 1222eb992cb9SBram Moolenaar call setline(1, repeat(['abc def ghi'], 30)) 1223eb992cb9SBram Moolenaar call cursor(1, 1) 1224eb992cb9SBram Moolenaar call feedkeys("i\<PageDown>\<esc>", 'tnix') 1225eb992cb9SBram Moolenaar call assert_equal([0, 9, 1, 0], getpos('.')) 1226eb992cb9SBram Moolenaar call feedkeys("i\<PageDown>\<esc>", 'tnix') 1227eb992cb9SBram Moolenaar call assert_equal([0, 17, 1, 0], getpos('.')) 1228eb992cb9SBram Moolenaar call feedkeys("i\<PageDown>\<esc>", 'tnix') 1229eb992cb9SBram Moolenaar call assert_equal([0, 25, 1, 0], getpos('.')) 1230eb992cb9SBram Moolenaar call feedkeys("i\<PageDown>\<esc>", 'tnix') 1231eb992cb9SBram Moolenaar call assert_equal([0, 30, 1, 0], getpos('.')) 1232eb992cb9SBram Moolenaar call feedkeys("i\<PageDown>\<esc>", 'tnix') 1233eb992cb9SBram Moolenaar call assert_equal([0, 30, 1, 0], getpos('.')) 1234eb992cb9SBram Moolenaar call feedkeys("A\<PageUp>\<esc>", 'tnix') 1235eb992cb9SBram Moolenaar call assert_equal([0, 29, 1, 0], getpos('.')) 1236eb992cb9SBram Moolenaar call feedkeys("A\<PageUp>\<esc>", 'tnix') 1237eb992cb9SBram Moolenaar call assert_equal([0, 21, 1, 0], getpos('.')) 1238eb992cb9SBram Moolenaar call feedkeys("A\<PageUp>\<esc>", 'tnix') 1239eb992cb9SBram Moolenaar call assert_equal([0, 13, 1, 0], getpos('.')) 1240eb992cb9SBram Moolenaar call feedkeys("A\<PageUp>\<esc>", 'tnix') 1241eb992cb9SBram Moolenaar call assert_equal([0, 5, 1, 0], getpos('.')) 1242eb992cb9SBram Moolenaar call feedkeys("A\<PageUp>\<esc>", 'tnix') 1243eb992cb9SBram Moolenaar call assert_equal([0, 5, 11, 0], getpos('.')) 1244eb992cb9SBram Moolenaar " <S-Up> is the same as <PageUp> 1245eb992cb9SBram Moolenaar " <S-Down> is the same as <PageDown> 1246eb992cb9SBram Moolenaar call cursor(1, 1) 1247eb992cb9SBram Moolenaar call feedkeys("i\<S-Down>\<esc>", 'tnix') 1248eb992cb9SBram Moolenaar call assert_equal([0, 9, 1, 0], getpos('.')) 1249eb992cb9SBram Moolenaar call feedkeys("i\<S-Down>\<esc>", 'tnix') 1250eb992cb9SBram Moolenaar call assert_equal([0, 17, 1, 0], getpos('.')) 1251eb992cb9SBram Moolenaar call feedkeys("i\<S-Down>\<esc>", 'tnix') 1252eb992cb9SBram Moolenaar call assert_equal([0, 25, 1, 0], getpos('.')) 1253eb992cb9SBram Moolenaar call feedkeys("i\<S-Down>\<esc>", 'tnix') 1254eb992cb9SBram Moolenaar call assert_equal([0, 30, 1, 0], getpos('.')) 1255eb992cb9SBram Moolenaar call feedkeys("i\<S-Down>\<esc>", 'tnix') 1256eb992cb9SBram Moolenaar call assert_equal([0, 30, 1, 0], getpos('.')) 1257eb992cb9SBram Moolenaar call feedkeys("A\<S-Up>\<esc>", 'tnix') 1258eb992cb9SBram Moolenaar call assert_equal([0, 29, 1, 0], getpos('.')) 1259eb992cb9SBram Moolenaar call feedkeys("A\<S-Up>\<esc>", 'tnix') 1260eb992cb9SBram Moolenaar call assert_equal([0, 21, 1, 0], getpos('.')) 1261eb992cb9SBram Moolenaar call feedkeys("A\<S-Up>\<esc>", 'tnix') 1262eb992cb9SBram Moolenaar call assert_equal([0, 13, 1, 0], getpos('.')) 1263eb992cb9SBram Moolenaar call feedkeys("A\<S-Up>\<esc>", 'tnix') 1264eb992cb9SBram Moolenaar call assert_equal([0, 5, 1, 0], getpos('.')) 1265eb992cb9SBram Moolenaar call feedkeys("A\<S-Up>\<esc>", 'tnix') 1266eb992cb9SBram Moolenaar call assert_equal([0, 5, 11, 0], getpos('.')) 1267eb992cb9SBram Moolenaar set nostartofline 1268eb992cb9SBram Moolenaar call cursor(30, 11) 1269eb992cb9SBram Moolenaar norm! zt 1270eb992cb9SBram Moolenaar call feedkeys("A\<PageUp>\<esc>", 'tnix') 1271eb992cb9SBram Moolenaar call assert_equal([0, 29, 11, 0], getpos('.')) 1272eb992cb9SBram Moolenaar call feedkeys("A\<PageUp>\<esc>", 'tnix') 1273eb992cb9SBram Moolenaar call assert_equal([0, 21, 11, 0], getpos('.')) 1274eb992cb9SBram Moolenaar call feedkeys("A\<PageUp>\<esc>", 'tnix') 1275eb992cb9SBram Moolenaar call assert_equal([0, 13, 11, 0], getpos('.')) 1276eb992cb9SBram Moolenaar call feedkeys("A\<PageUp>\<esc>", 'tnix') 1277eb992cb9SBram Moolenaar call assert_equal([0, 5, 11, 0], getpos('.')) 1278eb992cb9SBram Moolenaar call feedkeys("A\<PageUp>\<esc>", 'tnix') 1279eb992cb9SBram Moolenaar call assert_equal([0, 5, 11, 0], getpos('.')) 1280eb992cb9SBram Moolenaar call cursor(1, 1) 1281eb992cb9SBram Moolenaar call feedkeys("A\<PageDown>\<esc>", 'tnix') 1282eb992cb9SBram Moolenaar call assert_equal([0, 9, 11, 0], getpos('.')) 1283eb992cb9SBram Moolenaar call feedkeys("A\<PageDown>\<esc>", 'tnix') 1284eb992cb9SBram Moolenaar call assert_equal([0, 17, 11, 0], getpos('.')) 1285eb992cb9SBram Moolenaar call feedkeys("A\<PageDown>\<esc>", 'tnix') 1286eb992cb9SBram Moolenaar call assert_equal([0, 25, 11, 0], getpos('.')) 1287eb992cb9SBram Moolenaar call feedkeys("A\<PageDown>\<esc>", 'tnix') 1288eb992cb9SBram Moolenaar call assert_equal([0, 30, 11, 0], getpos('.')) 1289eb992cb9SBram Moolenaar call feedkeys("A\<PageDown>\<esc>", 'tnix') 1290eb992cb9SBram Moolenaar call assert_equal([0, 30, 11, 0], getpos('.')) 1291eb992cb9SBram Moolenaar " <S-Up> is the same as <PageUp> 1292eb992cb9SBram Moolenaar " <S-Down> is the same as <PageDown> 1293eb992cb9SBram Moolenaar call cursor(30, 11) 1294eb992cb9SBram Moolenaar norm! zt 1295eb992cb9SBram Moolenaar call feedkeys("A\<S-Up>\<esc>", 'tnix') 1296eb992cb9SBram Moolenaar call assert_equal([0, 29, 11, 0], getpos('.')) 1297eb992cb9SBram Moolenaar call feedkeys("A\<S-Up>\<esc>", 'tnix') 1298eb992cb9SBram Moolenaar call assert_equal([0, 21, 11, 0], getpos('.')) 1299eb992cb9SBram Moolenaar call feedkeys("A\<S-Up>\<esc>", 'tnix') 1300eb992cb9SBram Moolenaar call assert_equal([0, 13, 11, 0], getpos('.')) 1301eb992cb9SBram Moolenaar call feedkeys("A\<S-Up>\<esc>", 'tnix') 1302eb992cb9SBram Moolenaar call assert_equal([0, 5, 11, 0], getpos('.')) 1303eb992cb9SBram Moolenaar call feedkeys("A\<S-Up>\<esc>", 'tnix') 1304eb992cb9SBram Moolenaar call assert_equal([0, 5, 11, 0], getpos('.')) 1305eb992cb9SBram Moolenaar call cursor(1, 1) 1306eb992cb9SBram Moolenaar call feedkeys("A\<S-Down>\<esc>", 'tnix') 1307eb992cb9SBram Moolenaar call assert_equal([0, 9, 11, 0], getpos('.')) 1308eb992cb9SBram Moolenaar call feedkeys("A\<S-Down>\<esc>", 'tnix') 1309eb992cb9SBram Moolenaar call assert_equal([0, 17, 11, 0], getpos('.')) 1310eb992cb9SBram Moolenaar call feedkeys("A\<S-Down>\<esc>", 'tnix') 1311eb992cb9SBram Moolenaar call assert_equal([0, 25, 11, 0], getpos('.')) 1312eb992cb9SBram Moolenaar call feedkeys("A\<S-Down>\<esc>", 'tnix') 1313eb992cb9SBram Moolenaar call assert_equal([0, 30, 11, 0], getpos('.')) 1314eb992cb9SBram Moolenaar call feedkeys("A\<S-Down>\<esc>", 'tnix') 1315eb992cb9SBram Moolenaar call assert_equal([0, 30, 11, 0], getpos('.')) 1316eb992cb9SBram Moolenaar bw! 1317eb992cb9SBram Moolenaarendfunc 1318eb992cb9SBram Moolenaar 13191e115360SBram Moolenaarfunc Test_edit_forbidden() 1320eb992cb9SBram Moolenaar new 1321eb992cb9SBram Moolenaar " 1) edit in the sandbox is not allowed 1322eb992cb9SBram Moolenaar call setline(1, 'a') 1323eb992cb9SBram Moolenaar com! Sandbox :sandbox call feedkeys("i\<del>\<esc>", 'tnix') 1324eb992cb9SBram Moolenaar call assert_fails(':Sandbox', 'E48:') 1325eb992cb9SBram Moolenaar com! Sandbox :sandbox exe "norm! i\<del>" 1326eb992cb9SBram Moolenaar call assert_fails(':Sandbox', 'E48:') 1327eb992cb9SBram Moolenaar delcom Sandbox 1328eb992cb9SBram Moolenaar call assert_equal(['a'], getline(1,'$')) 1329eb992cb9SBram Moolenaar " 2) edit with textlock set 1330eb992cb9SBram Moolenaar fu! DoIt() 1331eb992cb9SBram Moolenaar call feedkeys("i\<del>\<esc>", 'tnix') 1332eb992cb9SBram Moolenaar endfu 1333eb992cb9SBram Moolenaar au InsertCharPre <buffer> :call DoIt() 1334eb992cb9SBram Moolenaar try 1335eb992cb9SBram Moolenaar call feedkeys("ix\<esc>", 'tnix') 1336eb992cb9SBram Moolenaar call assert_fails(1, 'textlock') 1337ff06f283SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E565/ " catch E565: not allowed here 1338eb992cb9SBram Moolenaar endtry 1339eb992cb9SBram Moolenaar " TODO: Might be a bug: should x really be inserted here 1340eb992cb9SBram Moolenaar call assert_equal(['xa'], getline(1, '$')) 1341eb992cb9SBram Moolenaar delfu DoIt 1342eb992cb9SBram Moolenaar try 1343eb992cb9SBram Moolenaar call feedkeys("ix\<esc>", 'tnix') 1344eb992cb9SBram Moolenaar call assert_fails(1, 'unknown function') 1345eb992cb9SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E117/ " catch E117: unknown function 1346eb992cb9SBram Moolenaar endtry 1347eb992cb9SBram Moolenaar au! InsertCharPre 1348eb992cb9SBram Moolenaar " 3) edit when completion is shown 1349eb992cb9SBram Moolenaar fun! Complete(findstart, base) 1350eb992cb9SBram Moolenaar if a:findstart 1351eb992cb9SBram Moolenaar return col('.') 1352eb992cb9SBram Moolenaar else 1353eb992cb9SBram Moolenaar call feedkeys("i\<del>\<esc>", 'tnix') 1354eb992cb9SBram Moolenaar return [] 1355eb992cb9SBram Moolenaar endif 1356eb992cb9SBram Moolenaar endfun 1357eb992cb9SBram Moolenaar set completefunc=Complete 1358eb992cb9SBram Moolenaar try 1359eb992cb9SBram Moolenaar call feedkeys("i\<c-x>\<c-u>\<esc>", 'tnix') 1360eb992cb9SBram Moolenaar call assert_fails(1, 'change in complete function') 1361ff06f283SBram Moolenaar catch /^Vim\%((\a\+)\)\=:E565/ " catch E565 1362eb992cb9SBram Moolenaar endtry 1363eb992cb9SBram Moolenaar delfu Complete 1364eb992cb9SBram Moolenaar set completefunc= 1365eb992cb9SBram Moolenaar if has("rightleft") && exists("+fkmap") 1366eb992cb9SBram Moolenaar " 4) 'R' when 'fkmap' and 'revins' is set. 1367eb992cb9SBram Moolenaar set revins fkmap 1368eb992cb9SBram Moolenaar try 1369eb992cb9SBram Moolenaar normal Ri 1370eb992cb9SBram Moolenaar call assert_fails(1, "R with 'fkmap' and 'ri' set") 1371eb992cb9SBram Moolenaar catch 1372eb992cb9SBram Moolenaar finally 1373eb992cb9SBram Moolenaar set norevins nofkmap 1374eb992cb9SBram Moolenaar endtry 1375eb992cb9SBram Moolenaar endif 1376eb992cb9SBram Moolenaar bw! 1377eb992cb9SBram Moolenaarendfunc 1378eb992cb9SBram Moolenaar 13791e115360SBram Moolenaarfunc Test_edit_rightleft() 1380eb992cb9SBram Moolenaar " Cursor in rightleft mode moves differently 1381845e0ee5SBram Moolenaar CheckFeature rightleft 1382eb992cb9SBram Moolenaar call NewWindow(10, 20) 1383eb992cb9SBram Moolenaar call setline(1, ['abc', 'def', 'ghi']) 1384eb992cb9SBram Moolenaar call cursor(1, 2) 1385eb992cb9SBram Moolenaar set rightleft 1386eb992cb9SBram Moolenaar " Screen looks as expected 1387eb992cb9SBram Moolenaar let lines = ScreenLines([1, 4], winwidth(0)) 1388eb992cb9SBram Moolenaar let expect = [ 1389eb992cb9SBram Moolenaar \" cba", 1390eb992cb9SBram Moolenaar \" fed", 1391eb992cb9SBram Moolenaar \" ihg", 1392eb992cb9SBram Moolenaar \" ~"] 1393eb992cb9SBram Moolenaar call assert_equal(join(expect, "\n"), join(lines, "\n")) 1394eb992cb9SBram Moolenaar " 2) right moves to the left 1395eb992cb9SBram Moolenaar call feedkeys("i\<right>\<esc>x", 'txin') 1396eb992cb9SBram Moolenaar call assert_equal(['bc', 'def', 'ghi'], getline(1,'$')) 1397eb992cb9SBram Moolenaar call cursor(1, 2) 1398eb992cb9SBram Moolenaar call feedkeys("i\<s-right>\<esc>", 'txin') 1399eb992cb9SBram Moolenaar call cursor(1, 2) 1400eb992cb9SBram Moolenaar call feedkeys("i\<c-right>\<esc>", 'txin') 1401eb992cb9SBram Moolenaar " Screen looks as expected 1402eb992cb9SBram Moolenaar let lines = ScreenLines([1, 4], winwidth(0)) 1403eb992cb9SBram Moolenaar let expect = [ 1404eb992cb9SBram Moolenaar \" cb", 1405eb992cb9SBram Moolenaar \" fed", 1406eb992cb9SBram Moolenaar \" ihg", 1407eb992cb9SBram Moolenaar \" ~"] 1408eb992cb9SBram Moolenaar call assert_equal(join(expect, "\n"), join(lines, "\n")) 1409eb992cb9SBram Moolenaar " 2) left moves to the right 1410eb992cb9SBram Moolenaar call setline(1, ['abc', 'def', 'ghi']) 1411eb992cb9SBram Moolenaar call cursor(1, 2) 1412eb992cb9SBram Moolenaar call feedkeys("i\<left>\<esc>x", 'txin') 1413eb992cb9SBram Moolenaar call assert_equal(['ac', 'def', 'ghi'], getline(1,'$')) 1414eb992cb9SBram Moolenaar call cursor(1, 2) 1415eb992cb9SBram Moolenaar call feedkeys("i\<s-left>\<esc>", 'txin') 1416eb992cb9SBram Moolenaar call cursor(1, 2) 1417eb992cb9SBram Moolenaar call feedkeys("i\<c-left>\<esc>", 'txin') 1418eb992cb9SBram Moolenaar " Screen looks as expected 1419eb992cb9SBram Moolenaar let lines = ScreenLines([1, 4], winwidth(0)) 1420eb992cb9SBram Moolenaar let expect = [ 1421eb992cb9SBram Moolenaar \" ca", 1422eb992cb9SBram Moolenaar \" fed", 1423eb992cb9SBram Moolenaar \" ihg", 1424eb992cb9SBram Moolenaar \" ~"] 1425eb992cb9SBram Moolenaar call assert_equal(join(expect, "\n"), join(lines, "\n")) 1426845e0ee5SBram Moolenaar %d _ 1427845e0ee5SBram Moolenaar call test_override('redraw_flag', 1) 1428845e0ee5SBram Moolenaar call test_override('char_avail', 1) 1429845e0ee5SBram Moolenaar call feedkeys("a\<C-V>x41", "xt") 1430845e0ee5SBram Moolenaar redraw! 1431845e0ee5SBram Moolenaar call assert_equal(repeat(' ', 19) .. 'A', Screenline(1)) 1432845e0ee5SBram Moolenaar call test_override('ALL', 0) 1433eb992cb9SBram Moolenaar set norightleft 1434eb992cb9SBram Moolenaar bw! 1435eb992cb9SBram Moolenaarendfunc 1436658a3a2cSBram Moolenaar 1437658a3a2cSBram Moolenaarfunc Test_edit_complete_very_long_name() 14389b81079dSBram Moolenaar " Long directory names only work on Unix. 14396d91bcb4SBram Moolenaar CheckUnix 144015ecbd6fSBram Moolenaar 144115ecbd6fSBram Moolenaar let dirname = getcwd() . "/Xdir" 144215ecbd6fSBram Moolenaar let longdirname = dirname . repeat('/' . repeat('d', 255), 4) 144315ecbd6fSBram Moolenaar try 144415ecbd6fSBram Moolenaar call mkdir(longdirname, 'p') 144515ecbd6fSBram Moolenaar catch /E739:/ 144615ecbd6fSBram Moolenaar " Long directory name probably not supported. 144715ecbd6fSBram Moolenaar call delete(dirname, 'rf') 144815ecbd6fSBram Moolenaar return 144915ecbd6fSBram Moolenaar endtry 145015ecbd6fSBram Moolenaar 1451f8191c5fSBram Moolenaar " Try to get the Vim window position before setting 'columns', so that we can 1452f8191c5fSBram Moolenaar " move the window back to where it was. 1453ba6ec182SBram Moolenaar let winposx = getwinposx() 1454ba6ec182SBram Moolenaar let winposy = getwinposy() 1455f8191c5fSBram Moolenaar 1456f8191c5fSBram Moolenaar if winposx >= 0 && winposy >= 0 && !has('gui_running') 1457f8191c5fSBram Moolenaar " We did get the window position, but xterm may report the wrong numbers. 1458f8191c5fSBram Moolenaar " Move the window to the reported position and compute any offset. 1459f8191c5fSBram Moolenaar exe 'winpos ' . winposx . ' ' . winposy 1460f8191c5fSBram Moolenaar sleep 100m 1461f8191c5fSBram Moolenaar let x = getwinposx() 1462f8191c5fSBram Moolenaar if x >= 0 1463f8191c5fSBram Moolenaar let winposx += winposx - x 1464f8191c5fSBram Moolenaar endif 1465f8191c5fSBram Moolenaar let y = getwinposy() 1466f8191c5fSBram Moolenaar if y >= 0 1467f8191c5fSBram Moolenaar let winposy += winposy - y 1468f8191c5fSBram Moolenaar endif 1469f8191c5fSBram Moolenaar endif 1470f8191c5fSBram Moolenaar 1471658a3a2cSBram Moolenaar let save_columns = &columns 147215ecbd6fSBram Moolenaar " Need at least about 1100 columns to reproduce the problem. 1473ba6ec182SBram Moolenaar set columns=2000 1474658a3a2cSBram Moolenaar set noswapfile 1475ba6ec182SBram Moolenaar 1476658a3a2cSBram Moolenaar let longfilename = longdirname . '/' . repeat('a', 255) 1477658a3a2cSBram Moolenaar call writefile(['Totum', 'Table'], longfilename) 1478658a3a2cSBram Moolenaar new 1479658a3a2cSBram Moolenaar exe "next Xfile " . longfilename 1480658a3a2cSBram Moolenaar exe "normal iT\<C-N>" 1481658a3a2cSBram Moolenaar 1482658a3a2cSBram Moolenaar bwipe! 1483658a3a2cSBram Moolenaar exe 'bwipe! ' . longfilename 1484658a3a2cSBram Moolenaar call delete(dirname, 'rf') 1485658a3a2cSBram Moolenaar let &columns = save_columns 1486ba6ec182SBram Moolenaar if winposx >= 0 && winposy >= 0 1487ba6ec182SBram Moolenaar exe 'winpos ' . winposx . ' ' . winposy 1488ba6ec182SBram Moolenaar endif 1489658a3a2cSBram Moolenaar set swapfile& 1490658a3a2cSBram Moolenaarendfunc 1491ff930cadSBram Moolenaar 14922c8c681bSBram Moolenaarfunc Test_edit_backtick() 14932c8c681bSBram Moolenaar next a\`b c 14942c8c681bSBram Moolenaar call assert_equal('a`b', expand('%')) 14952c8c681bSBram Moolenaar next 14962c8c681bSBram Moolenaar call assert_equal('c', expand('%')) 14972c8c681bSBram Moolenaar call assert_equal('a\`b c', expand('##')) 14982c8c681bSBram Moolenaarendfunc 14992c8c681bSBram Moolenaar 1500ff930cadSBram Moolenaarfunc Test_edit_quit() 1501ff930cadSBram Moolenaar edit foo.txt 1502ff930cadSBram Moolenaar split 1503ff930cadSBram Moolenaar new 1504ff930cadSBram Moolenaar call setline(1, 'hello') 1505ff930cadSBram Moolenaar 3wincmd w 1506ff930cadSBram Moolenaar redraw! 1507ff930cadSBram Moolenaar call assert_fails('1q', 'E37:') 1508ff930cadSBram Moolenaar bwipe! foo.txt 1509ff930cadSBram Moolenaar only 1510ff930cadSBram Moolenaarendfunc 1511ff930cadSBram Moolenaar 1512adb8fbecSBram Moolenaarfunc Test_edit_alt() 1513adb8fbecSBram Moolenaar " Keeping the cursor line didn't happen when the first line has indent. 1514adb8fbecSBram Moolenaar new 1515adb8fbecSBram Moolenaar call setline(1, [' one', 'two', 'three']) 1516adb8fbecSBram Moolenaar w XAltFile 1517adb8fbecSBram Moolenaar $ 1518adb8fbecSBram Moolenaar call assert_equal(3, line('.')) 1519adb8fbecSBram Moolenaar e Xother 1520adb8fbecSBram Moolenaar e # 1521adb8fbecSBram Moolenaar call assert_equal(3, line('.')) 1522adb8fbecSBram Moolenaar 1523adb8fbecSBram Moolenaar bwipe XAltFile 1524adb8fbecSBram Moolenaar call delete('XAltFile') 1525adb8fbecSBram Moolenaarendfunc 15264dbc2627SBram Moolenaar 1527db93495dSBram Moolenaarfunc Test_edit_InsertLeave() 15284dbc2627SBram Moolenaar new 1529b53e13a9SBram Moolenaar au InsertLeavePre * let g:did_au_pre = 1 15304dbc2627SBram Moolenaar au InsertLeave * let g:did_au = 1 1531b53e13a9SBram Moolenaar let g:did_au_pre = 0 15324dbc2627SBram Moolenaar let g:did_au = 0 15334dbc2627SBram Moolenaar call feedkeys("afoo\<Esc>", 'tx') 1534b53e13a9SBram Moolenaar call assert_equal(1, g:did_au_pre) 15354dbc2627SBram Moolenaar call assert_equal(1, g:did_au) 15364dbc2627SBram Moolenaar call assert_equal('foo', getline(1)) 15374dbc2627SBram Moolenaar 1538b53e13a9SBram Moolenaar let g:did_au_pre = 0 15394dbc2627SBram Moolenaar let g:did_au = 0 15404dbc2627SBram Moolenaar call feedkeys("Sbar\<C-C>", 'tx') 1541b53e13a9SBram Moolenaar call assert_equal(1, g:did_au_pre) 15424dbc2627SBram Moolenaar call assert_equal(0, g:did_au) 15434dbc2627SBram Moolenaar call assert_equal('bar', getline(1)) 15444dbc2627SBram Moolenaar 15454dbc2627SBram Moolenaar inoremap x xx<Esc> 1546b53e13a9SBram Moolenaar let g:did_au_pre = 0 15474dbc2627SBram Moolenaar let g:did_au = 0 15484dbc2627SBram Moolenaar call feedkeys("Saax", 'tx') 1549b53e13a9SBram Moolenaar call assert_equal(1, g:did_au_pre) 15504dbc2627SBram Moolenaar call assert_equal(1, g:did_au) 15514dbc2627SBram Moolenaar call assert_equal('aaxx', getline(1)) 15524dbc2627SBram Moolenaar 15534dbc2627SBram Moolenaar inoremap x xx<C-C> 1554b53e13a9SBram Moolenaar let g:did_au_pre = 0 15554dbc2627SBram Moolenaar let g:did_au = 0 15564dbc2627SBram Moolenaar call feedkeys("Sbbx", 'tx') 1557b53e13a9SBram Moolenaar call assert_equal(1, g:did_au_pre) 15584dbc2627SBram Moolenaar call assert_equal(0, g:did_au) 15594dbc2627SBram Moolenaar call assert_equal('bbxx', getline(1)) 15604dbc2627SBram Moolenaar 15614dbc2627SBram Moolenaar bwipe! 1562b53e13a9SBram Moolenaar au! InsertLeave InsertLeavePre 15634dbc2627SBram Moolenaar iunmap x 15644dbc2627SBram Moolenaarendfunc 1565c6b37db1SBram Moolenaar 1566db93495dSBram Moolenaarfunc Test_edit_InsertLeave_undo() 1567db93495dSBram Moolenaar new XtestUndo 1568db93495dSBram Moolenaar set undofile 1569db93495dSBram Moolenaar au InsertLeave * wall 1570db93495dSBram Moolenaar exe "normal ofoo\<Esc>" 1571db93495dSBram Moolenaar call assert_equal(2, line('$')) 1572db93495dSBram Moolenaar normal u 1573db93495dSBram Moolenaar call assert_equal(1, line('$')) 1574db93495dSBram Moolenaar 1575db93495dSBram Moolenaar bwipe! 1576db93495dSBram Moolenaar au! InsertLeave 1577db93495dSBram Moolenaar call delete('XtestUndo') 1578b340baedSBram Moolenaar call delete(undofile('XtestUndo')) 1579db93495dSBram Moolenaar set undofile& 1580db93495dSBram Moolenaarendfunc 1581db93495dSBram Moolenaar 1582c6b37db1SBram Moolenaar" Test for inserting characters using CTRL-V followed by a number. 1583c6b37db1SBram Moolenaarfunc Test_edit_special_chars() 1584c6b37db1SBram Moolenaar new 1585c6b37db1SBram Moolenaar 1586c6b37db1SBram Moolenaar if has("ebcdic") 1587c6b37db1SBram Moolenaar let t = "o\<C-V>193\<C-V>xc2\<C-V>o303 \<C-V>90a\<C-V>xfg\<C-V>o578\<Esc>" 1588c6b37db1SBram Moolenaar else 1589c6b37db1SBram Moolenaar let t = "o\<C-V>65\<C-V>x42\<C-V>o103 \<C-V>33a\<C-V>xfg\<C-V>o78\<Esc>" 1590c6b37db1SBram Moolenaar endif 1591c6b37db1SBram Moolenaar 1592c6b37db1SBram Moolenaar exe "normal " . t 1593c6b37db1SBram Moolenaar call assert_equal("ABC !a\<C-O>g\<C-G>8", getline(2)) 1594c6b37db1SBram Moolenaar 1595c6b37db1SBram Moolenaar close! 1596c6b37db1SBram Moolenaarendfunc 15978d3b5108SBram Moolenaar 15988d3b5108SBram Moolenaarfunc Test_edit_startinsert() 15998d3b5108SBram Moolenaar new 16008d3b5108SBram Moolenaar set backspace+=start 16018d3b5108SBram Moolenaar call setline(1, 'foobar') 16028d3b5108SBram Moolenaar call feedkeys("A\<C-U>\<Esc>", 'xt') 16038d3b5108SBram Moolenaar call assert_equal('', getline(1)) 16048d3b5108SBram Moolenaar 16058d3b5108SBram Moolenaar call setline(1, 'foobar') 16068d3b5108SBram Moolenaar call feedkeys(":startinsert!\<CR>\<C-U>\<Esc>", 'xt') 16078d3b5108SBram Moolenaar call assert_equal('', getline(1)) 16088d3b5108SBram Moolenaar 16098d3b5108SBram Moolenaar set backspace& 16108d3b5108SBram Moolenaar bwipe! 16118d3b5108SBram Moolenaarendfunc 1612177c9f2fSBram Moolenaar 1613bc2b71d4SBram Moolenaar" Test for :startreplace and :startgreplace 1614bc2b71d4SBram Moolenaarfunc Test_edit_startreplace() 1615bc2b71d4SBram Moolenaar new 1616bc2b71d4SBram Moolenaar call setline(1, 'abc') 1617bc2b71d4SBram Moolenaar call feedkeys("l:startreplace\<CR>xyz\e", 'xt') 1618bc2b71d4SBram Moolenaar call assert_equal('axyz', getline(1)) 1619bc2b71d4SBram Moolenaar call feedkeys("0:startreplace!\<CR>abc\e", 'xt') 1620bc2b71d4SBram Moolenaar call assert_equal('axyzabc', getline(1)) 1621bc2b71d4SBram Moolenaar call setline(1, "a\tb") 1622bc2b71d4SBram Moolenaar call feedkeys("0l:startgreplace\<CR>xyz\e", 'xt') 1623bc2b71d4SBram Moolenaar call assert_equal("axyz\tb", getline(1)) 1624bc2b71d4SBram Moolenaar call feedkeys("0i\<C-R>=execute('startreplace')\<CR>12\e", 'xt') 1625bc2b71d4SBram Moolenaar call assert_equal("12axyz\tb", getline(1)) 1626bc2b71d4SBram Moolenaar close! 1627bc2b71d4SBram Moolenaarendfunc 1628bc2b71d4SBram Moolenaar 1629177c9f2fSBram Moolenaarfunc Test_edit_noesckeys() 1630215ba3b6SBram Moolenaar CheckNotGui 1631177c9f2fSBram Moolenaar new 1632177c9f2fSBram Moolenaar 1633177c9f2fSBram Moolenaar " <Left> moves cursor when 'esckeys' is set 1634177c9f2fSBram Moolenaar exe "set t_kl=\<Esc>OD" 1635177c9f2fSBram Moolenaar set esckeys 1636177c9f2fSBram Moolenaar call feedkeys("axyz\<Esc>ODX", "xt") 1637177c9f2fSBram Moolenaar call assert_equal("xyXz", getline(1)) 1638177c9f2fSBram Moolenaar 1639177c9f2fSBram Moolenaar " <Left> exits Insert mode when 'esckeys' is off 1640177c9f2fSBram Moolenaar set noesckeys 1641177c9f2fSBram Moolenaar call setline(1, '') 1642177c9f2fSBram Moolenaar call feedkeys("axyz\<Esc>ODX", "xt") 1643177c9f2fSBram Moolenaar call assert_equal(["DX", "xyz"], getline(1, 2)) 1644177c9f2fSBram Moolenaar 1645177c9f2fSBram Moolenaar bwipe! 1646177c9f2fSBram Moolenaar set esckeys 1647177c9f2fSBram Moolenaarendfunc 1648bc2b71d4SBram Moolenaar 16491671f448SBram Moolenaar" Test for running an invalid ex command in insert mode using CTRL-O 16501671f448SBram Moolenaarfunc Test_edit_ctrl_o_invalid_cmd() 16511671f448SBram Moolenaar new 16521671f448SBram Moolenaar set showmode showcmd 1653b340baedSBram Moolenaar " Avoid a sleep of 3 seconds. Zero might have side effects. 1654b340baedSBram Moolenaar call test_override('ui_delay', 50) 16551671f448SBram Moolenaar let caught_e492 = 0 16561671f448SBram Moolenaar try 16571671f448SBram Moolenaar call feedkeys("i\<C-O>:invalid\<CR>abc\<Esc>", "xt") 16581671f448SBram Moolenaar catch /E492:/ 16591671f448SBram Moolenaar let caught_e492 = 1 16601671f448SBram Moolenaar endtry 16611671f448SBram Moolenaar call assert_equal(1, caught_e492) 16621671f448SBram Moolenaar call assert_equal('abc', getline(1)) 16631671f448SBram Moolenaar set showmode& showcmd& 1664b340baedSBram Moolenaar call test_override('ui_delay', 0) 16651671f448SBram Moolenaar close! 16661671f448SBram Moolenaarendfunc 16671671f448SBram Moolenaar 1668b340baedSBram Moolenaar" Test for editing a file with a very long name 1669b340baedSBram Moolenaarfunc Test_edit_illegal_filename() 1670b340baedSBram Moolenaar CheckEnglish 1671b340baedSBram Moolenaar new 1672b340baedSBram Moolenaar redir => msg 1673b340baedSBram Moolenaar exe 'edit ' . repeat('f', 5000) 1674b340baedSBram Moolenaar redir END 1675b340baedSBram Moolenaar call assert_match("Illegal file name$", split(msg, "\n")[0]) 1676b340baedSBram Moolenaar close! 1677b340baedSBram Moolenaarendfunc 1678b340baedSBram Moolenaar 1679c8fe645cSBram Moolenaar" Test for editing a directory 1680c8fe645cSBram Moolenaarfunc Test_edit_is_a_directory() 1681c8fe645cSBram Moolenaar CheckEnglish 1682c8fe645cSBram Moolenaar let dirname = getcwd() . "/Xdir" 1683c8fe645cSBram Moolenaar call mkdir(dirname, 'p') 1684c8fe645cSBram Moolenaar 1685c8fe645cSBram Moolenaar new 1686c8fe645cSBram Moolenaar redir => msg 1687c8fe645cSBram Moolenaar exe 'edit' dirname 1688c8fe645cSBram Moolenaar redir END 1689c8fe645cSBram Moolenaar call assert_match("is a directory$", split(msg, "\n")[0]) 1690c8fe645cSBram Moolenaar bwipe! 1691c8fe645cSBram Moolenaar 1692c8fe645cSBram Moolenaar let dirname .= '/' 1693c8fe645cSBram Moolenaar 1694c8fe645cSBram Moolenaar new 1695c8fe645cSBram Moolenaar redir => msg 1696c8fe645cSBram Moolenaar exe 'edit' dirname 1697c8fe645cSBram Moolenaar redir END 1698c8fe645cSBram Moolenaar call assert_match("is a directory$", split(msg, "\n")[0]) 1699c8fe645cSBram Moolenaar bwipe! 1700c8fe645cSBram Moolenaar 1701c8fe645cSBram Moolenaar call delete(dirname, 'rf') 1702c8fe645cSBram Moolenaarendfunc 1703c8fe645cSBram Moolenaar 1704b340baedSBram Moolenaar" Test for editing a file using invalid file encoding 1705b340baedSBram Moolenaarfunc Test_edit_invalid_encoding() 1706b340baedSBram Moolenaar CheckEnglish 1707b340baedSBram Moolenaar call writefile([], 'Xfile') 1708b340baedSBram Moolenaar redir => msg 1709b340baedSBram Moolenaar new ++enc=axbyc Xfile 1710b340baedSBram Moolenaar redir END 1711b340baedSBram Moolenaar call assert_match('\[NOT converted\]', msg) 1712b340baedSBram Moolenaar call delete('Xfile') 1713b340baedSBram Moolenaar close! 1714b340baedSBram Moolenaarendfunc 1715b340baedSBram Moolenaar 1716b340baedSBram Moolenaar" Test for the "charconvert" option 1717b340baedSBram Moolenaarfunc Test_edit_charconvert() 1718b340baedSBram Moolenaar CheckEnglish 1719b340baedSBram Moolenaar call writefile(['one', 'two'], 'Xfile') 1720b340baedSBram Moolenaar 1721b340baedSBram Moolenaar " set 'charconvert' to a non-existing function 1722b340baedSBram Moolenaar set charconvert=NonExitingFunc() 1723b340baedSBram Moolenaar new 1724b340baedSBram Moolenaar let caught_e117 = v:false 1725b340baedSBram Moolenaar try 1726b340baedSBram Moolenaar redir => msg 1727b340baedSBram Moolenaar edit ++enc=axbyc Xfile 1728b340baedSBram Moolenaar catch /E117:/ 1729b340baedSBram Moolenaar let caught_e117 = v:true 1730b340baedSBram Moolenaar finally 1731b340baedSBram Moolenaar redir END 1732b340baedSBram Moolenaar endtry 1733b340baedSBram Moolenaar call assert_true(caught_e117) 1734b340baedSBram Moolenaar call assert_equal(['one', 'two'], getline(1, '$')) 1735b340baedSBram Moolenaar call assert_match("Conversion with 'charconvert' failed", msg) 1736b340baedSBram Moolenaar close! 1737b340baedSBram Moolenaar set charconvert& 1738b340baedSBram Moolenaar 1739b340baedSBram Moolenaar " 'charconvert' function doesn't create a output file 1740b340baedSBram Moolenaar func Cconv1() 1741b340baedSBram Moolenaar endfunc 1742b340baedSBram Moolenaar set charconvert=Cconv1() 1743b340baedSBram Moolenaar new 1744b340baedSBram Moolenaar redir => msg 1745b340baedSBram Moolenaar edit ++enc=axbyc Xfile 1746b340baedSBram Moolenaar redir END 1747b340baedSBram Moolenaar call assert_equal(['one', 'two'], getline(1, '$')) 1748b340baedSBram Moolenaar call assert_match("can't read output of 'charconvert'", msg) 1749b340baedSBram Moolenaar close! 1750b340baedSBram Moolenaar delfunc Cconv1 1751b340baedSBram Moolenaar set charconvert& 1752b340baedSBram Moolenaar 1753b340baedSBram Moolenaar " 'charconvert' function to convert to upper case 1754b340baedSBram Moolenaar func Cconv2() 1755b340baedSBram Moolenaar let data = readfile(v:fname_in) 1756b340baedSBram Moolenaar call map(data, 'toupper(v:val)') 1757b340baedSBram Moolenaar call writefile(data, v:fname_out) 1758b340baedSBram Moolenaar endfunc 1759b340baedSBram Moolenaar set charconvert=Cconv2() 1760b340baedSBram Moolenaar new Xfile 1761b340baedSBram Moolenaar write ++enc=ucase Xfile1 1762b340baedSBram Moolenaar call assert_equal(['ONE', 'TWO'], readfile('Xfile1')) 1763b340baedSBram Moolenaar call delete('Xfile1') 1764b340baedSBram Moolenaar close! 1765b340baedSBram Moolenaar delfunc Cconv2 1766b340baedSBram Moolenaar set charconvert& 1767b340baedSBram Moolenaar 1768b340baedSBram Moolenaar " 'charconvert' function removes the input file 1769b340baedSBram Moolenaar func Cconv3() 1770b340baedSBram Moolenaar call delete(v:fname_in) 1771b340baedSBram Moolenaar endfunc 1772b340baedSBram Moolenaar set charconvert=Cconv3() 1773b340baedSBram Moolenaar new 1774b340baedSBram Moolenaar call assert_fails('edit ++enc=lcase Xfile', 'E202:') 1775b340baedSBram Moolenaar call assert_equal([''], getline(1, '$')) 1776b340baedSBram Moolenaar close! 1777b340baedSBram Moolenaar delfunc Cconv3 1778b340baedSBram Moolenaar set charconvert& 1779b340baedSBram Moolenaar 1780b340baedSBram Moolenaar call delete('Xfile') 1781b340baedSBram Moolenaarendfunc 1782b340baedSBram Moolenaar 1783b340baedSBram Moolenaar" Test for editing a file without read permission 1784b340baedSBram Moolenaarfunc Test_edit_file_no_read_perm() 1785b340baedSBram Moolenaar CheckUnix 178617709e28SBram Moolenaar CheckNotRoot 178717709e28SBram Moolenaar 1788b340baedSBram Moolenaar call writefile(['one', 'two'], 'Xfile') 1789b340baedSBram Moolenaar call setfperm('Xfile', '-w-------') 1790b340baedSBram Moolenaar new 1791b340baedSBram Moolenaar redir => msg 1792b340baedSBram Moolenaar edit Xfile 1793b340baedSBram Moolenaar redir END 1794b340baedSBram Moolenaar call assert_equal(1, &readonly) 1795b340baedSBram Moolenaar call assert_equal([''], getline(1, '$')) 1796b340baedSBram Moolenaar call assert_match('\[Permission Denied\]', msg) 1797b340baedSBram Moolenaar close! 1798b340baedSBram Moolenaar call delete('Xfile') 1799b340baedSBram Moolenaarendfunc 1800b340baedSBram Moolenaar 1801845e0ee5SBram Moolenaar" Pressing escape in 'insertmode' should beep 1802845e0ee5SBram Moolenaarfunc Test_edit_insertmode_esc_beeps() 1803845e0ee5SBram Moolenaar new 1804845e0ee5SBram Moolenaar set insertmode 1805845e0ee5SBram Moolenaar call assert_beeps("call feedkeys(\"one\<Esc>\", 'xt')") 1806845e0ee5SBram Moolenaar set insertmode& 1807845e0ee5SBram Moolenaar " unsupported CTRL-G command should beep in insert mode. 1808845e0ee5SBram Moolenaar call assert_beeps("normal i\<C-G>l") 1809845e0ee5SBram Moolenaar close! 1810845e0ee5SBram Moolenaarendfunc 1811845e0ee5SBram Moolenaar 1812845e0ee5SBram Moolenaar" Test for 'hkmap' and 'hkmapp' 1813845e0ee5SBram Moolenaarfunc Test_edit_hkmap() 1814845e0ee5SBram Moolenaar CheckFeature rightleft 1815845e0ee5SBram Moolenaar if has('win32') && !has('gui') 18166d91bcb4SBram Moolenaar throw 'Skipped: fails on the MS-Windows terminal version' 1817845e0ee5SBram Moolenaar endif 1818845e0ee5SBram Moolenaar new 1819845e0ee5SBram Moolenaar 1820845e0ee5SBram Moolenaar set revins hkmap 1821845e0ee5SBram Moolenaar let str = 'abcdefghijklmnopqrstuvwxyz' 1822845e0ee5SBram Moolenaar let str ..= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 1823845e0ee5SBram Moolenaar let str ..= '`/'',.;' 1824845e0ee5SBram Moolenaar call feedkeys('i' .. str, 'xt') 1825845e0ee5SBram Moolenaar let expected = "óõú,.;" 1826845e0ee5SBram Moolenaar let expected ..= "ZYXWVUTSRQPONMLKJIHGFEDCBA" 1827845e0ee5SBram Moolenaar let expected ..= "æèñ'äåàãø/ôíîöêìçïéòë÷âáðù" 1828845e0ee5SBram Moolenaar call assert_equal(expected, getline(1)) 1829845e0ee5SBram Moolenaar 1830845e0ee5SBram Moolenaar %d 1831845e0ee5SBram Moolenaar set revins hkmap hkmapp 1832845e0ee5SBram Moolenaar let str = 'abcdefghijklmnopqrstuvwxyz' 1833845e0ee5SBram Moolenaar let str ..= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 1834845e0ee5SBram Moolenaar call feedkeys('i' .. str, 'xt') 1835845e0ee5SBram Moolenaar let expected = "õYXWVUTSRQóOïíLKJIHGFEDêBA" 1836845e0ee5SBram Moolenaar let expected ..= "öòXùåèúæø'ôñðîì÷çéäâóǟãëáà" 1837845e0ee5SBram Moolenaar call assert_equal(expected, getline(1)) 1838845e0ee5SBram Moolenaar 1839845e0ee5SBram Moolenaar set revins& hkmap& hkmapp& 1840845e0ee5SBram Moolenaar close! 1841845e0ee5SBram Moolenaarendfunc 1842845e0ee5SBram Moolenaar 1843845e0ee5SBram Moolenaar" Test for 'allowrevins' and using CTRL-_ in insert mode 1844845e0ee5SBram Moolenaarfunc Test_edit_allowrevins() 1845845e0ee5SBram Moolenaar CheckFeature rightleft 1846845e0ee5SBram Moolenaar new 1847845e0ee5SBram Moolenaar set allowrevins 1848845e0ee5SBram Moolenaar call feedkeys("iABC\<C-_>DEF\<C-_>GHI", 'xt') 1849845e0ee5SBram Moolenaar call assert_equal('ABCFEDGHI', getline(1)) 1850845e0ee5SBram Moolenaar set allowrevins& 1851845e0ee5SBram Moolenaar close! 1852845e0ee5SBram Moolenaarendfunc 1853845e0ee5SBram Moolenaar 1854845e0ee5SBram Moolenaar" Test for inserting a register in insert mode using CTRL-R 1855845e0ee5SBram Moolenaarfunc Test_edit_insert_reg() 1856845e0ee5SBram Moolenaar new 1857845e0ee5SBram Moolenaar let g:Line = '' 1858845e0ee5SBram Moolenaar func SaveFirstLine() 1859845e0ee5SBram Moolenaar let g:Line = Screenline(1) 1860845e0ee5SBram Moolenaar return 'r' 1861845e0ee5SBram Moolenaar endfunc 1862845e0ee5SBram Moolenaar inoremap <expr> <buffer> <F2> SaveFirstLine() 1863845e0ee5SBram Moolenaar call test_override('redraw_flag', 1) 1864845e0ee5SBram Moolenaar call test_override('char_avail', 1) 1865845e0ee5SBram Moolenaar let @r = 'sample' 1866845e0ee5SBram Moolenaar call feedkeys("a\<C-R>=SaveFirstLine()\<CR>", "xt") 1867845e0ee5SBram Moolenaar call assert_equal('"', g:Line) 1868845e0ee5SBram Moolenaar call test_override('ALL', 0) 1869845e0ee5SBram Moolenaar close! 1870845e0ee5SBram Moolenaarendfunc 1871845e0ee5SBram Moolenaar 1872845e0ee5SBram Moolenaar" When a character is inserted at the last position of the last line in a 1873845e0ee5SBram Moolenaar" window, the window contents should be scrolled one line up. If the top line 1874845e0ee5SBram Moolenaar" is part of a fold, then the entire fold should be scrolled up. 1875845e0ee5SBram Moolenaarfunc Test_edit_lastline_scroll() 1876845e0ee5SBram Moolenaar new 1877845e0ee5SBram Moolenaar let h = winheight(0) 1878845e0ee5SBram Moolenaar let lines = ['one', 'two', 'three'] 1879845e0ee5SBram Moolenaar let lines += repeat(['vim'], h - 4) 1880845e0ee5SBram Moolenaar call setline(1, lines) 1881845e0ee5SBram Moolenaar call setline(h, repeat('x', winwidth(0) - 1)) 1882845e0ee5SBram Moolenaar call feedkeys("GAx", 'xt') 1883845e0ee5SBram Moolenaar redraw! 1884845e0ee5SBram Moolenaar call assert_equal(h - 1, winline()) 1885845e0ee5SBram Moolenaar call assert_equal(2, line('w0')) 1886845e0ee5SBram Moolenaar 1887845e0ee5SBram Moolenaar " scroll with a fold 1888845e0ee5SBram Moolenaar 1,2fold 1889845e0ee5SBram Moolenaar normal gg 1890845e0ee5SBram Moolenaar call setline(h + 1, repeat('x', winwidth(0) - 1)) 1891845e0ee5SBram Moolenaar call feedkeys("GAx", 'xt') 1892845e0ee5SBram Moolenaar redraw! 1893845e0ee5SBram Moolenaar call assert_equal(h - 1, winline()) 1894845e0ee5SBram Moolenaar call assert_equal(3, line('w0')) 1895845e0ee5SBram Moolenaar 1896845e0ee5SBram Moolenaar close! 1897845e0ee5SBram Moolenaarendfunc 1898845e0ee5SBram Moolenaar 189921cbe175SBram Moolenaarfunc Test_edit_browse() 190021cbe175SBram Moolenaar " in the GUI this opens a file picker, we only test the terminal behavior 190121cbe175SBram Moolenaar CheckNotGui 190221cbe175SBram Moolenaar 190321cbe175SBram Moolenaar " ":browse xxx" checks for the FileExplorer augroup and assumes editing "." 190421cbe175SBram Moolenaar " works then. 190521cbe175SBram Moolenaar augroup FileExplorer 190621cbe175SBram Moolenaar au! 190721cbe175SBram Moolenaar augroup END 190821cbe175SBram Moolenaar 190921cbe175SBram Moolenaar " When the USE_FNAME_CASE is defined this used to cause a crash. 191021cbe175SBram Moolenaar browse enew 191121cbe175SBram Moolenaar bwipe! 191221cbe175SBram Moolenaar 191321cbe175SBram Moolenaar browse split 191421cbe175SBram Moolenaar bwipe! 191521cbe175SBram Moolenaarendfunc 191621cbe175SBram Moolenaar 1917caf73dcfSBram Moolenaarfunc Test_read_invalid() 1918caf73dcfSBram Moolenaar set encoding=latin1 1919caf73dcfSBram Moolenaar " This was not properly checking for going past the end. 1920caf73dcfSBram Moolenaar call assert_fails('r`=', 'E484') 1921caf73dcfSBram Moolenaar set encoding=utf-8 1922caf73dcfSBram Moolenaarendfunc 1923caf73dcfSBram Moolenaar 192459585497SYegappan Lakshmanan" Test for the 'revins' option 192559585497SYegappan Lakshmananfunc Test_edit_revins() 192659585497SYegappan Lakshmanan CheckFeature rightleft 192759585497SYegappan Lakshmanan new 192859585497SYegappan Lakshmanan set revins 192959585497SYegappan Lakshmanan exe "normal! ione\ttwo three" 193059585497SYegappan Lakshmanan call assert_equal("eerht owt\teno", getline(1)) 193159585497SYegappan Lakshmanan call setline(1, "one\ttwo three") 193259585497SYegappan Lakshmanan normal! gg$bi a 193359585497SYegappan Lakshmanan call assert_equal("one\ttwo a three", getline(1)) 193459585497SYegappan Lakshmanan exe "normal! $bi\<BS>\<BS>" 193559585497SYegappan Lakshmanan call assert_equal("one\ttwo a ree", getline(1)) 193659585497SYegappan Lakshmanan exe "normal! 0wi\<C-W>" 193759585497SYegappan Lakshmanan call assert_equal("one\t a ree", getline(1)) 193859585497SYegappan Lakshmanan exe "normal! 0wi\<C-U>" 193959585497SYegappan Lakshmanan call assert_equal("one\t ", getline(1)) 194059585497SYegappan Lakshmanan " newline in insert mode starts at the end of the line 194159585497SYegappan Lakshmanan call setline(1, 'one two three') 194259585497SYegappan Lakshmanan exe "normal! wi\nfour" 194359585497SYegappan Lakshmanan call assert_equal(['one two three', 'ruof'], getline(1, '$')) 194459585497SYegappan Lakshmanan set revins& 194559585497SYegappan Lakshmanan bw! 194659585497SYegappan Lakshmananendfunc 194759585497SYegappan Lakshmanan 194835a9a00aSBram Moolenaar" Test for getting the character of the line below after "p" 194935a9a00aSBram Moolenaarfunc Test_edit_put_CTRL_E() 195035a9a00aSBram Moolenaar set encoding=latin1 195135a9a00aSBram Moolenaar new 195235a9a00aSBram Moolenaar let @" = '' 195335a9a00aSBram Moolenaar sil! norm orggRx 195435a9a00aSBram Moolenaar sil! norm pr 195535a9a00aSBram Moolenaar call assert_equal(['r', 'r'], getline(1, 2)) 195635a9a00aSBram Moolenaar bwipe! 195735a9a00aSBram Moolenaar set encoding=utf-8 195835a9a00aSBram Moolenaarendfunc 195935a9a00aSBram Moolenaar 1960f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=" Test for ModeChanged pattern 1961f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=func Test_mode_changes() 1962f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= let g:index = 0 196325def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= let g:mode_seq = ['n', 'i', 'n', 'v', 'V', 'i', 'ix', 'i', 'ic', 'i', 'n', 'no', 'n', 'V', 'v', 's', 'n'] 1964f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= func! TestMode() 1965f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(g:mode_seq[g:index], get(v:event, "old_mode")) 1966f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(g:mode_seq[g:index + 1], get(v:event, "new_mode")) 1967d85931e6SBram Moolenaar call assert_equal(mode(1), get(v:event, "new_mode")) 1968f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= let g:index += 1 1969f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= endfunc 1970f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= 1971f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= au ModeChanged * :call TestMode() 197225def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= let g:n_to_any = 0 197325def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= au ModeChanged n:* let g:n_to_any += 1 197425def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call feedkeys("i\<esc>vVca\<CR>\<C-X>\<C-L>\<esc>ggdG", 'tnix') 1975f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= 197625def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= let g:V_to_v = 0 197725def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= au ModeChanged V:v let g:V_to_v += 1 197825def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call feedkeys("Vv\<C-G>\<esc>", 'tnix') 197925def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(len(filter(g:mode_seq[1:], {idx, val -> val == 'n'})), g:n_to_any) 198025def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(1, g:V_to_v) 1981d85931e6SBram Moolenaar call assert_equal(len(g:mode_seq) - 1, g:index) 1982f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= 198372d2fa69SBram Moolenaar let g:n_to_i = 0 198472d2fa69SBram Moolenaar au ModeChanged n:i let g:n_to_i += 1 198572d2fa69SBram Moolenaar let g:n_to_niI = 0 198672d2fa69SBram Moolenaar au ModeChanged i:niI let g:n_to_niI += 1 198772d2fa69SBram Moolenaar let g:niI_to_i = 0 198872d2fa69SBram Moolenaar au ModeChanged niI:i let g:niI_to_i += 1 198972d2fa69SBram Moolenaar let g:nany_to_i = 0 199072d2fa69SBram Moolenaar au ModeChanged n*:i let g:nany_to_i += 1 199172d2fa69SBram Moolenaar let g:i_to_n = 0 199272d2fa69SBram Moolenaar au ModeChanged i:n let g:i_to_n += 1 199372d2fa69SBram Moolenaar let g:nori_to_any = 0 199472d2fa69SBram Moolenaar au ModeChanged [ni]:* let g:nori_to_any += 1 199572d2fa69SBram Moolenaar let g:i_to_any = 0 199672d2fa69SBram Moolenaar au ModeChanged i:* let g:i_to_any += 1 1997d85931e6SBram Moolenaar let g:index = 0 1998d85931e6SBram Moolenaar let g:mode_seq = ['n', 'i', 'niI', 'i', 'n'] 1999d85931e6SBram Moolenaar call feedkeys("a\<C-O>l\<esc>", 'tnix') 2000f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(len(g:mode_seq) - 1, g:index) 200172d2fa69SBram Moolenaar call assert_equal(1, g:n_to_i) 200272d2fa69SBram Moolenaar call assert_equal(1, g:n_to_niI) 200372d2fa69SBram Moolenaar call assert_equal(1, g:niI_to_i) 200472d2fa69SBram Moolenaar call assert_equal(2, g:nany_to_i) 200572d2fa69SBram Moolenaar call assert_equal(1, g:i_to_n) 200672d2fa69SBram Moolenaar call assert_equal(2, g:i_to_any) 200772d2fa69SBram Moolenaar call assert_equal(3, g:nori_to_any) 2008f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= 200925def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= if has('terminal') 201025def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= let g:mode_seq += ['c', 'n', 't', 'nt', 'c', 'nt', 'n'] 201125def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call feedkeys(":term\<CR>\<C-W>N:bd!\<CR>", 'tnix') 201225def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(len(g:mode_seq) - 1, g:index) 201325def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(1, g:n_to_i) 201425def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(1, g:n_to_niI) 201525def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(1, g:niI_to_i) 201625def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(2, g:nany_to_i) 201725def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(1, g:i_to_n) 201825def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(2, g:i_to_any) 201925def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= call assert_equal(5, g:nori_to_any) 202025def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= endif 202125def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= 2022f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= au! ModeChanged 2023f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= delfunc TestMode 2024f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= unlet! g:mode_seq 2025f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= unlet! g:index 202625def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= unlet! g:n_to_any 202725def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= unlet! g:V_to_v 202825def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= unlet! g:n_to_i 202925def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= unlet! g:n_to_niI 203025def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= unlet! g:niI_to_i 203125def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= unlet! g:nany_to_i 203225def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= unlet! g:i_to_n 203325def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= unlet! g:nori_to_any 203425def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?= unlet! g:i_to_any 2035f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=endfunc 2036f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?= 20373075a455SBram Moolenaarfunc Test_recursive_ModeChanged() 20383075a455SBram Moolenaar au! ModeChanged * norm 0u 20393075a455SBram Moolenaar sil! norm 2040*a062006bSBram Moolenaar au! ModeChanged 2041*a062006bSBram Moolenaarendfunc 2042*a062006bSBram Moolenaar 2043*a062006bSBram Moolenaarfunc Test_ModeChanged_starts_visual() 2044*a062006bSBram Moolenaar " This was triggering ModeChanged before setting VIsual, causing a crash. 2045*a062006bSBram Moolenaar au! ModeChanged * norm 0u 2046*a062006bSBram Moolenaar sil! norm 2047*a062006bSBram Moolenaar 2048*a062006bSBram Moolenaar au! ModeChanged 20493075a455SBram Moolenaarendfunc 20503075a455SBram Moolenaar 20519cd063e3SDominique Pelle" Test toggling of input method. See :help i_CTRL-^ 20529cd063e3SDominique Pellefunc Test_edit_CTRL_hat() 20539cd063e3SDominique Pelle CheckFeature xim 20548753c1ddSDominique Pelle 20558753c1ddSDominique Pelle " FIXME: test fails with Athena and Motif GUI. 20568753c1ddSDominique Pelle " test also fails when running in the GUI. 20578753c1ddSDominique Pelle CheckFeature gui_gtk 20588753c1ddSDominique Pelle CheckNotGui 20599cd063e3SDominique Pelle 20609cd063e3SDominique Pelle new 20619cd063e3SDominique Pelle 20629cd063e3SDominique Pelle call assert_equal(0, &iminsert) 20639cd063e3SDominique Pelle call feedkeys("i\<C-^>", 'xt') 20649cd063e3SDominique Pelle call assert_equal(2, &iminsert) 20659cd063e3SDominique Pelle call feedkeys("i\<C-^>", 'xt') 20669cd063e3SDominique Pelle call assert_equal(0, &iminsert) 20679cd063e3SDominique Pelle 20689cd063e3SDominique Pelle bwipe! 20699cd063e3SDominique Pelleendfunc 20709cd063e3SDominique Pelle 20719cd063e3SDominique Pelle 2072bc2b71d4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 2073