1" Test for edit functions 2 3if exists("+t_kD") 4 let &t_kD="[3;*~" 5endif 6 7source check.vim 8 9" Needed for testing basic rightleft: Test_edit_rightleft 10source view_util.vim 11 12" Needs to come first until the bug in getchar() is 13" fixed: https://groups.google.com/d/msg/vim_dev/fXL9yme4H4c/bOR-U6_bAQAJ 14func Test_edit_00b() 15 new 16 call setline(1, ['abc ']) 17 inoreabbr <buffer> h here some more 18 call cursor(1, 4) 19 " <c-l> expands the abbreviation and ends insertmode 20 call feedkeys(":set im\<cr> h\<c-l>:set noim\<cr>", 'tix') 21 call assert_equal(['abc here some more '], getline(1,'$')) 22 iunabbr <buffer> h 23 bw! 24endfunc 25 26func Test_edit_01() 27 " set for Travis CI? 28 " set nocp noesckeys 29 new 30 " 1) empty buffer 31 call assert_equal([''], getline(1,'$')) 32 " 2) delete in an empty line 33 call feedkeys("i\<del>\<esc>", 'tnix') 34 call assert_equal([''], getline(1,'$')) 35 %d 36 " 3) delete one character 37 call setline(1, 'a') 38 call feedkeys("i\<del>\<esc>", 'tnix') 39 call assert_equal([''], getline(1,'$')) 40 %d 41 " 4) delete a multibyte character 42 call setline(1, "\u0401") 43 call feedkeys("i\<del>\<esc>", 'tnix') 44 call assert_equal([''], getline(1,'$')) 45 %d 46 " 5.1) delete linebreak with 'bs' option containing eol 47 let _bs=&bs 48 set bs=eol 49 call setline(1, ["abc def", "ghi jkl"]) 50 call cursor(1, 1) 51 call feedkeys("A\<del>\<esc>", 'tnix') 52 call assert_equal(['abc defghi jkl'], getline(1, 2)) 53 %d 54 " 5.2) delete linebreak with backspace option w/out eol 55 set bs= 56 call setline(1, ["abc def", "ghi jkl"]) 57 call cursor(1, 1) 58 call feedkeys("A\<del>\<esc>", 'tnix') 59 call assert_equal(["abc def", "ghi jkl"], getline(1, 2)) 60 let &bs=_bs 61 bw! 62endfunc 63 64func Test_edit_02() 65 " Change cursor position in InsertCharPre command 66 new 67 call setline(1, 'abc') 68 call cursor(1, 1) 69 fu! DoIt(...) 70 call cursor(1, 4) 71 if len(a:000) 72 let v:char=a:1 73 endif 74 endfu 75 au InsertCharPre <buffer> :call DoIt('y') 76 call feedkeys("ix\<esc>", 'tnix') 77 call assert_equal(['abcy'], getline(1, '$')) 78 " Setting <Enter> in InsertCharPre 79 au! InsertCharPre <buffer> :call DoIt("\n") 80 call setline(1, 'abc') 81 call cursor(1, 1) 82 call feedkeys("ix\<esc>", 'tnix') 83 call assert_equal(['abc', ''], getline(1, '$')) 84 %d 85 au! InsertCharPre 86 " Change cursor position in InsertEnter command 87 " 1) when setting v:char, keeps changed cursor position 88 au! InsertEnter <buffer> :call DoIt('y') 89 call setline(1, 'abc') 90 call cursor(1, 1) 91 call feedkeys("ix\<esc>", 'tnix') 92 call assert_equal(['abxc'], getline(1, '$')) 93 " 2) when not setting v:char, restores changed cursor position 94 au! InsertEnter <buffer> :call DoIt() 95 call setline(1, 'abc') 96 call cursor(1, 1) 97 call feedkeys("ix\<esc>", 'tnix') 98 call assert_equal(['xabc'], getline(1, '$')) 99 au! InsertEnter 100 delfu DoIt 101 bw! 102endfunc 103 104func Test_edit_03() 105 " Change cursor after <c-o> command to end of line 106 new 107 call setline(1, 'abc') 108 call cursor(1, 1) 109 call feedkeys("i\<c-o>$y\<esc>", 'tnix') 110 call assert_equal(['abcy'], getline(1, '$')) 111 %d 112 call setline(1, 'abc') 113 call cursor(1, 1) 114 call feedkeys("i\<c-o>80|y\<esc>", 'tnix') 115 call assert_equal(['abcy'], getline(1, '$')) 116 %d 117 call setline(1, 'abc') 118 call feedkeys("Ad\<c-o>:s/$/efg/\<cr>hij", 'tnix') 119 call assert_equal(['hijabcdefg'], getline(1, '$')) 120 bw! 121endfunc 122 123func Test_edit_04() 124 " test for :stopinsert 125 new 126 call setline(1, 'abc') 127 call cursor(1, 1) 128 call feedkeys("i\<c-o>:stopinsert\<cr>$", 'tnix') 129 call feedkeys("aX\<esc>", 'tnix') 130 call assert_equal(['abcX'], getline(1, '$')) 131 %d 132 bw! 133endfunc 134 135func Test_edit_05() 136 " test for folds being opened 137 new 138 call setline(1, ['abcX', 'abcX', 'zzzZ']) 139 call cursor(1, 1) 140 set foldmethod=manual foldopen+=insert 141 " create fold for those two lines 142 norm! Vjzf 143 call feedkeys("$ay\<esc>", 'tnix') 144 call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$')) 145 %d 146 call setline(1, ['abcX', 'abcX', 'zzzZ']) 147 call cursor(1, 1) 148 set foldmethod=manual foldopen-=insert 149 " create fold for those two lines 150 norm! Vjzf 151 call feedkeys("$ay\<esc>", 'tnix') 152 call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$')) 153 %d 154 bw! 155endfunc 156 157func Test_edit_06() 158 " Test in diff mode 159 if !has("diff") || !executable("diff") 160 return 161 endif 162 new 163 call setline(1, ['abc', 'xxx', 'yyy']) 164 vnew 165 call setline(1, ['abc', 'zzz', 'xxx', 'yyy']) 166 wincmd p 167 diffthis 168 wincmd p 169 diffthis 170 wincmd p 171 call cursor(2, 1) 172 norm! zt 173 call feedkeys("Ozzz\<esc>", 'tnix') 174 call assert_equal(['abc', 'zzz', 'xxx', 'yyy'], getline(1,'$')) 175 bw! 176 bw! 177endfunc 178 179func Test_edit_07() 180 " 1) Test with completion <c-l> when popupmenu is visible 181 new 182 call setline(1, 'J') 183 184 func! ListMonths() 185 call complete(col('.')-1, ['January', 'February', 'March', 186 \ 'April', 'May', 'June', 'July', 'August', 'September', 187 \ 'October', 'November', 'December']) 188 return '' 189 endfunc 190 inoremap <buffer> <F5> <C-R>=ListMonths()<CR> 191 192 call feedkeys("A\<f5>\<c-p>". repeat("\<down>", 6)."\<c-l>\<down>\<c-l>\<cr>", 'tx') 193 call assert_equal(['July'], getline(1,'$')) 194 " 1) Test completion when InsertCharPre kicks in 195 %d 196 call setline(1, 'J') 197 fu! DoIt() 198 if v:char=='u' 199 let v:char='an' 200 endif 201 endfu 202 au InsertCharPre <buffer> :call DoIt() 203 call feedkeys("A\<f5>\<c-p>u\<cr>\<c-l>\<cr>", 'tx') 204 call assert_equal(["Jan\<c-l>",''], 1->getline('$')) 205 %d 206 call setline(1, 'J') 207 call feedkeys("A\<f5>\<c-p>u\<down>\<c-l>\<cr>", 'tx') 208 call assert_equal(["January"], 1->getline('$')) 209 210 delfu ListMonths 211 delfu DoIt 212 iunmap <buffer> <f5> 213 bw! 214endfunc 215 216func Test_edit_08() 217 " reset insertmode from i_ctrl-r_= 218 let g:bufnr = bufnr('%') 219 new 220 call setline(1, ['abc']) 221 call cursor(1, 4) 222 call feedkeys(":set im\<cr>ZZZ\<c-r>=setbufvar(g:bufnr,'&im', 0)\<cr>",'tnix') 223 call assert_equal(['abZZZc'], getline(1,'$')) 224 call assert_equal([0, 1, 1, 0], getpos('.')) 225 call assert_false(0, '&im') 226 bw! 227 unlet g:bufnr 228endfunc 229 230func Test_edit_09() 231 " test i_CTRL-\ combinations 232 new 233 call setline(1, ['abc', 'def', 'ghi']) 234 call cursor(1, 1) 235 " 1) CTRL-\ CTLR-N 236 call feedkeys(":set im\<cr>\<c-\>\<c-n>ccABC\<c-l>", 'txin') 237 call assert_equal(['ABC', 'def', 'ghi'], getline(1,'$')) 238 call setline(1, ['ABC', 'def', 'ghi']) 239 " 2) CTRL-\ CTLR-G 240 call feedkeys("j0\<c-\>\<c-g>ZZZ\<cr>\<c-l>", 'txin') 241 call assert_equal(['ABC', 'ZZZ', 'def', 'ghi'], getline(1,'$')) 242 call feedkeys("I\<c-\>\<c-g>YYY\<c-l>", 'txin') 243 call assert_equal(['ABC', 'ZZZ', 'YYYdef', 'ghi'], getline(1,'$')) 244 set noinsertmode 245 " 3) CTRL-\ CTRL-O 246 call setline(1, ['ABC', 'ZZZ', 'def', 'ghi']) 247 call cursor(1, 1) 248 call feedkeys("A\<c-o>ix", 'txin') 249 call assert_equal(['ABxC', 'ZZZ', 'def', 'ghi'], getline(1,'$')) 250 call feedkeys("A\<c-\>\<c-o>ix", 'txin') 251 call assert_equal(['ABxCx', 'ZZZ', 'def', 'ghi'], getline(1,'$')) 252 " 4) CTRL-\ a (should be inserted literally, not special after <c-\> 253 call setline(1, ['ABC', 'ZZZ', 'def', 'ghi']) 254 call cursor(1, 1) 255 call feedkeys("A\<c-\>a", 'txin') 256 call assert_equal(["ABC\<c-\>a", 'ZZZ', 'def', 'ghi'], getline(1, '$')) 257 bw! 258endfunc 259 260func Test_edit_11() 261 " Test that indenting kicks in 262 new 263 set cindent 264 call setline(1, ['{', '', '']) 265 call cursor(2, 1) 266 call feedkeys("i\<c-f>int c;\<esc>", 'tnix') 267 call cursor(3, 1) 268 call feedkeys("\<Insert>/* comment */", 'tnix') 269 call assert_equal(['{', "\<tab>int c;", "/* comment */"], getline(1, '$')) 270 " added changed cindentkeys slightly 271 set cindent cinkeys+=*/ 272 call setline(1, ['{', '', '']) 273 call cursor(2, 1) 274 call feedkeys("i\<c-f>int c;\<esc>", 'tnix') 275 call cursor(3, 1) 276 call feedkeys("i/* comment */", 'tnix') 277 call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */"], getline(1, '$')) 278 set cindent cinkeys+==end 279 call feedkeys("oend\<cr>\<esc>", 'tnix') 280 call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */", "\tend", ''], getline(1, '$')) 281 set cinkeys-==end 282 %d 283 " Use indentexpr instead of cindenting 284 func! Do_Indent() 285 if v:lnum == 3 286 return 3*shiftwidth() 287 else 288 return 2*shiftwidth() 289 endif 290 endfunc 291 setl indentexpr=Do_Indent() indentkeys+=*/ 292 call setline(1, ['{', '', '']) 293 call cursor(2, 1) 294 call feedkeys("i\<c-f>int c;\<esc>", 'tnix') 295 call cursor(3, 1) 296 call feedkeys("i/* comment */", 'tnix') 297 call assert_equal(['{', "\<tab>\<tab>int c;", "\<tab>\<tab>\<tab>/* comment */"], getline(1, '$')) 298 set cinkeys&vim indentkeys&vim 299 set nocindent indentexpr= 300 delfu Do_Indent 301 bw! 302endfunc 303 304func Test_edit_11_indentexpr() 305 " Test that indenting kicks in 306 new 307 " Use indentexpr instead of cindenting 308 func! Do_Indent() 309 let pline=prevnonblank(v:lnum) 310 if empty(getline(v:lnum)) 311 if getline(pline) =~ 'if\|then' 312 return shiftwidth() 313 else 314 return 0 315 endif 316 else 317 return 0 318 endif 319 endfunc 320 setl indentexpr=Do_Indent() indentkeys+=0=then,0=fi 321 call setline(1, ['if [ $this ]']) 322 call cursor(1, 1) 323 call feedkeys("othen\<cr>that\<cr>fi", 'tnix') 324 call assert_equal(['if [ $this ]', "then", "\<tab>that", "fi"], getline(1, '$')) 325 set cinkeys&vim indentkeys&vim 326 set nocindent indentexpr= 327 delfu Do_Indent 328 bw! 329endfunc 330 331func Test_edit_12() 332 " Test changing indent in replace mode 333 new 334 call setline(1, ["\tabc", "\tdef"]) 335 call cursor(2, 4) 336 call feedkeys("R^\<c-d>", 'tnix') 337 call assert_equal(["\tabc", "def"], getline(1, '$')) 338 call assert_equal([0, 2, 2, 0], '.'->getpos()) 339 %d 340 call setline(1, ["\tabc", "\t\tdef"]) 341 call cursor(2, 2) 342 call feedkeys("R^\<c-d>", 'tnix') 343 call assert_equal(["\tabc", "def"], getline(1, '$')) 344 call assert_equal([0, 2, 1, 0], getpos('.')) 345 %d 346 call setline(1, ["\tabc", "\t\tdef"]) 347 call cursor(2, 2) 348 call feedkeys("R\<c-t>", 'tnix') 349 call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) 350 call assert_equal([0, 2, 2, 0], getpos('.')) 351 bw! 352 10vnew 353 call setline(1, ["\tabc", "\t\tdef"]) 354 call cursor(2, 2) 355 call feedkeys("R\<c-t>", 'tnix') 356 call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) 357 call assert_equal([0, 2, 2, 0], getpos('.')) 358 %d 359 set sw=4 360 call setline(1, ["\tabc", "\t\tdef"]) 361 call cursor(2, 2) 362 call feedkeys("R\<c-t>\<c-t>", 'tnix') 363 call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) 364 call assert_equal([0, 2, 2, 0], getpos('.')) 365 %d 366 call setline(1, ["\tabc", "\t\tdef"]) 367 call cursor(2, 2) 368 call feedkeys("R\<c-t>\<c-t>", 'tnix') 369 call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) 370 call assert_equal([0, 2, 2, 0], getpos('.')) 371 set et 372 set sw& et& 373 %d 374 call setline(1, ["\t/*"]) 375 set formatoptions=croql 376 call cursor(1, 3) 377 call feedkeys("A\<cr>\<cr>/", 'tnix') 378 call assert_equal(["\t/*", " *", " */"], getline(1, '$')) 379 set formatoptions& 380 bw! 381endfunc 382 383func Test_edit_13() 384 " Test smartindenting 385 if exists("+smartindent") 386 new 387 set smartindent autoindent 388 call setline(1, ["\tabc"]) 389 call feedkeys("A {\<cr>more\<cr>}\<esc>", 'tnix') 390 call assert_equal(["\tabc {", "\t\tmore", "\t}"], getline(1, '$')) 391 set smartindent& autoindent& 392 bwipe! 393 endif 394 395 " Test autoindent removing indent of blank line. 396 new 397 call setline(1, ' foo bar baz') 398 set autoindent 399 exe "normal 0eea\<CR>\<CR>\<Esc>" 400 call assert_equal(" foo bar", getline(1)) 401 call assert_equal("", getline(2)) 402 call assert_equal(" baz", getline(3)) 403 set autoindent& 404 bwipe! 405endfunc 406 407func Test_edit_CR() 408 " Test for <CR> in insert mode 409 " basically only in quickfix mode ist tested, the rest 410 " has been taken care of by other tests 411 if !has("quickfix") 412 return 413 endif 414 botright new 415 call writefile(range(1, 10), 'Xqflist.txt') 416 call setqflist([{'filename': 'Xqflist.txt', 'lnum': 2}]) 417 copen 418 set modifiable 419 call feedkeys("A\<cr>", 'tnix') 420 call assert_equal('Xqflist.txt', bufname('')) 421 call assert_equal(2, line('.')) 422 cclose 423 botright new 424 call setloclist(0, [{'filename': 'Xqflist.txt', 'lnum': 10}]) 425 lopen 426 set modifiable 427 call feedkeys("A\<cr>", 'tnix') 428 call assert_equal('Xqflist.txt', bufname('')) 429 call assert_equal(10, line('.')) 430 call feedkeys("A\<Enter>", 'tnix') 431 call feedkeys("A\<kEnter>", 'tnix') 432 call feedkeys("A\n", 'tnix') 433 call feedkeys("A\r", 'tnix') 434 call assert_equal(map(range(1, 10), 'string(v:val)') + ['', '', '', ''], getline(1, '$')) 435 bw! 436 lclose 437 call delete('Xqflist.txt') 438endfunc 439 440func Test_edit_CTRL_() 441 " disabled for Windows builds, why? 442 if !has("rightleft") || has("win32") 443 return 444 endif 445 let _encoding=&encoding 446 set encoding=utf-8 447 " Test for CTRL-_ 448 new 449 call setline(1, ['abc']) 450 call cursor(1, 1) 451 call feedkeys("i\<c-_>xyz\<esc>", 'tnix') 452 call assert_equal(["\<C-_>xyzabc"], getline(1, '$')) 453 call assert_false(&revins) 454 set ari 455 call setline(1, ['abc']) 456 call cursor(1, 1) 457 call feedkeys("i\<c-_>xyz\<esc>", 'tnix') 458 call assert_equal(["æèñabc"], getline(1, '$')) 459 call assert_true(&revins) 460 call setline(1, ['abc']) 461 call cursor(1, 1) 462 call feedkeys("i\<c-_>xyz\<esc>", 'tnix') 463 call assert_equal(["xyzabc"], getline(1, '$')) 464 call assert_false(&revins) 465 set noari 466 let &encoding=_encoding 467 bw! 468endfunc 469 470" needs to come first, to have the @. register empty 471func Test_edit_00a_CTRL_A() 472 " Test pressing CTRL-A 473 new 474 call setline(1, repeat([''], 5)) 475 call cursor(1, 1) 476 try 477 call feedkeys("A\<NUL>", 'tnix') 478 catch /^Vim\%((\a\+)\)\=:E29/ 479 call assert_true(1, 'E29 error caught') 480 endtry 481 call cursor(1, 1) 482 call feedkeys("Afoobar \<esc>", 'tnix') 483 call cursor(2, 1) 484 call feedkeys("A\<c-a>more\<esc>", 'tnix') 485 call cursor(3, 1) 486 call feedkeys("A\<NUL>and more\<esc>", 'tnix') 487 call assert_equal(['foobar ', 'foobar more', 'foobar morend more', '', ''], getline(1, '$')) 488 bw! 489endfunc 490 491func Test_edit_CTRL_EY() 492 " Ctrl-E/ Ctrl-Y in insert mode completion to scroll 493 10new 494 call setline(1, range(1, 100)) 495 call cursor(30, 1) 496 norm! z. 497 call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix') 498 call assert_equal(30, winsaveview()['topline']) 499 call assert_equal([0, 30, 2, 0], getpos('.')) 500 call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix') 501 call feedkeys("A\<c-x>".repeat("\<c-y>", 10), 'tnix') 502 call assert_equal(21, winsaveview()['topline']) 503 call assert_equal([0, 30, 2, 0], getpos('.')) 504 bw! 505endfunc 506 507func Test_edit_CTRL_G() 508 new 509 call setline(1, ['foobar', 'foobar', 'foobar']) 510 call cursor(2, 4) 511 call feedkeys("ioooooooo\<c-g>k\<c-r>.\<esc>", 'tnix') 512 call assert_equal(['foooooooooobar', 'foooooooooobar', 'foobar'], getline(1, '$')) 513 call assert_equal([0, 1, 11, 0], getpos('.')) 514 call feedkeys("i\<c-g>k\<esc>", 'tnix') 515 call assert_equal([0, 1, 10, 0], getpos('.')) 516 call cursor(2, 4) 517 call feedkeys("i\<c-g>jzzzz\<esc>", 'tnix') 518 call assert_equal(['foooooooooobar', 'foooooooooobar', 'foozzzzbar'], getline(1, '$')) 519 call assert_equal([0, 3, 7, 0], getpos('.')) 520 call feedkeys("i\<c-g>j\<esc>", 'tnix') 521 call assert_equal([0, 3, 6, 0], getpos('.')) 522 bw! 523endfunc 524 525func Test_edit_CTRL_I() 526 " Tab in completion mode 527 let path=expand("%:p:h") 528 new 529 call setline(1, [path. "/", '']) 530 call feedkeys("Arunt\<c-x>\<c-f>\<tab>\<cr>\<esc>", 'tnix') 531 call assert_match('runtest\.vim', getline(1)) 532 %d 533 call writefile(['one', 'two', 'three'], 'Xinclude.txt') 534 let include='#include Xinclude.txt' 535 call setline(1, [include, '']) 536 call cursor(2, 1) 537 call feedkeys("A\<c-x>\<tab>\<cr>\<esc>", 'tnix') 538 call assert_equal([include, 'one', ''], getline(1, '$')) 539 call feedkeys("2ggC\<c-x>\<tab>\<down>\<cr>\<esc>", 'tnix') 540 call assert_equal([include, 'two', ''], getline(1, '$')) 541 call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<cr>\<esc>", 'tnix') 542 call assert_equal([include, 'three', ''], getline(1, '$')) 543 call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<down>\<cr>\<esc>", 'tnix') 544 call assert_equal([include, '', ''], getline(1, '$')) 545 call delete("Xinclude.txt") 546 bw! 547endfunc 548 549func Test_edit_CTRL_K() 550 " Test pressing CTRL-K (basically only dictionary completion and digraphs 551 " the rest is already covered 552 call writefile(['A', 'AA', 'AAA', 'AAAA'], 'Xdictionary.txt') 553 set dictionary=Xdictionary.txt 554 new 555 call setline(1, 'A') 556 call cursor(1, 1) 557 call feedkeys("A\<c-x>\<c-k>\<cr>\<esc>", 'tnix') 558 call assert_equal(['AA', ''], getline(1, '$')) 559 %d 560 call setline(1, 'A') 561 call cursor(1, 1) 562 call feedkeys("A\<c-x>\<c-k>\<down>\<cr>\<esc>", 'tnix') 563 call assert_equal(['AAA'], getline(1, '$')) 564 %d 565 call setline(1, 'A') 566 call cursor(1, 1) 567 call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<cr>\<esc>", 'tnix') 568 call assert_equal(['AAAA'], getline(1, '$')) 569 %d 570 call setline(1, 'A') 571 call cursor(1, 1) 572 call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<cr>\<esc>", 'tnix') 573 call assert_equal(['A'], getline(1, '$')) 574 %d 575 call setline(1, 'A') 576 call cursor(1, 1) 577 call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<down>\<cr>\<esc>", 'tnix') 578 call assert_equal(['AA'], getline(1, '$')) 579 580 " press an unexpected key after dictionary completion 581 %d 582 call setline(1, 'A') 583 call cursor(1, 1) 584 call feedkeys("A\<c-x>\<c-k>\<c-]>\<cr>\<esc>", 'tnix') 585 call assert_equal(['AA', ''], getline(1, '$')) 586 %d 587 call setline(1, 'A') 588 call cursor(1, 1) 589 call feedkeys("A\<c-x>\<c-k>\<c-s>\<cr>\<esc>", 'tnix') 590 call assert_equal(["AA\<c-s>", ''], getline(1, '$')) 591 %d 592 call setline(1, 'A') 593 call cursor(1, 1) 594 call feedkeys("A\<c-x>\<c-k>\<c-f>\<cr>\<esc>", 'tnix') 595 call assert_equal(["AA\<c-f>", ''], getline(1, '$')) 596 597 set dictionary= 598 %d 599 call setline(1, 'A') 600 call cursor(1, 1) 601 let v:testing = 1 602 try 603 call feedkeys("A\<c-x>\<c-k>\<esc>", 'tnix') 604 catch 605 " error sleeps 2 seconds, when v:testing is not set 606 let v:testing = 0 607 endtry 608 call delete('Xdictionary.txt') 609 610 call test_override("char_avail", 1) 611 set showcmd 612 %d 613 call feedkeys("A\<c-k>a:\<esc>", 'tnix') 614 call assert_equal(['ä'], getline(1, '$')) 615 call test_override("char_avail", 0) 616 set noshowcmd 617 618 bw! 619endfunc 620 621func Test_edit_CTRL_L() 622 " Test Ctrl-X Ctrl-L (line completion) 623 new 624 set complete=. 625 call setline(1, ['one', 'two', 'three', '', '', '', '']) 626 call cursor(4, 1) 627 call feedkeys("A\<c-x>\<c-l>\<esc>", 'tnix') 628 call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) 629 call feedkeys("cct\<c-x>\<c-l>\<c-n>\<esc>", 'tnix') 630 call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) 631 call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<esc>", 'tnix') 632 call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$')) 633 call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix') 634 call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) 635 call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix') 636 call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) 637 call feedkeys("cct\<c-x>\<c-l>\<c-p>\<esc>", 'tnix') 638 call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$')) 639 call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<esc>", 'tnix') 640 call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) 641 call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<c-p>\<esc>", 'tnix') 642 call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) 643 set complete= 644 call cursor(5, 1) 645 call feedkeys("A\<c-x>\<c-l>\<c-p>\<c-n>\<esc>", 'tnix') 646 call assert_equal(['one', 'two', 'three', 'three', "\<c-l>\<c-p>\<c-n>", '', ''], getline(1, '$')) 647 set complete& 648 %d 649 if has("conceal") && has("syntax") 650 call setline(1, ['foo', 'bar', 'foobar']) 651 call test_override("char_avail", 1) 652 set conceallevel=2 concealcursor=n 653 syn on 654 syn match ErrorMsg "^bar" 655 call matchadd("Conceal", 'oo', 10, -1, {'conceal': 'X'}) 656 func! DoIt() 657 let g:change=1 658 endfunc 659 au! TextChangedI <buffer> :call DoIt() 660 661 call cursor(2, 1) 662 call assert_false(exists("g:change")) 663 call feedkeys("A \<esc>", 'tnix') 664 call assert_equal(['foo', 'bar ', 'foobar'], getline(1, '$')) 665 call assert_equal(1, g:change) 666 667 call test_override("char_avail", 0) 668 call clearmatches() 669 syn off 670 au! TextChangedI 671 delfu DoIt 672 unlet! g:change 673 endif 674 bw! 675endfunc 676 677func Test_edit_CTRL_N() 678 " Check keyword completion 679 new 680 set complete=. 681 call setline(1, ['INFER', 'loWER', '', '', ]) 682 call cursor(3, 1) 683 call feedkeys("Ai\<c-n>\<cr>\<esc>", "tnix") 684 call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix') 685 call assert_equal(['INFER', 'loWER', 'i', 'LO', '', ''], getline(1, '$')) 686 %d 687 call setline(1, ['INFER', 'loWER', '', '', ]) 688 call cursor(3, 1) 689 set ignorecase infercase 690 call feedkeys("Ii\<c-n>\<cr>\<esc>", "tnix") 691 call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix') 692 call assert_equal(['INFER', 'loWER', 'infer', 'LOWER', '', ''], getline(1, '$')) 693 694 set noignorecase noinfercase complete& 695 bw! 696endfunc 697 698func Test_edit_CTRL_O() 699 " Check for CTRL-O in insert mode 700 new 701 inoreabbr <buffer> h here some more 702 call setline(1, ['abc', 'def']) 703 call cursor(1, 1) 704 " Ctrl-O after an abbreviation 705 exe "norm A h\<c-o>:set nu\<cr> text" 706 call assert_equal(['abc here some more text', 'def'], getline(1, '$')) 707 call assert_true(&nu) 708 set nonu 709 iunabbr <buffer> h 710 " Ctrl-O at end of line with 've'=onemore 711 call cursor(1, 1) 712 call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix') 713 call assert_equal([0, 1, 23, 0], g:a) 714 call cursor(1, 1) 715 set ve=onemore 716 call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix') 717 call assert_equal([0, 1, 24, 0], g:a) 718 set ve= 719 unlet! g:a 720 bw! 721endfunc 722 723func Test_edit_CTRL_R() 724 " Insert Register 725 new 726 call test_override("ALL", 1) 727 set showcmd 728 call feedkeys("AFOOBAR eins zwei\<esc>", 'tnix') 729 call feedkeys("O\<c-r>.", 'tnix') 730 call feedkeys("O\<c-r>=10*500\<cr>\<esc>", 'tnix') 731 call feedkeys("O\<c-r>=getreg('=', 1)\<cr>\<esc>", 'tnix') 732 call assert_equal(["getreg('=', 1)", '5000', "FOOBAR eins zwei", "FOOBAR eins zwei"], getline(1, '$')) 733 call test_override("ALL", 0) 734 set noshowcmd 735 bw! 736endfunc 737 738func Test_edit_CTRL_S() 739 " Test pressing CTRL-S (basically only spellfile completion) 740 " the rest is already covered 741 new 742 if !has("spell") 743 call setline(1, 'vim') 744 call feedkeys("A\<c-x>ss\<cr>\<esc>", 'tnix') 745 call assert_equal(['vims', ''], getline(1, '$')) 746 bw! 747 return 748 endif 749 call setline(1, 'vim') 750 " spell option not yet set 751 try 752 call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix') 753 catch /^Vim\%((\a\+)\)\=:E756/ 754 call assert_true(1, 'error caught') 755 endtry 756 call assert_equal(['vim', ''], getline(1, '$')) 757 %d 758 setl spell spelllang=en 759 call setline(1, 'vim') 760 call cursor(1, 1) 761 call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix') 762 call assert_equal(['Vim', ''], getline(1, '$')) 763 %d 764 call setline(1, 'vim') 765 call cursor(1, 1) 766 call feedkeys("A\<c-x>\<c-s>\<down>\<cr>\<esc>", 'tnix') 767 call assert_equal(['Aim'], getline(1, '$')) 768 %d 769 call setline(1, 'vim') 770 call cursor(1, 1) 771 call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix') 772 call assert_equal(['vim', ''], getline(1, '$')) 773 %d 774 " empty buffer 775 call cursor(1, 1) 776 call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix') 777 call assert_equal(['', ''], getline(1, '$')) 778 setl nospell 779 bw! 780endfunc 781 782func Test_edit_CTRL_T() 783 " Check for CTRL-T and CTRL-X CTRL-T in insert mode 784 " 1) increase indent 785 new 786 call setline(1, "abc") 787 call cursor(1, 1) 788 call feedkeys("A\<c-t>xyz", 'tnix') 789 call assert_equal(["\<tab>abcxyz"], getline(1, '$')) 790 " 2) also when paste option is set 791 set paste 792 call setline(1, "abc") 793 call cursor(1, 1) 794 call feedkeys("A\<c-t>xyz", 'tnix') 795 call assert_equal(["\<tab>abcxyz"], getline(1, '$')) 796 set nopaste 797 " CTRL-X CTRL-T (thesaurus complete) 798 call writefile(['angry furious mad enraged'], 'Xthesaurus') 799 set thesaurus=Xthesaurus 800 call setline(1, 'mad') 801 call cursor(1, 1) 802 call feedkeys("A\<c-x>\<c-t>\<cr>\<esc>", 'tnix') 803 call assert_equal(['mad', ''], getline(1, '$')) 804 %d 805 call setline(1, 'mad') 806 call cursor(1, 1) 807 call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix') 808 call assert_equal(['angry', ''], getline(1, '$')) 809 %d 810 call setline(1, 'mad') 811 call cursor(1, 1) 812 call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<cr>\<esc>", 'tnix') 813 call assert_equal(['furious', ''], getline(1, '$')) 814 %d 815 call setline(1, 'mad') 816 call cursor(1, 1) 817 call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix') 818 call assert_equal(['enraged', ''], getline(1, '$')) 819 %d 820 call setline(1, 'mad') 821 call cursor(1, 1) 822 call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix') 823 call assert_equal(['mad', ''], getline(1, '$')) 824 %d 825 call setline(1, 'mad') 826 call cursor(1, 1) 827 call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix') 828 call assert_equal(['mad', ''], getline(1, '$')) 829 " Using <c-p> <c-n> when 'complete' is empty 830 set complete= 831 %d 832 call setline(1, 'mad') 833 call cursor(1, 1) 834 call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix') 835 call assert_equal(['angry', ''], getline(1, '$')) 836 %d 837 call setline(1, 'mad') 838 call cursor(1, 1) 839 call feedkeys("A\<c-x>\<c-t>\<c-p>\<cr>\<esc>", 'tnix') 840 call assert_equal(['mad', ''], getline(1, '$')) 841 set complete& 842 843 set thesaurus= 844 %d 845 call setline(1, 'mad') 846 call cursor(1, 1) 847 let v:testing = 1 848 try 849 call feedkeys("A\<c-x>\<c-t>\<esc>", 'tnix') 850 catch 851 " error sleeps 2 seconds, when v:testing is not set 852 let v:testing = 0 853 endtry 854 call assert_equal(['mad'], getline(1, '$')) 855 call delete('Xthesaurus') 856 bw! 857endfunc 858 859func Test_edit_CTRL_U() 860 " Test 'completefunc' 861 new 862 " -1, -2 and -3 are special return values 863 let g:special=0 864 fun! CompleteMonths(findstart, base) 865 if a:findstart 866 " locate the start of the word 867 return g:special 868 else 869 " find months matching with "a:base" 870 let res = [] 871 for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec") 872 if m =~ '^\c'.a:base 873 call add(res, {'word': m, 'abbr': m.' Month', 'icase': 0}) 874 endif 875 endfor 876 return {'words': res, 'refresh': 'always'} 877 endif 878 endfun 879 set completefunc=CompleteMonths 880 call setline(1, ['', '']) 881 call cursor(1, 1) 882 call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix') 883 call assert_equal(['X', '', ''], getline(1, '$')) 884 %d 885 let g:special=-1 886 call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix') 887 call assert_equal(['XJan', ''], getline(1, '$')) 888 %d 889 let g:special=-2 890 call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix') 891 call assert_equal(['X', ''], getline(1, '$')) 892 %d 893 let g:special=-3 894 call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix') 895 call assert_equal(['X', ''], getline(1, '$')) 896 %d 897 let g:special=0 898 call feedkeys("AM\<c-x>\<c-u>\<cr>\<esc>", 'tnix') 899 call assert_equal(['Mar', ''], getline(1, '$')) 900 %d 901 call feedkeys("AM\<c-x>\<c-u>\<c-n>\<cr>\<esc>", 'tnix') 902 call assert_equal(['May', ''], getline(1, '$')) 903 %d 904 call feedkeys("AM\<c-x>\<c-u>\<c-n>\<c-n>\<cr>\<esc>", 'tnix') 905 call assert_equal(['M', ''], getline(1, '$')) 906 delfu CompleteMonths 907 %d 908 try 909 call feedkeys("A\<c-x>\<c-u>", 'tnix') 910 call assert_fails(1, 'unknown completion function') 911 catch /^Vim\%((\a\+)\)\=:E117/ 912 call assert_true(1, 'E117 error caught') 913 endtry 914 set completefunc= 915 bw! 916endfunc 917 918func Test_edit_completefunc_delete() 919 func CompleteFunc(findstart, base) 920 if a:findstart == 1 921 return col('.') - 1 922 endif 923 normal dd 924 return ['a', 'b'] 925 endfunc 926 new 927 set completefunc=CompleteFunc 928 call setline(1, ['', 'abcd', '']) 929 2d 930 call assert_fails("normal 2G$a\<C-X>\<C-U>", 'E565:') 931 bwipe! 932endfunc 933 934 935func Test_edit_CTRL_Z() 936 " Ctrl-Z when insertmode is not set inserts it literally 937 new 938 call setline(1, 'abc') 939 call feedkeys("A\<c-z>\<esc>", 'tnix') 940 call assert_equal(["abc\<c-z>"], getline(1,'$')) 941 bw! 942 " TODO: How to Test Ctrl-Z in insert mode, e.g. suspend? 943endfunc 944 945func Test_edit_DROP() 946 if !has("dnd") 947 return 948 endif 949 new 950 call setline(1, ['abc def ghi']) 951 call cursor(1, 1) 952 try 953 call feedkeys("i\<Drop>\<Esc>", 'tnix') 954 call assert_fails(1, 'Invalid register name') 955 catch /^Vim\%((\a\+)\)\=:E353/ 956 call assert_true(1, 'error caught') 957 endtry 958 bw! 959endfunc 960 961func Test_edit_CTRL_V() 962 if has("ebcdic") 963 return 964 endif 965 new 966 call setline(1, ['abc']) 967 call cursor(2, 1) 968 " force some redraws 969 set showmode showcmd 970 "call test_override_char_avail(1) 971 call test_override('ALL', 1) 972 call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix') 973 call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$')) 974 975 if has("rightleft") && exists("+rl") 976 set rl 977 call setline(1, ['abc']) 978 call cursor(2, 1) 979 call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix') 980 call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$')) 981 set norl 982 endif 983 984 call test_override('ALL', 0) 985 set noshowmode showcmd 986 bw! 987endfunc 988 989func Test_edit_F1() 990 CheckFeature quickfix 991 992 " Pressing <f1> 993 new 994 call feedkeys(":set im\<cr>\<f1>\<c-l>", 'tnix') 995 set noinsertmode 996 call assert_equal('help', &buftype) 997 bw 998 bw 999endfunc 1000 1001func Test_edit_F21() 1002 " Pressing <f21> 1003 " sends a netbeans command 1004 if has("netbeans_intg") 1005 new 1006 " I have no idea what this is supposed to do :) 1007 call feedkeys("A\<F21>\<F1>\<esc>", 'tnix') 1008 bw 1009 endif 1010endfunc 1011 1012func Test_edit_HOME_END() 1013 " Test Home/End Keys 1014 new 1015 set foldopen+=hor 1016 call setline(1, ['abc', 'def']) 1017 call cursor(1, 1) 1018 call feedkeys("AX\<Home>Y\<esc>", 'tnix') 1019 call cursor(2, 1) 1020 call feedkeys("iZ\<End>Y\<esc>", 'tnix') 1021 call assert_equal(['YabcX', 'ZdefY'], getline(1, '$')) 1022 1023 set foldopen-=hor 1024 bw! 1025endfunc 1026 1027func Test_edit_INS() 1028 " Test for Pressing <Insert> 1029 new 1030 call setline(1, ['abc', 'def']) 1031 call cursor(1, 1) 1032 call feedkeys("i\<Insert>ZYX>", 'tnix') 1033 call assert_equal(['ZYX>', 'def'], getline(1, '$')) 1034 call setline(1, ['abc', 'def']) 1035 call cursor(1, 1) 1036 call feedkeys("i\<Insert>Z\<Insert>YX>", 'tnix') 1037 call assert_equal(['ZYX>bc', 'def'], getline(1, '$')) 1038 bw! 1039endfunc 1040 1041func Test_edit_LEFT_RIGHT() 1042 " Left, Shift-Left, Right, Shift-Right 1043 new 1044 call setline(1, ['abc def ghi', 'ABC DEF GHI', 'ZZZ YYY XXX']) 1045 let _ww=&ww 1046 set ww= 1047 call cursor(2, 1) 1048 call feedkeys("i\<left>\<esc>", 'tnix') 1049 call assert_equal([0, 2, 1, 0], getpos('.')) 1050 " Is this a bug, <s-left> does not respect whichwrap option 1051 call feedkeys("i\<s-left>\<esc>", 'tnix') 1052 call assert_equal([0, 1, 8, 0], getpos('.')) 1053 call feedkeys("i". repeat("\<s-left>", 3). "\<esc>", 'tnix') 1054 call assert_equal([0, 1, 1, 0], getpos('.')) 1055 call feedkeys("i\<right>\<esc>", 'tnix') 1056 call assert_equal([0, 1, 1, 0], getpos('.')) 1057 call feedkeys("i\<right>\<right>\<esc>", 'tnix') 1058 call assert_equal([0, 1, 2, 0], getpos('.')) 1059 call feedkeys("A\<right>\<esc>", 'tnix') 1060 call assert_equal([0, 1, 11, 0], getpos('.')) 1061 call feedkeys("A\<s-right>\<esc>", 'tnix') 1062 call assert_equal([0, 2, 1, 0], getpos('.')) 1063 call feedkeys("i\<s-right>\<esc>", 'tnix') 1064 call assert_equal([0, 2, 4, 0], getpos('.')) 1065 call cursor(3, 11) 1066 call feedkeys("A\<right>\<esc>", 'tnix') 1067 call feedkeys("A\<s-right>\<esc>", 'tnix') 1068 call assert_equal([0, 3, 11, 0], getpos('.')) 1069 call cursor(2, 11) 1070 " <S-Right> does not respect 'whichwrap' option 1071 call feedkeys("A\<s-right>\<esc>", 'tnix') 1072 call assert_equal([0, 3, 1, 0], getpos('.')) 1073 " Check motion when 'whichwrap' contains cursor keys for insert mode 1074 set ww+=[,] 1075 call cursor(2, 1) 1076 call feedkeys("i\<left>\<esc>", 'tnix') 1077 call assert_equal([0, 1, 11, 0], getpos('.')) 1078 call cursor(2, 11) 1079 call feedkeys("A\<right>\<esc>", 'tnix') 1080 call assert_equal([0, 3, 1, 0], getpos('.')) 1081 call cursor(2, 11) 1082 call feedkeys("A\<s-right>\<esc>", 'tnix') 1083 call assert_equal([0, 3, 1, 0], getpos('.')) 1084 let &ww = _ww 1085 bw! 1086endfunc 1087 1088func Test_edit_MOUSE() 1089 " This is a simple test, since we not really using the mouse here 1090 if !has("mouse") 1091 return 1092 endif 1093 10new 1094 call setline(1, range(1, 100)) 1095 call cursor(1, 1) 1096 set mouse=a 1097 call feedkeys("A\<ScrollWheelDown>\<esc>", 'tnix') 1098 call assert_equal([0, 4, 1, 0], getpos('.')) 1099 " This should move by one pageDown, but only moves 1100 " by one line when the test is run... 1101 call feedkeys("A\<S-ScrollWheelDown>\<esc>", 'tnix') 1102 call assert_equal([0, 5, 1, 0], getpos('.')) 1103 set nostartofline 1104 call feedkeys("A\<C-ScrollWheelDown>\<esc>", 'tnix') 1105 call assert_equal([0, 6, 1, 0], getpos('.')) 1106 call feedkeys("A\<LeftMouse>\<esc>", 'tnix') 1107 call assert_equal([0, 6, 1, 0], getpos('.')) 1108 call feedkeys("A\<RightMouse>\<esc>", 'tnix') 1109 call assert_equal([0, 6, 1, 0], getpos('.')) 1110 call cursor(1, 100) 1111 norm! zt 1112 " this should move by a screen up, but when the test 1113 " is run, it moves up to the top of the buffer... 1114 call feedkeys("A\<ScrollWheelUp>\<esc>", 'tnix') 1115 call assert_equal([0, 1, 1, 0], getpos('.')) 1116 call cursor(1, 30) 1117 norm! zt 1118 call feedkeys("A\<S-ScrollWheelUp>\<esc>", 'tnix') 1119 call assert_equal([0, 1, 1, 0], getpos('.')) 1120 call cursor(1, 30) 1121 norm! zt 1122 call feedkeys("A\<C-ScrollWheelUp>\<esc>", 'tnix') 1123 call assert_equal([0, 1, 1, 0], getpos('.')) 1124 %d 1125 call setline(1, repeat(["12345678901234567890"], 100)) 1126 call cursor(2, 1) 1127 call feedkeys("A\<ScrollWheelRight>\<esc>", 'tnix') 1128 call assert_equal([0, 2, 20, 0], getpos('.')) 1129 call feedkeys("A\<ScrollWheelLeft>\<esc>", 'tnix') 1130 call assert_equal([0, 2, 20, 0], getpos('.')) 1131 call feedkeys("A\<S-ScrollWheelRight>\<esc>", 'tnix') 1132 call assert_equal([0, 2, 20, 0], getpos('.')) 1133 call feedkeys("A\<S-ScrollWheelLeft>\<esc>", 'tnix') 1134 call assert_equal([0, 2, 20, 0], getpos('.')) 1135 call feedkeys("A\<C-ScrollWheelRight>\<esc>", 'tnix') 1136 call assert_equal([0, 2, 20, 0], getpos('.')) 1137 call feedkeys("A\<C-ScrollWheelLeft>\<esc>", 'tnix') 1138 call assert_equal([0, 2, 20, 0], getpos('.')) 1139 set mouse& startofline 1140 bw! 1141endfunc 1142 1143func Test_edit_PAGEUP_PAGEDOWN() 1144 10new 1145 call setline(1, repeat(['abc def ghi'], 30)) 1146 call cursor(1, 1) 1147 call feedkeys("i\<PageDown>\<esc>", 'tnix') 1148 call assert_equal([0, 9, 1, 0], getpos('.')) 1149 call feedkeys("i\<PageDown>\<esc>", 'tnix') 1150 call assert_equal([0, 17, 1, 0], getpos('.')) 1151 call feedkeys("i\<PageDown>\<esc>", 'tnix') 1152 call assert_equal([0, 25, 1, 0], getpos('.')) 1153 call feedkeys("i\<PageDown>\<esc>", 'tnix') 1154 call assert_equal([0, 30, 1, 0], getpos('.')) 1155 call feedkeys("i\<PageDown>\<esc>", 'tnix') 1156 call assert_equal([0, 30, 1, 0], getpos('.')) 1157 call feedkeys("A\<PageUp>\<esc>", 'tnix') 1158 call assert_equal([0, 29, 1, 0], getpos('.')) 1159 call feedkeys("A\<PageUp>\<esc>", 'tnix') 1160 call assert_equal([0, 21, 1, 0], getpos('.')) 1161 call feedkeys("A\<PageUp>\<esc>", 'tnix') 1162 call assert_equal([0, 13, 1, 0], getpos('.')) 1163 call feedkeys("A\<PageUp>\<esc>", 'tnix') 1164 call assert_equal([0, 5, 1, 0], getpos('.')) 1165 call feedkeys("A\<PageUp>\<esc>", 'tnix') 1166 call assert_equal([0, 5, 11, 0], getpos('.')) 1167 " <S-Up> is the same as <PageUp> 1168 " <S-Down> is the same as <PageDown> 1169 call cursor(1, 1) 1170 call feedkeys("i\<S-Down>\<esc>", 'tnix') 1171 call assert_equal([0, 9, 1, 0], getpos('.')) 1172 call feedkeys("i\<S-Down>\<esc>", 'tnix') 1173 call assert_equal([0, 17, 1, 0], getpos('.')) 1174 call feedkeys("i\<S-Down>\<esc>", 'tnix') 1175 call assert_equal([0, 25, 1, 0], getpos('.')) 1176 call feedkeys("i\<S-Down>\<esc>", 'tnix') 1177 call assert_equal([0, 30, 1, 0], getpos('.')) 1178 call feedkeys("i\<S-Down>\<esc>", 'tnix') 1179 call assert_equal([0, 30, 1, 0], getpos('.')) 1180 call feedkeys("A\<S-Up>\<esc>", 'tnix') 1181 call assert_equal([0, 29, 1, 0], getpos('.')) 1182 call feedkeys("A\<S-Up>\<esc>", 'tnix') 1183 call assert_equal([0, 21, 1, 0], getpos('.')) 1184 call feedkeys("A\<S-Up>\<esc>", 'tnix') 1185 call assert_equal([0, 13, 1, 0], getpos('.')) 1186 call feedkeys("A\<S-Up>\<esc>", 'tnix') 1187 call assert_equal([0, 5, 1, 0], getpos('.')) 1188 call feedkeys("A\<S-Up>\<esc>", 'tnix') 1189 call assert_equal([0, 5, 11, 0], getpos('.')) 1190 set nostartofline 1191 call cursor(30, 11) 1192 norm! zt 1193 call feedkeys("A\<PageUp>\<esc>", 'tnix') 1194 call assert_equal([0, 29, 11, 0], getpos('.')) 1195 call feedkeys("A\<PageUp>\<esc>", 'tnix') 1196 call assert_equal([0, 21, 11, 0], getpos('.')) 1197 call feedkeys("A\<PageUp>\<esc>", 'tnix') 1198 call assert_equal([0, 13, 11, 0], getpos('.')) 1199 call feedkeys("A\<PageUp>\<esc>", 'tnix') 1200 call assert_equal([0, 5, 11, 0], getpos('.')) 1201 call feedkeys("A\<PageUp>\<esc>", 'tnix') 1202 call assert_equal([0, 5, 11, 0], getpos('.')) 1203 call cursor(1, 1) 1204 call feedkeys("A\<PageDown>\<esc>", 'tnix') 1205 call assert_equal([0, 9, 11, 0], getpos('.')) 1206 call feedkeys("A\<PageDown>\<esc>", 'tnix') 1207 call assert_equal([0, 17, 11, 0], getpos('.')) 1208 call feedkeys("A\<PageDown>\<esc>", 'tnix') 1209 call assert_equal([0, 25, 11, 0], getpos('.')) 1210 call feedkeys("A\<PageDown>\<esc>", 'tnix') 1211 call assert_equal([0, 30, 11, 0], getpos('.')) 1212 call feedkeys("A\<PageDown>\<esc>", 'tnix') 1213 call assert_equal([0, 30, 11, 0], getpos('.')) 1214 " <S-Up> is the same as <PageUp> 1215 " <S-Down> is the same as <PageDown> 1216 call cursor(30, 11) 1217 norm! zt 1218 call feedkeys("A\<S-Up>\<esc>", 'tnix') 1219 call assert_equal([0, 29, 11, 0], getpos('.')) 1220 call feedkeys("A\<S-Up>\<esc>", 'tnix') 1221 call assert_equal([0, 21, 11, 0], getpos('.')) 1222 call feedkeys("A\<S-Up>\<esc>", 'tnix') 1223 call assert_equal([0, 13, 11, 0], getpos('.')) 1224 call feedkeys("A\<S-Up>\<esc>", 'tnix') 1225 call assert_equal([0, 5, 11, 0], getpos('.')) 1226 call feedkeys("A\<S-Up>\<esc>", 'tnix') 1227 call assert_equal([0, 5, 11, 0], getpos('.')) 1228 call cursor(1, 1) 1229 call feedkeys("A\<S-Down>\<esc>", 'tnix') 1230 call assert_equal([0, 9, 11, 0], getpos('.')) 1231 call feedkeys("A\<S-Down>\<esc>", 'tnix') 1232 call assert_equal([0, 17, 11, 0], getpos('.')) 1233 call feedkeys("A\<S-Down>\<esc>", 'tnix') 1234 call assert_equal([0, 25, 11, 0], getpos('.')) 1235 call feedkeys("A\<S-Down>\<esc>", 'tnix') 1236 call assert_equal([0, 30, 11, 0], getpos('.')) 1237 call feedkeys("A\<S-Down>\<esc>", 'tnix') 1238 call assert_equal([0, 30, 11, 0], getpos('.')) 1239 bw! 1240endfunc 1241 1242func Test_edit_forbidden() 1243 new 1244 " 1) edit in the sandbox is not allowed 1245 call setline(1, 'a') 1246 com! Sandbox :sandbox call feedkeys("i\<del>\<esc>", 'tnix') 1247 call assert_fails(':Sandbox', 'E48:') 1248 com! Sandbox :sandbox exe "norm! i\<del>" 1249 call assert_fails(':Sandbox', 'E48:') 1250 delcom Sandbox 1251 call assert_equal(['a'], getline(1,'$')) 1252 " 2) edit with textlock set 1253 fu! DoIt() 1254 call feedkeys("i\<del>\<esc>", 'tnix') 1255 endfu 1256 au InsertCharPre <buffer> :call DoIt() 1257 try 1258 call feedkeys("ix\<esc>", 'tnix') 1259 call assert_fails(1, 'textlock') 1260 catch /^Vim\%((\a\+)\)\=:E565/ " catch E565: not allowed here 1261 endtry 1262 " TODO: Might be a bug: should x really be inserted here 1263 call assert_equal(['xa'], getline(1, '$')) 1264 delfu DoIt 1265 try 1266 call feedkeys("ix\<esc>", 'tnix') 1267 call assert_fails(1, 'unknown function') 1268 catch /^Vim\%((\a\+)\)\=:E117/ " catch E117: unknown function 1269 endtry 1270 au! InsertCharPre 1271 " 3) edit when completion is shown 1272 fun! Complete(findstart, base) 1273 if a:findstart 1274 return col('.') 1275 else 1276 call feedkeys("i\<del>\<esc>", 'tnix') 1277 return [] 1278 endif 1279 endfun 1280 set completefunc=Complete 1281 try 1282 call feedkeys("i\<c-x>\<c-u>\<esc>", 'tnix') 1283 call assert_fails(1, 'change in complete function') 1284 catch /^Vim\%((\a\+)\)\=:E565/ " catch E565 1285 endtry 1286 delfu Complete 1287 set completefunc= 1288 if has("rightleft") && exists("+fkmap") 1289 " 4) 'R' when 'fkmap' and 'revins' is set. 1290 set revins fkmap 1291 try 1292 normal Ri 1293 call assert_fails(1, "R with 'fkmap' and 'ri' set") 1294 catch 1295 finally 1296 set norevins nofkmap 1297 endtry 1298 endif 1299 bw! 1300endfunc 1301 1302func Test_edit_rightleft() 1303 " Cursor in rightleft mode moves differently 1304 if !exists("+rightleft") 1305 return 1306 endif 1307 call NewWindow(10, 20) 1308 call setline(1, ['abc', 'def', 'ghi']) 1309 call cursor(1, 2) 1310 set rightleft 1311 " Screen looks as expected 1312 let lines = ScreenLines([1, 4], winwidth(0)) 1313 let expect = [ 1314 \" cba", 1315 \" fed", 1316 \" ihg", 1317 \" ~"] 1318 call assert_equal(join(expect, "\n"), join(lines, "\n")) 1319 " 2) right moves to the left 1320 call feedkeys("i\<right>\<esc>x", 'txin') 1321 call assert_equal(['bc', 'def', 'ghi'], getline(1,'$')) 1322 call cursor(1, 2) 1323 call feedkeys("i\<s-right>\<esc>", 'txin') 1324 call cursor(1, 2) 1325 call feedkeys("i\<c-right>\<esc>", 'txin') 1326 " Screen looks as expected 1327 let lines = ScreenLines([1, 4], winwidth(0)) 1328 let expect = [ 1329 \" cb", 1330 \" fed", 1331 \" ihg", 1332 \" ~"] 1333 call assert_equal(join(expect, "\n"), join(lines, "\n")) 1334 " 2) left moves to the right 1335 call setline(1, ['abc', 'def', 'ghi']) 1336 call cursor(1, 2) 1337 call feedkeys("i\<left>\<esc>x", 'txin') 1338 call assert_equal(['ac', 'def', 'ghi'], getline(1,'$')) 1339 call cursor(1, 2) 1340 call feedkeys("i\<s-left>\<esc>", 'txin') 1341 call cursor(1, 2) 1342 call feedkeys("i\<c-left>\<esc>", 'txin') 1343 " Screen looks as expected 1344 let lines = ScreenLines([1, 4], winwidth(0)) 1345 let expect = [ 1346 \" ca", 1347 \" fed", 1348 \" ihg", 1349 \" ~"] 1350 call assert_equal(join(expect, "\n"), join(lines, "\n")) 1351 set norightleft 1352 bw! 1353endfunc 1354 1355func Test_edit_complete_very_long_name() 1356 if !has('unix') 1357 " Long directory names only work on Unix. 1358 return 1359 endif 1360 1361 let dirname = getcwd() . "/Xdir" 1362 let longdirname = dirname . repeat('/' . repeat('d', 255), 4) 1363 try 1364 call mkdir(longdirname, 'p') 1365 catch /E739:/ 1366 " Long directory name probably not supported. 1367 call delete(dirname, 'rf') 1368 return 1369 endtry 1370 1371 " Try to get the Vim window position before setting 'columns', so that we can 1372 " move the window back to where it was. 1373 let winposx = getwinposx() 1374 let winposy = getwinposy() 1375 1376 if winposx >= 0 && winposy >= 0 && !has('gui_running') 1377 " We did get the window position, but xterm may report the wrong numbers. 1378 " Move the window to the reported position and compute any offset. 1379 exe 'winpos ' . winposx . ' ' . winposy 1380 sleep 100m 1381 let x = getwinposx() 1382 if x >= 0 1383 let winposx += winposx - x 1384 endif 1385 let y = getwinposy() 1386 if y >= 0 1387 let winposy += winposy - y 1388 endif 1389 endif 1390 1391 let save_columns = &columns 1392 " Need at least about 1100 columns to reproduce the problem. 1393 set columns=2000 1394 set noswapfile 1395 1396 let longfilename = longdirname . '/' . repeat('a', 255) 1397 call writefile(['Totum', 'Table'], longfilename) 1398 new 1399 exe "next Xfile " . longfilename 1400 exe "normal iT\<C-N>" 1401 1402 bwipe! 1403 exe 'bwipe! ' . longfilename 1404 call delete(dirname, 'rf') 1405 let &columns = save_columns 1406 if winposx >= 0 && winposy >= 0 1407 exe 'winpos ' . winposx . ' ' . winposy 1408 endif 1409 set swapfile& 1410endfunc 1411 1412func Test_edit_backtick() 1413 next a\`b c 1414 call assert_equal('a`b', expand('%')) 1415 next 1416 call assert_equal('c', expand('%')) 1417 call assert_equal('a\`b c', expand('##')) 1418endfunc 1419 1420func Test_edit_quit() 1421 edit foo.txt 1422 split 1423 new 1424 call setline(1, 'hello') 1425 3wincmd w 1426 redraw! 1427 call assert_fails('1q', 'E37:') 1428 bwipe! foo.txt 1429 only 1430endfunc 1431 1432func Test_edit_alt() 1433 " Keeping the cursor line didn't happen when the first line has indent. 1434 new 1435 call setline(1, [' one', 'two', 'three']) 1436 w XAltFile 1437 $ 1438 call assert_equal(3, line('.')) 1439 e Xother 1440 e # 1441 call assert_equal(3, line('.')) 1442 1443 bwipe XAltFile 1444 call delete('XAltFile') 1445endfunc 1446 1447func Test_leave_insert_autocmd() 1448 new 1449 au InsertLeave * let g:did_au = 1 1450 let g:did_au = 0 1451 call feedkeys("afoo\<Esc>", 'tx') 1452 call assert_equal(1, g:did_au) 1453 call assert_equal('foo', getline(1)) 1454 1455 let g:did_au = 0 1456 call feedkeys("Sbar\<C-C>", 'tx') 1457 call assert_equal(0, g:did_au) 1458 call assert_equal('bar', getline(1)) 1459 1460 inoremap x xx<Esc> 1461 let g:did_au = 0 1462 call feedkeys("Saax", 'tx') 1463 call assert_equal(1, g:did_au) 1464 call assert_equal('aaxx', getline(1)) 1465 1466 inoremap x xx<C-C> 1467 let g:did_au = 0 1468 call feedkeys("Sbbx", 'tx') 1469 call assert_equal(0, g:did_au) 1470 call assert_equal('bbxx', getline(1)) 1471 1472 bwipe! 1473 au! InsertLeave 1474 iunmap x 1475endfunc 1476 1477" Test for inserting characters using CTRL-V followed by a number. 1478func Test_edit_special_chars() 1479 new 1480 1481 if has("ebcdic") 1482 let t = "o\<C-V>193\<C-V>xc2\<C-V>o303 \<C-V>90a\<C-V>xfg\<C-V>o578\<Esc>" 1483 else 1484 let t = "o\<C-V>65\<C-V>x42\<C-V>o103 \<C-V>33a\<C-V>xfg\<C-V>o78\<Esc>" 1485 endif 1486 1487 exe "normal " . t 1488 call assert_equal("ABC !a\<C-O>g\<C-G>8", getline(2)) 1489 1490 close! 1491endfunc 1492 1493func Test_edit_startinsert() 1494 new 1495 set backspace+=start 1496 call setline(1, 'foobar') 1497 call feedkeys("A\<C-U>\<Esc>", 'xt') 1498 call assert_equal('', getline(1)) 1499 1500 call setline(1, 'foobar') 1501 call feedkeys(":startinsert!\<CR>\<C-U>\<Esc>", 'xt') 1502 call assert_equal('', getline(1)) 1503 1504 set backspace& 1505 bwipe! 1506endfunc 1507 1508" Test for :startreplace and :startgreplace 1509func Test_edit_startreplace() 1510 new 1511 call setline(1, 'abc') 1512 call feedkeys("l:startreplace\<CR>xyz\e", 'xt') 1513 call assert_equal('axyz', getline(1)) 1514 call feedkeys("0:startreplace!\<CR>abc\e", 'xt') 1515 call assert_equal('axyzabc', getline(1)) 1516 call setline(1, "a\tb") 1517 call feedkeys("0l:startgreplace\<CR>xyz\e", 'xt') 1518 call assert_equal("axyz\tb", getline(1)) 1519 call feedkeys("0i\<C-R>=execute('startreplace')\<CR>12\e", 'xt') 1520 call assert_equal("12axyz\tb", getline(1)) 1521 close! 1522endfunc 1523 1524func Test_edit_noesckeys() 1525 CheckNotGui 1526 new 1527 1528 " <Left> moves cursor when 'esckeys' is set 1529 exe "set t_kl=\<Esc>OD" 1530 set esckeys 1531 call feedkeys("axyz\<Esc>ODX", "xt") 1532 call assert_equal("xyXz", getline(1)) 1533 1534 " <Left> exits Insert mode when 'esckeys' is off 1535 set noesckeys 1536 call setline(1, '') 1537 call feedkeys("axyz\<Esc>ODX", "xt") 1538 call assert_equal(["DX", "xyz"], getline(1, 2)) 1539 1540 bwipe! 1541 set esckeys 1542endfunc 1543 1544" Test for running an invalid ex command in insert mode using CTRL-O 1545" Note that vim has a hard-coded sleep of 3 seconds. So this test will take 1546" more than 3 seconds to complete. 1547func Test_edit_ctrl_o_invalid_cmd() 1548 new 1549 set showmode showcmd 1550 let caught_e492 = 0 1551 try 1552 call feedkeys("i\<C-O>:invalid\<CR>abc\<Esc>", "xt") 1553 catch /E492:/ 1554 let caught_e492 = 1 1555 endtry 1556 call assert_equal(1, caught_e492) 1557 call assert_equal('abc', getline(1)) 1558 set showmode& showcmd& 1559 close! 1560endfunc 1561 1562" Test for inserting text in a line with only spaces ('H' flag in 'cpoptions') 1563func Test_edit_cpo_H() 1564 new 1565 call setline(1, ' ') 1566 normal! Ia 1567 call assert_equal(' a', getline(1)) 1568 set cpo+=H 1569 call setline(1, ' ') 1570 normal! Ia 1571 call assert_equal(' a ', getline(1)) 1572 set cpo-=H 1573 close! 1574endfunc 1575 1576" Test for inserting tab in virtual replace mode ('L' flag in 'cpoptions') 1577func Test_edit_cpo_L() 1578 new 1579 call setline(1, 'abcdefghijklmnopqr') 1580 exe "normal 0gR\<Tab>" 1581 call assert_equal("\<Tab>ijklmnopqr", getline(1)) 1582 set cpo+=L 1583 set list 1584 call setline(1, 'abcdefghijklmnopqr') 1585 exe "normal 0gR\<Tab>" 1586 call assert_equal("\<Tab>cdefghijklmnopqr", getline(1)) 1587 set nolist 1588 call setline(1, 'abcdefghijklmnopqr') 1589 exe "normal 0gR\<Tab>" 1590 call assert_equal("\<Tab>ijklmnopqr", getline(1)) 1591 set cpo-=L 1592 %bw! 1593endfunc 1594 1595" vim: shiftwidth=2 sts=2 expandtab 1596