1" Test for various Normal mode commands 2 3source shared.vim 4source check.vim 5source view_util.vim 6 7func Setup_NewWindow() 8 10new 9 call setline(1, range(1,100)) 10endfunc 11 12func MyFormatExpr() 13 " Adds '->$' at lines having numbers followed by trailing whitespace 14 for ln in range(v:lnum, v:lnum+v:count-1) 15 let line = getline(ln) 16 if getline(ln) =~# '\d\s\+$' 17 call setline(ln, substitute(line, '\s\+$', '', '') . '->$') 18 endif 19 endfor 20endfunc 21 22func CountSpaces(type, ...) 23 " for testing operatorfunc 24 " will count the number of spaces 25 " and return the result in g:a 26 let sel_save = &selection 27 let &selection = "inclusive" 28 let reg_save = @@ 29 30 if a:0 " Invoked from Visual mode, use gv command. 31 silent exe "normal! gvy" 32 elseif a:type == 'line' 33 silent exe "normal! '[V']y" 34 else 35 silent exe "normal! `[v`]y" 36 endif 37 let g:a=strlen(substitute(@@, '[^ ]', '', 'g')) 38 let &selection = sel_save 39 let @@ = reg_save 40endfunc 41 42func OpfuncDummy(type, ...) 43 " for testing operatorfunc 44 let g:opt=&linebreak 45 46 if a:0 " Invoked from Visual mode, use gv command. 47 silent exe "normal! gvy" 48 elseif a:type == 'line' 49 silent exe "normal! '[V']y" 50 else 51 silent exe "normal! `[v`]y" 52 endif 53 " Create a new dummy window 54 new 55 let g:bufnr=bufnr('%') 56endfunc 57 58func Test_normal00_optrans() 59 new 60 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line']) 61 1 62 exe "norm! Sfoobar\<esc>" 63 call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$')) 64 2 65 exe "norm! $vbsone" 66 call assert_equal(['foobar', '2 This is the second one', '3 this is the third line', ''], getline(1,'$')) 67 norm! VS Second line here 68 call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$')) 69 %d 70 call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line']) 71 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line']) 72 73 1 74 norm! 2D 75 call assert_equal(['3 this is the third line', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$')) 76 set cpo+=# 77 norm! 4D 78 call assert_equal(['', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$')) 79 80 " clean up 81 set cpo-=# 82 bw! 83endfunc 84 85func Test_normal01_keymodel() 86 call Setup_NewWindow() 87 " Test 1: depending on 'keymodel' <s-down> does something different 88 50 89 call feedkeys("V\<S-Up>y", 'tx') 90 call assert_equal(['47', '48', '49', '50'], getline("'<", "'>")) 91 set keymodel=startsel 92 50 93 call feedkeys("V\<S-Up>y", 'tx') 94 call assert_equal(['49', '50'], getline("'<", "'>")) 95 " Start visual mode when keymodel = startsel 96 50 97 call feedkeys("\<S-Up>y", 'tx') 98 call assert_equal(['49', '5'], getreg(0, 0, 1)) 99 " Use the different Shift special keys 100 50 101 call feedkeys("\<S-Right>\<S-Left>\<S-Up>\<S-Down>\<S-Home>\<S-End>y", 'tx') 102 call assert_equal(['50'], getline("'<", "'>")) 103 call assert_equal(['50', ''], getreg(0, 0, 1)) 104 105 " Do not start visual mode when keymodel= 106 set keymodel= 107 50 108 call feedkeys("\<S-Up>y$", 'tx') 109 call assert_equal(['42'], getreg(0, 0, 1)) 110 " Stop visual mode when keymodel=stopsel 111 set keymodel=stopsel 112 50 113 call feedkeys("Vkk\<Up>yy", 'tx') 114 call assert_equal(['47'], getreg(0, 0, 1)) 115 116 set keymodel= 117 50 118 call feedkeys("Vkk\<Up>yy", 'tx') 119 call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1)) 120 121 " clean up 122 bw! 123endfunc 124 125func Test_normal03_join() 126 " basic join test 127 call Setup_NewWindow() 128 50 129 norm! VJ 130 call assert_equal('50 51', getline('.')) 131 $ 132 norm! J 133 call assert_equal('100', getline('.')) 134 $ 135 norm! V9-gJ 136 call assert_equal('919293949596979899100', getline('.')) 137 call setline(1, range(1,100)) 138 $ 139 :j 10 140 call assert_equal('100', getline('.')) 141 call assert_beeps('normal GVJ') 142 " clean up 143 bw! 144endfunc 145 146" basic filter test 147func Test_normal04_filter() 148 " only test on non windows platform 149 CheckNotMSWindows 150 call Setup_NewWindow() 151 1 152 call feedkeys("!!sed -e 's/^/| /'\n", 'tx') 153 call assert_equal('| 1', getline('.')) 154 90 155 :sil :!echo one 156 call feedkeys('.', 'tx') 157 call assert_equal('| 90', getline('.')) 158 95 159 set cpo+=! 160 " 2 <CR>, 1: for executing the command, 161 " 2: clear hit-enter-prompt 162 call feedkeys("!!\n", 'tx') 163 call feedkeys(":!echo one\n\n", 'tx') 164 call feedkeys(".", 'tx') 165 call assert_equal('one', getline('.')) 166 set cpo-=! 167 bw! 168endfunc 169 170func Test_normal05_formatexpr() 171 " basic formatexpr test 172 call Setup_NewWindow() 173 %d_ 174 call setline(1, ['here: 1 ', '2', 'here: 3 ', '4', 'not here: ']) 175 1 176 set formatexpr=MyFormatExpr() 177 norm! gqG 178 call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here: '], getline(1,'$')) 179 set formatexpr= 180 bw! 181endfunc 182 183func Test_normal05_formatexpr_newbuf() 184 " Edit another buffer in the 'formatexpr' function 185 new 186 func! Format() 187 edit another 188 endfunc 189 set formatexpr=Format() 190 norm gqG 191 bw! 192 set formatexpr= 193endfunc 194 195func Test_normal05_formatexpr_setopt() 196 " Change the 'formatexpr' value in the function 197 new 198 func! Format() 199 set formatexpr= 200 endfunc 201 set formatexpr=Format() 202 norm gqG 203 bw! 204 set formatexpr= 205endfunc 206 207" When 'formatexpr' returns non-zero, internal formatting is used. 208func Test_normal_formatexpr_returns_nonzero() 209 new 210 call setline(1, ['one', 'two']) 211 func! Format() 212 return 1 213 endfunc 214 setlocal formatexpr=Format() 215 normal VGgq 216 call assert_equal(['one two'], getline(1, '$')) 217 setlocal formatexpr= 218 delfunc Format 219 close! 220endfunc 221 222" basic test for formatprg 223func Test_normal06_formatprg() 224 " only test on non windows platform 225 CheckNotMSWindows 226 227 " uses sed to number non-empty lines 228 call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/ /', '}'''], 'Xsed_format.sh') 229 call system('chmod +x ./Xsed_format.sh') 230 let text = ['a', '', 'c', '', ' ', 'd', 'e'] 231 let expected = ['1 a', '', '3 c', '', '5 ', '6 d', '7 e'] 232 233 10new 234 call setline(1, text) 235 set formatprg=./Xsed_format.sh 236 norm! gggqG 237 call assert_equal(expected, getline(1, '$')) 238 %d 239 240 call setline(1, text) 241 set formatprg=donothing 242 setlocal formatprg=./Xsed_format.sh 243 norm! gggqG 244 call assert_equal(expected, getline(1, '$')) 245 %d 246 247 " Check for the command-line ranges added to 'formatprg' 248 set formatprg=cat 249 call setline(1, ['one', 'two', 'three', 'four', 'five']) 250 call feedkeys('gggqG', 'xt') 251 call assert_equal('.,$!cat', @:) 252 call feedkeys('2Ggq2j', 'xt') 253 call assert_equal('.,.+2!cat', @:) 254 255 bw! 256 " clean up 257 set formatprg= 258 setlocal formatprg= 259 call delete('Xsed_format.sh') 260endfunc 261 262func Test_normal07_internalfmt() 263 " basic test for internal formmatter to textwidth of 12 264 let list=range(1,11) 265 call map(list, 'v:val." "') 266 10new 267 call setline(1, list) 268 set tw=12 269 norm! ggVGgq 270 call assert_equal(['1 2 3', '4 5 6', '7 8 9', '10 11 '], getline(1, '$')) 271 " clean up 272 set tw=0 273 bw! 274endfunc 275 276" basic tests for foldopen/folddelete 277func Test_normal08_fold() 278 CheckFeature folding 279 call Setup_NewWindow() 280 50 281 setl foldenable fdm=marker 282 " First fold 283 norm! V4jzf 284 " check that folds have been created 285 call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54)) 286 " Second fold 287 46 288 norm! V10jzf 289 " check that folds have been created 290 call assert_equal('46/*{{{*/', getline(46)) 291 call assert_equal('60/*}}}*/', getline(60)) 292 norm! k 293 call assert_equal('45', getline('.')) 294 norm! j 295 call assert_equal('46/*{{{*/', getline('.')) 296 norm! j 297 call assert_equal('61', getline('.')) 298 norm! k 299 " open a fold 300 norm! Vzo 301 norm! k 302 call assert_equal('45', getline('.')) 303 norm! j 304 call assert_equal('46/*{{{*/', getline('.')) 305 norm! j 306 call assert_equal('47', getline('.')) 307 norm! k 308 norm! zcVzO 309 call assert_equal('46/*{{{*/', getline('.')) 310 norm! j 311 call assert_equal('47', getline('.')) 312 norm! j 313 call assert_equal('48', getline('.')) 314 norm! j 315 call assert_equal('49', getline('.')) 316 norm! j 317 call assert_equal('50/*{{{*/', getline('.')) 318 norm! j 319 call assert_equal('51', getline('.')) 320 " delete folds 321 :46 322 " collapse fold 323 norm! V14jzC 324 " delete all folds recursively 325 norm! VzD 326 call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60)) 327 328 " clean up 329 setl nofoldenable fdm=marker 330 bw! 331endfunc 332 333func Test_normal09_operatorfunc() 334 " Test operatorfunc 335 call Setup_NewWindow() 336 " Add some spaces for counting 337 50,60s/$/ / 338 unlet! g:a 339 let g:a=0 340 nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@ 341 vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR> 342 50 343 norm V2j,, 344 call assert_equal(6, g:a) 345 norm V,, 346 call assert_equal(2, g:a) 347 norm ,,l 348 call assert_equal(0, g:a) 349 50 350 exe "norm 0\<c-v>10j2l,," 351 call assert_equal(11, g:a) 352 50 353 norm V10j,, 354 call assert_equal(22, g:a) 355 356 " clean up 357 unmap <buffer> ,, 358 set opfunc= 359 unlet! g:a 360 bw! 361endfunc 362 363func Test_normal09a_operatorfunc() 364 " Test operatorfunc 365 call Setup_NewWindow() 366 " Add some spaces for counting 367 50,60s/$/ / 368 unlet! g:opt 369 set linebreak 370 nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@ 371 50 372 norm ,,j 373 exe "bd!" g:bufnr 374 call assert_true(&linebreak) 375 call assert_equal(g:opt, &linebreak) 376 set nolinebreak 377 norm ,,j 378 exe "bd!" g:bufnr 379 call assert_false(&linebreak) 380 call assert_equal(g:opt, &linebreak) 381 382 " clean up 383 unmap <buffer> ,, 384 set opfunc= 385 call assert_fails('normal Vg@', 'E774:') 386 bw! 387 unlet! g:opt 388endfunc 389 390func Test_normal10_expand() 391 " Test for expand() 392 10new 393 call setline(1, ['1', 'ifooar,,cbar']) 394 2 395 norm! $ 396 call assert_equal('cbar', expand('<cword>')) 397 call assert_equal('ifooar,,cbar', expand('<cWORD>')) 398 399 call setline(1, ['prx = list[idx];']) 400 1 401 let expected = ['', 'prx', 'prx', 'prx', 402 \ 'list', 'list', 'list', 'list', 'list', 'list', 'list', 403 \ 'idx', 'idx', 'idx', 'idx', 404 \ 'list[idx]', 405 \ '];', 406 \ ] 407 for i in range(1, 16) 408 exe 'norm ' . i . '|' 409 call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i) 410 endfor 411 412 if executable('echo') 413 " Test expand(`...`) i.e. backticks command expansion. 414 call assert_equal('abcde', expand('`echo abcde`')) 415 endif 416 417 " Test expand(`=...`) i.e. backticks expression expansion 418 call assert_equal('5', expand('`=2+3`')) 419 call assert_equal('3.14', expand('`=3.14`')) 420 421 " clean up 422 bw! 423endfunc 424 425func Test_normal11_showcmd() 426 " test for 'showcmd' 427 10new 428 exe "norm! ofoobar\<esc>" 429 call assert_equal(2, line('$')) 430 set showcmd 431 exe "norm! ofoobar2\<esc>" 432 call assert_equal(3, line('$')) 433 exe "norm! VAfoobar3\<esc>" 434 call assert_equal(3, line('$')) 435 exe "norm! 0d3\<del>2l" 436 call assert_equal('obar2foobar3', getline('.')) 437 bw! 438endfunc 439 440" Test for nv_error and normal command errors 441func Test_normal12_nv_error() 442 10new 443 call setline(1, range(1,5)) 444 " should not do anything, just beep 445 call assert_beeps('exe "norm! <c-k>"') 446 call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$')) 447 call assert_beeps('normal! G2dd') 448 call assert_beeps("normal! g\<C-A>") 449 call assert_beeps("normal! g\<C-X>") 450 call assert_beeps("normal! g\<C-B>") 451 call assert_beeps("normal! vQ\<Esc>") 452 call assert_beeps("normal! 2[[") 453 call assert_beeps("normal! 2]]") 454 call assert_beeps("normal! 2[]") 455 call assert_beeps("normal! 2][") 456 call assert_beeps("normal! 4[z") 457 call assert_beeps("normal! 4]z") 458 call assert_beeps("normal! 4[c") 459 call assert_beeps("normal! 4]c") 460 call assert_beeps("normal! 200%") 461 call assert_beeps("normal! %") 462 call assert_beeps("normal! 2{") 463 call assert_beeps("normal! 2}") 464 call assert_beeps("normal! r\<Right>") 465 call assert_beeps("normal! 8ry") 466 call assert_beeps('normal! "@') 467 bw! 468endfunc 469 470func Test_normal13_help() 471 " Test for F1 472 call assert_equal(1, winnr()) 473 call feedkeys("\<f1>", 'txi') 474 call assert_match('help\.txt', bufname('%')) 475 call assert_equal(2, winnr('$')) 476 bw! 477endfunc 478 479func Test_normal14_page() 480 " basic test for Ctrl-F and Ctrl-B 481 call Setup_NewWindow() 482 exe "norm! \<c-f>" 483 call assert_equal('9', getline('.')) 484 exe "norm! 2\<c-f>" 485 call assert_equal('25', getline('.')) 486 exe "norm! 2\<c-b>" 487 call assert_equal('18', getline('.')) 488 1 489 set scrolloff=5 490 exe "norm! 2\<c-f>" 491 call assert_equal('21', getline('.')) 492 exe "norm! \<c-b>" 493 call assert_equal('13', getline('.')) 494 1 495 set scrolloff=99 496 exe "norm! \<c-f>" 497 call assert_equal('13', getline('.')) 498 set scrolloff=0 499 100 500 exe "norm! $\<c-b>" 501 call assert_equal('92', getline('.')) 502 call assert_equal([0, 92, 1, 0, 1], getcurpos()) 503 100 504 set nostartofline 505 exe "norm! $\<c-b>" 506 call assert_equal('92', getline('.')) 507 call assert_equal([0, 92, 2, 0, 2147483647], getcurpos()) 508 " cleanup 509 set startofline 510 bw! 511endfunc 512 513func Test_normal14_page_eol() 514 10new 515 norm oxxxxxxx 516 exe "norm 2\<c-f>" 517 " check with valgrind that cursor is put back in column 1 518 exe "norm 2\<c-b>" 519 bw! 520endfunc 521 522" Test for errors with z command 523func Test_normal_z_error() 524 call assert_beeps('normal! z2p') 525 call assert_beeps('normal! zp') 526endfunc 527 528func Test_normal15_z_scroll_vert() 529 " basic test for z commands that scroll the window 530 call Setup_NewWindow() 531 100 532 norm! >> 533 " Test for z<cr> 534 exe "norm! z\<cr>" 535 call assert_equal(' 100', getline('.')) 536 call assert_equal(100, winsaveview()['topline']) 537 call assert_equal([0, 100, 2, 0, 9], getcurpos()) 538 539 " Test for zt 540 21 541 norm! >>0zt 542 call assert_equal(' 21', getline('.')) 543 call assert_equal(21, winsaveview()['topline']) 544 call assert_equal([0, 21, 1, 0, 8], getcurpos()) 545 546 " Test for zb 547 30 548 norm! >>$ztzb 549 call assert_equal(' 30', getline('.')) 550 call assert_equal(30, winsaveview()['topline']+winheight(0)-1) 551 call assert_equal([0, 30, 3, 0, 2147483647], getcurpos()) 552 553 " Test for z- 554 1 555 30 556 norm! 0z- 557 call assert_equal(' 30', getline('.')) 558 call assert_equal(30, winsaveview()['topline']+winheight(0)-1) 559 call assert_equal([0, 30, 2, 0, 9], getcurpos()) 560 561 " Test for z{height}<cr> 562 call assert_equal(10, winheight(0)) 563 exe "norm! z12\<cr>" 564 call assert_equal(12, winheight(0)) 565 exe "norm! z10\<cr>" 566 call assert_equal(10, winheight(0)) 567 568 " Test for z. 569 1 570 21 571 norm! 0z. 572 call assert_equal(' 21', getline('.')) 573 call assert_equal(17, winsaveview()['topline']) 574 call assert_equal([0, 21, 2, 0, 9], getcurpos()) 575 576 " Test for zz 577 1 578 21 579 norm! 0zz 580 call assert_equal(' 21', getline('.')) 581 call assert_equal(17, winsaveview()['topline']) 582 call assert_equal([0, 21, 1, 0, 8], getcurpos()) 583 584 " Test for z+ 585 11 586 norm! zt 587 norm! z+ 588 call assert_equal(' 21', getline('.')) 589 call assert_equal(21, winsaveview()['topline']) 590 call assert_equal([0, 21, 2, 0, 9], getcurpos()) 591 592 " Test for [count]z+ 593 1 594 norm! 21z+ 595 call assert_equal(' 21', getline('.')) 596 call assert_equal(21, winsaveview()['topline']) 597 call assert_equal([0, 21, 2, 0, 9], getcurpos()) 598 599 " Test for z+ with [count] greater than buffer size 600 1 601 norm! 1000z+ 602 call assert_equal(' 100', getline('.')) 603 call assert_equal(100, winsaveview()['topline']) 604 call assert_equal([0, 100, 2, 0, 9], getcurpos()) 605 606 " Test for z+ from the last buffer line 607 norm! Gz.z+ 608 call assert_equal(' 100', getline('.')) 609 call assert_equal(100, winsaveview()['topline']) 610 call assert_equal([0, 100, 2, 0, 9], getcurpos()) 611 612 " Test for z^ 613 norm! 22z+0 614 norm! z^ 615 call assert_equal(' 21', getline('.')) 616 call assert_equal(12, winsaveview()['topline']) 617 call assert_equal([0, 21, 2, 0, 9], getcurpos()) 618 619 " Test for z^ from first buffer line 620 norm! ggz^ 621 call assert_equal('1', getline('.')) 622 call assert_equal(1, winsaveview()['topline']) 623 call assert_equal([0, 1, 1, 0, 1], getcurpos()) 624 625 " Test for [count]z^ 626 1 627 norm! 30z^ 628 call assert_equal(' 21', getline('.')) 629 call assert_equal(12, winsaveview()['topline']) 630 call assert_equal([0, 21, 2, 0, 9], getcurpos()) 631 632 " cleanup 633 bw! 634endfunc 635 636func Test_normal16_z_scroll_hor() 637 " basic test for z commands that scroll the window 638 10new 639 15vsp 640 set nowrap listchars= 641 let lineA='abcdefghijklmnopqrstuvwxyz' 642 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' 643 $put =lineA 644 $put =lineB 645 1d 646 647 " Test for zl and zh with a count 648 norm! 0z10l 649 call assert_equal([11, 1], [col('.'), wincol()]) 650 norm! z4h 651 call assert_equal([11, 5], [col('.'), wincol()]) 652 normal! 2gg 653 654 " Test for zl 655 1 656 norm! 5zl 657 call assert_equal(lineA, getline('.')) 658 call assert_equal(6, col('.')) 659 call assert_equal(5, winsaveview()['leftcol']) 660 norm! yl 661 call assert_equal('f', @0) 662 663 " Test for zh 664 norm! 2zh 665 call assert_equal(lineA, getline('.')) 666 call assert_equal(6, col('.')) 667 norm! yl 668 call assert_equal('f', @0) 669 call assert_equal(3, winsaveview()['leftcol']) 670 671 " Test for zL 672 norm! zL 673 call assert_equal(11, col('.')) 674 norm! yl 675 call assert_equal('k', @0) 676 call assert_equal(10, winsaveview()['leftcol']) 677 norm! 2zL 678 call assert_equal(25, col('.')) 679 norm! yl 680 call assert_equal('y', @0) 681 call assert_equal(24, winsaveview()['leftcol']) 682 683 " Test for zH 684 norm! 2zH 685 call assert_equal(25, col('.')) 686 call assert_equal(10, winsaveview()['leftcol']) 687 norm! yl 688 call assert_equal('y', @0) 689 690 " Test for zs 691 norm! $zs 692 call assert_equal(26, col('.')) 693 call assert_equal(25, winsaveview()['leftcol']) 694 norm! yl 695 call assert_equal('z', @0) 696 697 " Test for ze 698 norm! ze 699 call assert_equal(26, col('.')) 700 call assert_equal(11, winsaveview()['leftcol']) 701 norm! yl 702 call assert_equal('z', @0) 703 704 " Test for zs and ze with folds 705 %fold 706 norm! $zs 707 call assert_equal(26, col('.')) 708 call assert_equal(0, winsaveview()['leftcol']) 709 norm! yl 710 call assert_equal('z', @0) 711 norm! ze 712 call assert_equal(26, col('.')) 713 call assert_equal(0, winsaveview()['leftcol']) 714 norm! yl 715 call assert_equal('z', @0) 716 717 " cleanup 718 set wrap listchars=eol:$ 719 bw! 720endfunc 721 722func Test_normal17_z_scroll_hor2() 723 " basic test for z commands that scroll the window 724 " using 'sidescrolloff' setting 725 10new 726 20vsp 727 set nowrap listchars= sidescrolloff=5 728 let lineA='abcdefghijklmnopqrstuvwxyz' 729 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' 730 $put =lineA 731 $put =lineB 732 1d 733 734 " Test for zl 735 1 736 norm! 5zl 737 call assert_equal(lineA, getline('.')) 738 call assert_equal(11, col('.')) 739 call assert_equal(5, winsaveview()['leftcol']) 740 norm! yl 741 call assert_equal('k', @0) 742 743 " Test for zh 744 norm! 2zh 745 call assert_equal(lineA, getline('.')) 746 call assert_equal(11, col('.')) 747 norm! yl 748 call assert_equal('k', @0) 749 call assert_equal(3, winsaveview()['leftcol']) 750 751 " Test for zL 752 norm! 0zL 753 call assert_equal(16, col('.')) 754 norm! yl 755 call assert_equal('p', @0) 756 call assert_equal(10, winsaveview()['leftcol']) 757 norm! 2zL 758 call assert_equal(26, col('.')) 759 norm! yl 760 call assert_equal('z', @0) 761 call assert_equal(15, winsaveview()['leftcol']) 762 763 " Test for zH 764 norm! 2zH 765 call assert_equal(15, col('.')) 766 call assert_equal(0, winsaveview()['leftcol']) 767 norm! yl 768 call assert_equal('o', @0) 769 770 " Test for zs 771 norm! $zs 772 call assert_equal(26, col('.')) 773 call assert_equal(20, winsaveview()['leftcol']) 774 norm! yl 775 call assert_equal('z', @0) 776 777 " Test for ze 778 norm! ze 779 call assert_equal(26, col('.')) 780 call assert_equal(11, winsaveview()['leftcol']) 781 norm! yl 782 call assert_equal('z', @0) 783 784 " cleanup 785 set wrap listchars=eol:$ sidescrolloff=0 786 bw! 787endfunc 788 789" Test for commands that scroll the window horizontally. Test with folds. 790" H, M, L, CTRL-E, CTRL-Y, CTRL-U, CTRL-D, PageUp, PageDown commands 791func Test_vert_scroll_cmds() 792 15new 793 call setline(1, range(1, 100)) 794 exe "normal! 30ggz\<CR>" 795 set foldenable 796 33,36fold 797 40,43fold 798 46,49fold 799 let h = winheight(0) 800 801 " Test for H, M and L commands 802 " Top of the screen = 30 803 " Folded lines = 9 804 " Bottom of the screen = 30 + h + 9 - 1 805 normal! 4L 806 call assert_equal(35 + h, line('.')) 807 normal! 4H 808 call assert_equal(33, line('.')) 809 810 " Test for using a large count value 811 %d 812 call setline(1, range(1, 4)) 813 norm! 6H 814 call assert_equal(4, line('.')) 815 816 " Test for 'M' with folded lines 817 %d 818 call setline(1, range(1, 20)) 819 1,5fold 820 norm! LM 821 call assert_equal(12, line('.')) 822 823 " Test for the CTRL-E and CTRL-Y commands with folds 824 %d 825 call setline(1, range(1, 10)) 826 3,5fold 827 exe "normal 6G3\<C-E>" 828 call assert_equal(6, line('w0')) 829 exe "normal 2\<C-Y>" 830 call assert_equal(2, line('w0')) 831 832 " Test for CTRL-Y on a folded line 833 %d 834 call setline(1, range(1, 100)) 835 exe (h + 2) .. "," .. (h + 4) .. "fold" 836 exe h + 5 837 normal z- 838 exe "normal \<C-Y>\<C-Y>" 839 call assert_equal(h + 1, line('w$')) 840 841 " Using <PageUp> and <PageDown> in an empty buffer should beep 842 %d 843 call assert_beeps('exe "normal \<PageUp>"') 844 call assert_beeps('exe "normal \<C-B>"') 845 call assert_beeps('exe "normal \<PageDown>"') 846 call assert_beeps('exe "normal \<C-F>"') 847 848 " Test for <C-U> and <C-D> with fold 849 %d 850 call setline(1, range(1, 100)) 851 10,35fold 852 set scroll=10 853 exe "normal \<C-D>" 854 call assert_equal(36, line('.')) 855 exe "normal \<C-D>" 856 call assert_equal(46, line('.')) 857 exe "normal \<C-U>" 858 call assert_equal(36, line('.')) 859 exe "normal \<C-U>" 860 call assert_equal(10, line('.')) 861 exe "normal \<C-U>" 862 call assert_equal(1, line('.')) 863 set scroll& 864 865 " Test for scrolling to the top of the file with <C-U> and a fold 866 10 867 normal ztL 868 exe "normal \<C-U>\<C-U>" 869 call assert_equal(1, line('w0')) 870 871 " Test for CTRL-D on a folded line 872 %d 873 call setline(1, range(1, 100)) 874 50,100fold 875 75 876 normal z- 877 exe "normal \<C-D>" 878 call assert_equal(50, line('.')) 879 call assert_equal(100, line('w$')) 880 normal z. 881 let lnum = winline() 882 exe "normal \<C-D>" 883 call assert_equal(lnum, winline()) 884 call assert_equal(50, line('.')) 885 normal zt 886 exe "normal \<C-D>" 887 call assert_equal(50, line('w0')) 888 889 set foldenable& 890 close! 891endfunc 892 893" Test for the 'sidescroll' option 894func Test_sidescroll_opt() 895 new 896 20vnew 897 898 " scroll by 2 characters horizontally 899 set sidescroll=2 nowrap 900 call setline(1, repeat('a', 40)) 901 normal g$l 902 call assert_equal(19, screenpos(0, 1, 21).col) 903 normal l 904 call assert_equal(20, screenpos(0, 1, 22).col) 905 normal g0h 906 call assert_equal(2, screenpos(0, 1, 2).col) 907 call assert_equal(20, screenpos(0, 1, 20).col) 908 909 " when 'sidescroll' is 0, cursor positioned at the center 910 set sidescroll=0 911 normal g$l 912 call assert_equal(11, screenpos(0, 1, 21).col) 913 normal g0h 914 call assert_equal(10, screenpos(0, 1, 10).col) 915 916 %bw! 917 set wrap& sidescroll& 918endfunc 919 920" basic tests for foldopen/folddelete 921func Test_normal18_z_fold() 922 CheckFeature folding 923 call Setup_NewWindow() 924 50 925 setl foldenable fdm=marker foldlevel=5 926 927 call assert_beeps('normal! zj') 928 call assert_beeps('normal! zk') 929 930 " Test for zF 931 " First fold 932 norm! 4zF 933 " check that folds have been created 934 call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53)) 935 936 " Test for zd 937 51 938 norm! 2zF 939 call assert_equal(2, foldlevel('.')) 940 norm! kzd 941 call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53)) 942 norm! j 943 call assert_equal(1, foldlevel('.')) 944 945 " Test for zD 946 " also deletes partially selected folds recursively 947 51 948 norm! zF 949 call assert_equal(2, foldlevel('.')) 950 norm! kV2jzD 951 call assert_equal(['50', '51', '52', '53'], getline(50,53)) 952 953 " Test for zE 954 85 955 norm! 4zF 956 86 957 norm! 2zF 958 90 959 norm! 4zF 960 call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93)) 961 norm! zE 962 call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93)) 963 964 " Test for zn 965 50 966 set foldlevel=0 967 norm! 2zF 968 norm! zn 969 norm! k 970 call assert_equal('49', getline('.')) 971 norm! j 972 call assert_equal('50/*{{{*/', getline('.')) 973 norm! j 974 call assert_equal('51/*}}}*/', getline('.')) 975 norm! j 976 call assert_equal('52', getline('.')) 977 call assert_equal(0, &foldenable) 978 979 " Test for zN 980 49 981 norm! zN 982 call assert_equal('49', getline('.')) 983 norm! j 984 call assert_equal('50/*{{{*/', getline('.')) 985 norm! j 986 call assert_equal('52', getline('.')) 987 call assert_equal(1, &foldenable) 988 989 " Test for zi 990 norm! zi 991 call assert_equal(0, &foldenable) 992 norm! zi 993 call assert_equal(1, &foldenable) 994 norm! zi 995 call assert_equal(0, &foldenable) 996 norm! zi 997 call assert_equal(1, &foldenable) 998 999 " Test for za 1000 50 1001 norm! za 1002 norm! k 1003 call assert_equal('49', getline('.')) 1004 norm! j 1005 call assert_equal('50/*{{{*/', getline('.')) 1006 norm! j 1007 call assert_equal('51/*}}}*/', getline('.')) 1008 norm! j 1009 call assert_equal('52', getline('.')) 1010 50 1011 norm! za 1012 norm! k 1013 call assert_equal('49', getline('.')) 1014 norm! j 1015 call assert_equal('50/*{{{*/', getline('.')) 1016 norm! j 1017 call assert_equal('52', getline('.')) 1018 1019 49 1020 norm! 5zF 1021 norm! k 1022 call assert_equal('48', getline('.')) 1023 norm! j 1024 call assert_equal('49/*{{{*/', getline('.')) 1025 norm! j 1026 call assert_equal('55', getline('.')) 1027 49 1028 norm! za 1029 call assert_equal('49/*{{{*/', getline('.')) 1030 norm! j 1031 call assert_equal('50/*{{{*/', getline('.')) 1032 norm! j 1033 call assert_equal('52', getline('.')) 1034 set nofoldenable 1035 " close fold and set foldenable 1036 norm! za 1037 call assert_equal(1, &foldenable) 1038 1039 50 1040 " have to use {count}za to open all folds and make the cursor visible 1041 norm! 2za 1042 norm! 2k 1043 call assert_equal('48', getline('.')) 1044 norm! j 1045 call assert_equal('49/*{{{*/', getline('.')) 1046 norm! j 1047 call assert_equal('50/*{{{*/', getline('.')) 1048 norm! j 1049 call assert_equal('51/*}}}*/', getline('.')) 1050 norm! j 1051 call assert_equal('52', getline('.')) 1052 1053 " Test for zA 1054 49 1055 set foldlevel=0 1056 50 1057 norm! zA 1058 norm! 2k 1059 call assert_equal('48', getline('.')) 1060 norm! j 1061 call assert_equal('49/*{{{*/', getline('.')) 1062 norm! j 1063 call assert_equal('50/*{{{*/', getline('.')) 1064 norm! j 1065 call assert_equal('51/*}}}*/', getline('.')) 1066 norm! j 1067 call assert_equal('52', getline('.')) 1068 1069 " zA on a opened fold when foldenable is not set 1070 50 1071 set nofoldenable 1072 norm! zA 1073 call assert_equal(1, &foldenable) 1074 norm! k 1075 call assert_equal('48', getline('.')) 1076 norm! j 1077 call assert_equal('49/*{{{*/', getline('.')) 1078 norm! j 1079 call assert_equal('55', getline('.')) 1080 1081 " Test for zc 1082 norm! zE 1083 50 1084 norm! 2zF 1085 49 1086 norm! 5zF 1087 set nofoldenable 1088 50 1089 " There most likely is a bug somewhere: 1090 " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ 1091 " TODO: Should this only close the inner most fold or both folds? 1092 norm! zc 1093 call assert_equal(1, &foldenable) 1094 norm! k 1095 call assert_equal('48', getline('.')) 1096 norm! j 1097 call assert_equal('49/*{{{*/', getline('.')) 1098 norm! j 1099 call assert_equal('55', getline('.')) 1100 set nofoldenable 1101 50 1102 norm! Vjzc 1103 norm! k 1104 call assert_equal('48', getline('.')) 1105 norm! j 1106 call assert_equal('49/*{{{*/', getline('.')) 1107 norm! j 1108 call assert_equal('55', getline('.')) 1109 1110 " Test for zC 1111 set nofoldenable 1112 50 1113 norm! zCk 1114 call assert_equal('48', getline('.')) 1115 norm! j 1116 call assert_equal('49/*{{{*/', getline('.')) 1117 norm! j 1118 call assert_equal('55', getline('.')) 1119 1120 " Test for zx 1121 " 1) close folds at line 49-54 1122 set nofoldenable 1123 48 1124 norm! zx 1125 call assert_equal(1, &foldenable) 1126 norm! j 1127 call assert_equal('49/*{{{*/', getline('.')) 1128 norm! j 1129 call assert_equal('55', getline('.')) 1130 1131 " 2) do not close fold under cursor 1132 51 1133 set nofoldenable 1134 norm! zx 1135 call assert_equal(1, &foldenable) 1136 norm! 3k 1137 call assert_equal('48', getline('.')) 1138 norm! j 1139 call assert_equal('49/*{{{*/', getline('.')) 1140 norm! j 1141 call assert_equal('50/*{{{*/', getline('.')) 1142 norm! j 1143 call assert_equal('51/*}}}*/', getline('.')) 1144 norm! j 1145 call assert_equal('52', getline('.')) 1146 norm! j 1147 call assert_equal('53', getline('.')) 1148 norm! j 1149 call assert_equal('54/*}}}*/', getline('.')) 1150 norm! j 1151 call assert_equal('55', getline('.')) 1152 1153 " 3) close one level of folds 1154 48 1155 set nofoldenable 1156 set foldlevel=1 1157 norm! zx 1158 call assert_equal(1, &foldenable) 1159 call assert_equal('48', getline('.')) 1160 norm! j 1161 call assert_equal('49/*{{{*/', getline('.')) 1162 norm! j 1163 call assert_equal('50/*{{{*/', getline('.')) 1164 norm! j 1165 call assert_equal('52', getline('.')) 1166 norm! j 1167 call assert_equal('53', getline('.')) 1168 norm! j 1169 call assert_equal('54/*}}}*/', getline('.')) 1170 norm! j 1171 call assert_equal('55', getline('.')) 1172 1173 " Test for zX 1174 " Close all folds 1175 set foldlevel=0 nofoldenable 1176 50 1177 norm! zX 1178 call assert_equal(1, &foldenable) 1179 norm! k 1180 call assert_equal('48', getline('.')) 1181 norm! j 1182 call assert_equal('49/*{{{*/', getline('.')) 1183 norm! j 1184 call assert_equal('55', getline('.')) 1185 1186 " Test for zm 1187 50 1188 set nofoldenable foldlevel=2 1189 norm! zm 1190 call assert_equal(1, &foldenable) 1191 call assert_equal(1, &foldlevel) 1192 norm! zm 1193 call assert_equal(0, &foldlevel) 1194 norm! zm 1195 call assert_equal(0, &foldlevel) 1196 norm! k 1197 call assert_equal('48', getline('.')) 1198 norm! j 1199 call assert_equal('49/*{{{*/', getline('.')) 1200 norm! j 1201 call assert_equal('55', getline('.')) 1202 1203 " Test for zm with a count 1204 50 1205 set foldlevel=2 1206 norm! 3zm 1207 call assert_equal(0, &foldlevel) 1208 call assert_equal(49, foldclosed(line('.'))) 1209 1210 " Test for zM 1211 48 1212 set nofoldenable foldlevel=99 1213 norm! zM 1214 call assert_equal(1, &foldenable) 1215 call assert_equal(0, &foldlevel) 1216 call assert_equal('48', getline('.')) 1217 norm! j 1218 call assert_equal('49/*{{{*/', getline('.')) 1219 norm! j 1220 call assert_equal('55', getline('.')) 1221 1222 " Test for zr 1223 48 1224 set nofoldenable foldlevel=0 1225 norm! zr 1226 call assert_equal(0, &foldenable) 1227 call assert_equal(1, &foldlevel) 1228 set foldlevel=0 foldenable 1229 norm! zr 1230 call assert_equal(1, &foldenable) 1231 call assert_equal(1, &foldlevel) 1232 norm! zr 1233 call assert_equal(2, &foldlevel) 1234 call assert_equal('48', getline('.')) 1235 norm! j 1236 call assert_equal('49/*{{{*/', getline('.')) 1237 norm! j 1238 call assert_equal('50/*{{{*/', getline('.')) 1239 norm! j 1240 call assert_equal('51/*}}}*/', getline('.')) 1241 norm! j 1242 call assert_equal('52', getline('.')) 1243 1244 " Test for zR 1245 48 1246 set nofoldenable foldlevel=0 1247 norm! zR 1248 call assert_equal(0, &foldenable) 1249 call assert_equal(2, &foldlevel) 1250 set foldenable foldlevel=0 1251 norm! zR 1252 call assert_equal(1, &foldenable) 1253 call assert_equal(2, &foldlevel) 1254 call assert_equal('48', getline('.')) 1255 norm! j 1256 call assert_equal('49/*{{{*/', getline('.')) 1257 norm! j 1258 call assert_equal('50/*{{{*/', getline('.')) 1259 norm! j 1260 call assert_equal('51/*}}}*/', getline('.')) 1261 norm! j 1262 call assert_equal('52', getline('.')) 1263 call append(50, ['a /*{{{*/', 'b /*}}}*/']) 1264 48 1265 call assert_equal('48', getline('.')) 1266 norm! j 1267 call assert_equal('49/*{{{*/', getline('.')) 1268 norm! j 1269 call assert_equal('50/*{{{*/', getline('.')) 1270 norm! j 1271 call assert_equal('a /*{{{*/', getline('.')) 1272 norm! j 1273 call assert_equal('51/*}}}*/', getline('.')) 1274 norm! j 1275 call assert_equal('52', getline('.')) 1276 48 1277 norm! zR 1278 call assert_equal(1, &foldenable) 1279 call assert_equal(3, &foldlevel) 1280 call assert_equal('48', getline('.')) 1281 norm! j 1282 call assert_equal('49/*{{{*/', getline('.')) 1283 norm! j 1284 call assert_equal('50/*{{{*/', getline('.')) 1285 norm! j 1286 call assert_equal('a /*{{{*/', getline('.')) 1287 norm! j 1288 call assert_equal('b /*}}}*/', getline('.')) 1289 norm! j 1290 call assert_equal('51/*}}}*/', getline('.')) 1291 norm! j 1292 call assert_equal('52', getline('.')) 1293 1294 " clean up 1295 setl nofoldenable fdm=marker foldlevel=0 1296 bw! 1297endfunc 1298 1299func Test_normal20_exmode() 1300 " Reading from redirected file doesn't work on MS-Windows 1301 CheckNotMSWindows 1302 call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript') 1303 call writefile(['1', '2'], 'Xfile') 1304 call system(GetVimCommand() .. ' -e -s < Xscript Xfile') 1305 let a=readfile('Xfile2') 1306 call assert_equal(['1', 'foo', 'bar', '2'], a) 1307 1308 " clean up 1309 for file in ['Xfile', 'Xfile2', 'Xscript'] 1310 call delete(file) 1311 endfor 1312 bw! 1313endfunc 1314 1315func Test_normal21_nv_hat() 1316 1317 " Edit a fresh file and wipe the buffer list so that there is no alternate 1318 " file present. Next, check for the expected command failures. 1319 edit Xfoo | %bw 1320 call assert_fails(':buffer #', 'E86:') 1321 call assert_fails(':execute "normal! \<C-^>"', 'E23:') 1322 call assert_fails("normal i\<C-R>#", 'E23:') 1323 1324 " Test for the expected behavior when switching between two named buffers. 1325 edit Xfoo | edit Xbar 1326 call feedkeys("\<C-^>", 'tx') 1327 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t')) 1328 call feedkeys("\<C-^>", 'tx') 1329 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t')) 1330 1331 " Test for the expected behavior when only one buffer is named. 1332 enew | let l:nr = bufnr('%') 1333 call feedkeys("\<C-^>", 'tx') 1334 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t')) 1335 call feedkeys("\<C-^>", 'tx') 1336 call assert_equal('', bufname('%')) 1337 call assert_equal(l:nr, bufnr('%')) 1338 1339 " Test that no action is taken by "<C-^>" when an operator is pending. 1340 edit Xfoo 1341 call feedkeys("ci\<C-^>", 'tx') 1342 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t')) 1343 1344 %bw! 1345endfunc 1346 1347func Test_normal22_zet() 1348 " Test for ZZ 1349 " let shell = &shell 1350 " let &shell = 'sh' 1351 call writefile(['1', '2'], 'Xfile') 1352 let args = ' -N -i NONE --noplugins -X --not-a-term' 1353 call system(GetVimCommand() .. args .. ' -c "%d" -c ":norm! ZZ" Xfile') 1354 let a = readfile('Xfile') 1355 call assert_equal([], a) 1356 " Test for ZQ 1357 call writefile(['1', '2'], 'Xfile') 1358 call system(GetVimCommand() . args . ' -c "%d" -c ":norm! ZQ" Xfile') 1359 let a = readfile('Xfile') 1360 call assert_equal(['1', '2'], a) 1361 1362 " Unsupported Z command 1363 call assert_beeps('normal! ZW') 1364 1365 " clean up 1366 for file in ['Xfile'] 1367 call delete(file) 1368 endfor 1369 " let &shell = shell 1370endfunc 1371 1372func Test_normal23_K() 1373 " Test for K command 1374 new 1375 call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd']) 1376 let k = &keywordprg 1377 set keywordprg=:help 1378 1 1379 norm! VK 1380 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t')) 1381 call assert_equal('help', &ft) 1382 call assert_match('\*version8.txt\*', getline('.')) 1383 helpclose 1384 norm! 0K 1385 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t')) 1386 call assert_equal('help', &ft) 1387 call assert_match('\*version8\.\d\*', getline('.')) 1388 helpclose 1389 1390 set keywordprg=:new 1391 set iskeyword+=% 1392 set iskeyword+=\| 1393 2 1394 norm! K 1395 call assert_equal('man', fnamemodify(bufname('%'), ':t')) 1396 bwipe! 1397 3 1398 norm! K 1399 call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t')) 1400 bwipe! 1401 if !has('win32') 1402 4 1403 norm! K 1404 call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t')) 1405 bwipe! 1406 endif 1407 set iskeyword-=% 1408 set iskeyword-=\| 1409 1410 " Test for specifying a count to K 1411 1 1412 com! -nargs=* Kprog let g:Kprog_Args = <q-args> 1413 set keywordprg=:Kprog 1414 norm! 3K 1415 call assert_equal('3 version8', g:Kprog_Args) 1416 delcom Kprog 1417 1418 " Only expect "man" to work on Unix 1419 if !has("unix") 1420 let &keywordprg = k 1421 bw! 1422 return 1423 endif 1424 1425 let not_gnu_man = has('mac') || has('bsd') 1426 if not_gnu_man 1427 " In MacOS and BSD, the option for specifying a pager is different 1428 set keywordprg=man\ -P\ cat 1429 else 1430 set keywordprg=man\ --pager=cat 1431 endif 1432 " Test for using man 1433 2 1434 let a = execute('unsilent norm! K') 1435 if not_gnu_man 1436 call assert_match("man -P cat 'man'", a) 1437 else 1438 call assert_match("man --pager=cat 'man'", a) 1439 endif 1440 1441 " Error cases 1442 call setline(1, '#$#') 1443 call assert_fails('normal! ggK', 'E349:') 1444 call setline(1, '---') 1445 call assert_fails('normal! ggv2lK', 'E349:') 1446 call setline(1, ['abc', 'xyz']) 1447 call assert_fails("normal! gg2lv2h\<C-]>", 'E433:') 1448 call assert_beeps("normal! ggVjK") 1449 norm! V 1450 call assert_beeps("norm! cK") 1451 1452 " clean up 1453 let &keywordprg = k 1454 bw! 1455endfunc 1456 1457func Test_normal24_rot13() 1458 " Testing for g?? g?g? 1459 new 1460 call append(0, 'abcdefghijklmnopqrstuvwxyzäüö') 1461 1 1462 norm! g?? 1463 call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.')) 1464 norm! g?g? 1465 call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.')) 1466 1467 " clean up 1468 bw! 1469endfunc 1470 1471func Test_normal25_tag() 1472 CheckFeature quickfix 1473 1474 " Testing for CTRL-] g CTRL-] g] 1475 " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-] 1476 h 1477 " Test for CTRL-] 1478 call search('\<x\>$') 1479 exe "norm! \<c-]>" 1480 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t')) 1481 norm! yiW 1482 call assert_equal("*x*", @0) 1483 exe ":norm \<c-o>" 1484 1485 " Test for g_CTRL-] 1486 call search('\<v_u\>$') 1487 exe "norm! g\<c-]>" 1488 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t')) 1489 norm! yiW 1490 call assert_equal("*v_u*", @0) 1491 exe ":norm \<c-o>" 1492 1493 " Test for g] 1494 call search('\<i_<Esc>$') 1495 let a = execute(":norm! g]") 1496 call assert_match('i_<Esc>.*insert.txt', a) 1497 1498 if !empty(exepath('cscope')) && has('cscope') 1499 " setting cscopetag changes how g] works 1500 set cst 1501 exe "norm! g]" 1502 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t')) 1503 norm! yiW 1504 call assert_equal("*i_<Esc>*", @0) 1505 exe ":norm \<c-o>" 1506 " Test for CTRL-W g] 1507 exe "norm! \<C-W>g]" 1508 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t')) 1509 norm! yiW 1510 call assert_equal("*i_<Esc>*", @0) 1511 call assert_equal(3, winnr('$')) 1512 helpclose 1513 set nocst 1514 endif 1515 1516 " Test for CTRL-W g] 1517 let a = execute("norm! \<C-W>g]") 1518 call assert_match('i_<Esc>.*insert.txt', a) 1519 1520 " Test for CTRL-W CTRL-] 1521 exe "norm! \<C-W>\<C-]>" 1522 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t')) 1523 norm! yiW 1524 call assert_equal("*i_<Esc>*", @0) 1525 call assert_equal(3, winnr('$')) 1526 helpclose 1527 1528 " Test for CTRL-W g CTRL-] 1529 exe "norm! \<C-W>g\<C-]>" 1530 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t')) 1531 norm! yiW 1532 call assert_equal("*i_<Esc>*", @0) 1533 call assert_equal(3, winnr('$')) 1534 helpclose 1535 1536 " clean up 1537 helpclose 1538endfunc 1539 1540func Test_normal26_put() 1541 " Test for ]p ]P [p and [P 1542 new 1543 call append(0, ['while read LINE', 'do', ' ((count++))', ' if [ $? -ne 0 ]; then', " echo 'Error writing file'", ' fi', 'done']) 1544 1 1545 /Error/y a 1546 2 1547 norm! "a]pj"a[p 1548 call assert_equal(['do', "echo 'Error writing file'", " echo 'Error writing file'", ' ((count++))'], getline(2,5)) 1549 1 1550 /^\s\{4}/ 1551 exe "norm! \"a]P3Eldt'" 1552 exe "norm! j\"a[P2Eldt'" 1553 call assert_equal([' if [ $? -ne 0 ]; then', " echo 'Error writing'", " echo 'Error'", " echo 'Error writing file'", ' fi'], getline(6,10)) 1554 1555 " clean up 1556 bw! 1557endfunc 1558 1559func Test_normal27_bracket() 1560 " Test for [' [` ]' ]` 1561 call Setup_NewWindow() 1562 1,21s/.\+/ & b/ 1563 1 1564 norm! $ma 1565 5 1566 norm! $mb 1567 10 1568 norm! $mc 1569 15 1570 norm! $md 1571 20 1572 norm! $me 1573 1574 " Test for [' 1575 9 1576 norm! 2[' 1577 call assert_equal(' 1 b', getline('.')) 1578 call assert_equal(1, line('.')) 1579 call assert_equal(3, col('.')) 1580 1581 " Test for ]' 1582 norm! ]' 1583 call assert_equal(' 5 b', getline('.')) 1584 call assert_equal(5, line('.')) 1585 call assert_equal(3, col('.')) 1586 1587 " No mark after line 21, cursor moves to first non blank on current line 1588 21 1589 norm! $]' 1590 call assert_equal(' 21 b', getline('.')) 1591 call assert_equal(21, line('.')) 1592 call assert_equal(3, col('.')) 1593 1594 " Test for [` 1595 norm! 2[` 1596 call assert_equal(' 15 b', getline('.')) 1597 call assert_equal(15, line('.')) 1598 call assert_equal(8, col('.')) 1599 1600 " Test for ]` 1601 norm! ]` 1602 call assert_equal(' 20 b', getline('.')) 1603 call assert_equal(20, line('.')) 1604 call assert_equal(8, col('.')) 1605 1606 " clean up 1607 bw! 1608endfunc 1609 1610" Test for ( and ) sentence movements 1611func Test_normal28_parenthesis() 1612 new 1613 call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here']) 1614 1615 $ 1616 norm! d( 1617 call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$')) 1618 norm! 2d( 1619 call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$')) 1620 1 1621 norm! 0d) 1622 call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$')) 1623 1624 call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. ']) 1625 $ 1626 norm! $d( 1627 call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$')) 1628 1629 " Move to the next sentence from a paragraph macro 1630 %d 1631 call setline(1, ['.LP', 'blue sky!. blue sky.', 'blue sky. blue sky.']) 1632 call cursor(1, 1) 1633 normal ) 1634 call assert_equal([2, 1], [line('.'), col('.')]) 1635 normal ) 1636 call assert_equal([2, 12], [line('.'), col('.')]) 1637 normal (( 1638 call assert_equal([1, 1], [line('.'), col('.')]) 1639 1640 " It is an error if a next sentence is not found 1641 %d 1642 call setline(1, '.SH') 1643 call assert_beeps('normal )') 1644 1645 " If only dot is present, don't treat that as a sentence 1646 call setline(1, '. This is a sentence.') 1647 normal $(( 1648 call assert_equal(3, col('.')) 1649 1650 " Jumping to a fold should open the fold 1651 call setline(1, ['', '', 'one', 'two', 'three']) 1652 set foldenable 1653 2,$fold 1654 call feedkeys(')', 'xt') 1655 call assert_equal(3, line('.')) 1656 call assert_equal(1, foldlevel('.')) 1657 call assert_equal(-1, foldclosed('.')) 1658 set foldenable& 1659 1660 " clean up 1661 bw! 1662endfunc 1663 1664" Test for { and } paragraph movements 1665func Test_normal29_brace() 1666 let text =<< trim [DATA] 1667 A paragraph begins after each empty line, and also at each of a set of 1668 paragraph macros, specified by the pairs of characters in the 'paragraphs' 1669 option. The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to 1670 the macros ".IP", ".LP", etc. (These are nroff macros, so the dot must be in 1671 the first column). A section boundary is also a paragraph boundary. 1672 Note that a blank line (only containing white space) is NOT a paragraph 1673 boundary. 1674 1675 1676 Also note that this does not include a '{' or '}' in the first column. When 1677 the '{' flag is in 'cpoptions' then '{' in the first column is used as a 1678 paragraph boundary |posix|. 1679 { 1680 This is no paragraph 1681 unless the '{' is set 1682 in 'cpoptions' 1683 } 1684 .IP 1685 The nroff macros IP separates a paragraph 1686 That means, it must be a '.' 1687 followed by IP 1688 .LPIt does not matter, if afterwards some 1689 more characters follow. 1690 .SHAlso section boundaries from the nroff 1691 macros terminate a paragraph. That means 1692 a character like this: 1693 .NH 1694 End of text here 1695 [DATA] 1696 1697 new 1698 call append(0, text) 1699 1 1700 norm! 0d2} 1701 1702 let expected =<< trim [DATA] 1703 .IP 1704 The nroff macros IP separates a paragraph 1705 That means, it must be a '.' 1706 followed by IP 1707 .LPIt does not matter, if afterwards some 1708 more characters follow. 1709 .SHAlso section boundaries from the nroff 1710 macros terminate a paragraph. That means 1711 a character like this: 1712 .NH 1713 End of text here 1714 1715 [DATA] 1716 call assert_equal(expected, getline(1, '$')) 1717 1718 norm! 0d} 1719 1720 let expected =<< trim [DATA] 1721 .LPIt does not matter, if afterwards some 1722 more characters follow. 1723 .SHAlso section boundaries from the nroff 1724 macros terminate a paragraph. That means 1725 a character like this: 1726 .NH 1727 End of text here 1728 1729 [DATA] 1730 call assert_equal(expected, getline(1, '$')) 1731 1732 $ 1733 norm! d{ 1734 1735 let expected =<< trim [DATA] 1736 .LPIt does not matter, if afterwards some 1737 more characters follow. 1738 .SHAlso section boundaries from the nroff 1739 macros terminate a paragraph. That means 1740 a character like this: 1741 1742 [DATA] 1743 call assert_equal(expected, getline(1, '$')) 1744 1745 norm! d{ 1746 1747 let expected =<< trim [DATA] 1748 .LPIt does not matter, if afterwards some 1749 more characters follow. 1750 1751 [DATA] 1752 call assert_equal(expected, getline(1, '$')) 1753 1754 " Test with { in cpooptions 1755 %d 1756 call append(0, text) 1757 set cpo+={ 1758 1 1759 norm! 0d2} 1760 1761 let expected =<< trim [DATA] 1762 { 1763 This is no paragraph 1764 unless the '{' is set 1765 in 'cpoptions' 1766 } 1767 .IP 1768 The nroff macros IP separates a paragraph 1769 That means, it must be a '.' 1770 followed by IP 1771 .LPIt does not matter, if afterwards some 1772 more characters follow. 1773 .SHAlso section boundaries from the nroff 1774 macros terminate a paragraph. That means 1775 a character like this: 1776 .NH 1777 End of text here 1778 1779 [DATA] 1780 call assert_equal(expected, getline(1, '$')) 1781 1782 $ 1783 norm! d} 1784 1785 let expected =<< trim [DATA] 1786 { 1787 This is no paragraph 1788 unless the '{' is set 1789 in 'cpoptions' 1790 } 1791 .IP 1792 The nroff macros IP separates a paragraph 1793 That means, it must be a '.' 1794 followed by IP 1795 .LPIt does not matter, if afterwards some 1796 more characters follow. 1797 .SHAlso section boundaries from the nroff 1798 macros terminate a paragraph. That means 1799 a character like this: 1800 .NH 1801 End of text here 1802 1803 [DATA] 1804 call assert_equal(expected, getline(1, '$')) 1805 1806 norm! gg} 1807 norm! d5} 1808 1809 let expected =<< trim [DATA] 1810 { 1811 This is no paragraph 1812 unless the '{' is set 1813 in 'cpoptions' 1814 } 1815 1816 [DATA] 1817 call assert_equal(expected, getline(1, '$')) 1818 1819 " Jumping to a fold should open the fold 1820 %d 1821 call setline(1, ['', 'one', 'two', '']) 1822 set foldenable 1823 2,$fold 1824 call feedkeys('}', 'xt') 1825 call assert_equal(4, line('.')) 1826 call assert_equal(1, foldlevel('.')) 1827 call assert_equal(-1, foldclosed('.')) 1828 set foldenable& 1829 1830 " clean up 1831 set cpo-={ 1832 bw! 1833endfunc 1834 1835" Test for section movements 1836func Test_normal_section() 1837 new 1838 let lines =<< trim [END] 1839 int foo() 1840 { 1841 if (1) 1842 { 1843 a = 1; 1844 } 1845 } 1846 [END] 1847 call setline(1, lines) 1848 1849 " jumping to a folded line using [[ should open the fold 1850 2,3fold 1851 call cursor(5, 1) 1852 call feedkeys("[[", 'xt') 1853 call assert_equal(2, line('.')) 1854 call assert_equal(-1, foldclosedend(line('.'))) 1855 1856 close! 1857endfunc 1858 1859" Test for ~ command 1860func Test_normal30_changecase() 1861 new 1862 call append(0, 'This is a simple test: äüöß') 1863 norm! 1ggVu 1864 call assert_equal('this is a simple test: äüöß', getline('.')) 1865 norm! VU 1866 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.')) 1867 norm! guu 1868 call assert_equal('this is a simple test: äüöss', getline('.')) 1869 norm! gUgU 1870 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.')) 1871 norm! gugu 1872 call assert_equal('this is a simple test: äüöss', getline('.')) 1873 norm! gUU 1874 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.')) 1875 norm! 010~ 1876 call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.')) 1877 norm! V~ 1878 call assert_equal('THIS IS A simple test: äüöss', getline('.')) 1879 1880 " Test for changing case across lines using 'whichwrap' 1881 call setline(1, ['aaaaaa', 'aaaaaa']) 1882 normal! gg10~ 1883 call assert_equal(['AAAAAA', 'aaaaaa'], getline(1, 2)) 1884 set whichwrap+=~ 1885 normal! gg10~ 1886 call assert_equal(['aaaaaa', 'AAAAaa'], getline(1, 2)) 1887 set whichwrap& 1888 1889 " clean up 1890 bw! 1891endfunc 1892 1893" Turkish ASCII turns to multi-byte. On some systems Turkish locale 1894" is available but toupper()/tolower() don't do the right thing. 1895func Test_normal_changecase_turkish() 1896 new 1897 try 1898 lang tr_TR.UTF-8 1899 set casemap= 1900 let iupper = toupper('i') 1901 if iupper == "\u0130" 1902 call setline(1, 'iI') 1903 1normal gUU 1904 call assert_equal("\u0130I", getline(1)) 1905 call assert_equal("\u0130I", toupper("iI")) 1906 1907 call setline(1, 'iI') 1908 1normal guu 1909 call assert_equal("i\u0131", getline(1)) 1910 call assert_equal("i\u0131", tolower("iI")) 1911 elseif iupper == "I" 1912 call setline(1, 'iI') 1913 1normal gUU 1914 call assert_equal("II", getline(1)) 1915 call assert_equal("II", toupper("iI")) 1916 1917 call setline(1, 'iI') 1918 1normal guu 1919 call assert_equal("ii", getline(1)) 1920 call assert_equal("ii", tolower("iI")) 1921 else 1922 call assert_true(false, "expected toupper('i') to be either 'I' or '\u0130'") 1923 endif 1924 set casemap& 1925 call setline(1, 'iI') 1926 1normal gUU 1927 call assert_equal("II", getline(1)) 1928 call assert_equal("II", toupper("iI")) 1929 1930 call setline(1, 'iI') 1931 1normal guu 1932 call assert_equal("ii", getline(1)) 1933 call assert_equal("ii", tolower("iI")) 1934 1935 lang en_US.UTF-8 1936 catch /E197:/ 1937 " can't use Turkish locale 1938 throw 'Skipped: Turkish locale not available' 1939 endtry 1940 close! 1941endfunc 1942 1943" Test for r (replace) command 1944func Test_normal31_r_cmd() 1945 new 1946 call append(0, 'This is a simple test: abcd') 1947 exe "norm! 1gg$r\<cr>" 1948 call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$')) 1949 exe "norm! 1gg2wlr\<cr>" 1950 call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$')) 1951 exe "norm! 2gg0W5r\<cr>" 1952 call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$')) 1953 set autoindent 1954 call setline(2, ['simple test: abc', '']) 1955 exe "norm! 2gg0W5r\<cr>" 1956 call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$')) 1957 exe "norm! 1ggVr\<cr>" 1958 call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1))) 1959 call setline(1, 'This is a') 1960 exe "norm! 1gg05rf" 1961 call assert_equal('fffffis a', getline(1)) 1962 1963 " When replacing characters, copy characters from above and below lines 1964 " using CTRL-Y and CTRL-E. 1965 " Different code paths are used for utf-8 and latin1 encodings 1966 set showmatch 1967 for enc in ['latin1', 'utf-8'] 1968 enew! 1969 let &encoding = enc 1970 call setline(1, [' {a}', 'xxxxxxxxxx', ' [b]']) 1971 exe "norm! 2gg5r\<C-Y>l5r\<C-E>" 1972 call assert_equal(' {a}x [b]x', getline(2)) 1973 endfor 1974 set showmatch& 1975 1976 " r command should fail in operator pending mode 1977 call assert_beeps('normal! cr') 1978 1979 " replace a tab character in visual mode 1980 %d 1981 call setline(1, ["a\tb", "c\td", "e\tf"]) 1982 normal gglvjjrx 1983 call assert_equal(['axx', 'xxx', 'xxf'], getline(1, '$')) 1984 1985 " clean up 1986 set noautoindent 1987 bw! 1988endfunc 1989 1990" Test for g*, g# 1991func Test_normal32_g_cmd1() 1992 new 1993 call append(0, ['abc.x_foo', 'x_foobar.abc']) 1994 1 1995 norm! $g* 1996 call assert_equal('x_foo', @/) 1997 call assert_equal('x_foobar.abc', getline('.')) 1998 norm! $g# 1999 call assert_equal('abc', @/) 2000 call assert_equal('abc.x_foo', getline('.')) 2001 2002 " clean up 2003 bw! 2004endfunc 2005 2006" Test for g`, g;, g,, g&, gv, gk, gj, gJ, g0, g^, g_, gm, g$, gM, g CTRL-G, 2007" gi and gI commands 2008func Test_normal33_g_cmd2() 2009 CheckFeature jumplist 2010 call Setup_NewWindow() 2011 " Test for g` 2012 clearjumps 2013 norm! ma10j 2014 let a=execute(':jumps') 2015 " empty jumplist 2016 call assert_equal('>', a[-1:]) 2017 norm! g`a 2018 call assert_equal('>', a[-1:]) 2019 call assert_equal(1, line('.')) 2020 call assert_equal('1', getline('.')) 2021 call cursor(10, 1) 2022 norm! g'a 2023 call assert_equal('>', a[-1:]) 2024 call assert_equal(1, line('.')) 2025 2026 " Test for g; and g, 2027 norm! g; 2028 " there is only one change in the changelist 2029 " currently, when we setup the window 2030 call assert_equal(2, line('.')) 2031 call assert_fails(':norm! g;', 'E662:') 2032 call assert_fails(':norm! g,', 'E663:') 2033 let &ul=&ul 2034 call append('$', ['a', 'b', 'c', 'd']) 2035 let &ul=&ul 2036 call append('$', ['Z', 'Y', 'X', 'W']) 2037 let a = execute(':changes') 2038 call assert_match('2\s\+0\s\+2', a) 2039 call assert_match('101\s\+0\s\+a', a) 2040 call assert_match('105\s\+0\s\+Z', a) 2041 norm! 3g; 2042 call assert_equal(2, line('.')) 2043 norm! 2g, 2044 call assert_equal(105, line('.')) 2045 2046 " Test for g& - global substitute 2047 %d 2048 call setline(1, range(1,10)) 2049 call append('$', ['a', 'b', 'c', 'd']) 2050 $s/\w/&&/g 2051 exe "norm! /[1-8]\<cr>" 2052 norm! g& 2053 call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$')) 2054 2055 " Jumping to a fold using gg should open the fold 2056 set foldenable 2057 set foldopen+=jump 2058 5,8fold 2059 call feedkeys('6gg', 'xt') 2060 call assert_equal(1, foldlevel('.')) 2061 call assert_equal(-1, foldclosed('.')) 2062 set foldopen-=jump 2063 set foldenable& 2064 2065 " Test for gv 2066 %d 2067 call append('$', repeat(['abcdefgh'], 8)) 2068 exe "norm! 2gg02l\<c-v>2j2ly" 2069 call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1)) 2070 " in visual mode, gv swaps current and last selected region 2071 exe "norm! G0\<c-v>4k4lgvd" 2072 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$')) 2073 exe "norm! G0\<c-v>4k4ly" 2074 exe "norm! gvood" 2075 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$')) 2076 " gv cannot be used in operator pending mode 2077 call assert_beeps('normal! cgv') 2078 " gv should beep without a previously selected visual area 2079 new 2080 call assert_beeps('normal! gv') 2081 close 2082 2083 " Test for gk/gj 2084 %d 2085 15vsp 2086 set wrap listchars= sbr= 2087 let lineA='abcdefghijklmnopqrstuvwxyz' 2088 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' 2089 let lineC='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' 2090 $put =lineA 2091 $put =lineB 2092 2093 norm! 3gg0dgk 2094 call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$')) 2095 set nu 2096 norm! 3gg0gjdgj 2097 call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$')) 2098 2099 " Test for gJ 2100 norm! 2gggJ 2101 call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$')) 2102 call assert_equal(16, col('.')) 2103 " shouldn't do anything 2104 norm! 10gJ 2105 call assert_equal(1, col('.')) 2106 2107 " Test for g0 g^ gm g$ 2108 exe "norm! 2gg0gji " 2109 call assert_equal(['', 'abcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$')) 2110 norm! g0yl 2111 call assert_equal(12, col('.')) 2112 call assert_equal(' ', getreg(0)) 2113 norm! g$yl 2114 call assert_equal(22, col('.')) 2115 call assert_equal('3', getreg(0)) 2116 norm! gmyl 2117 call assert_equal(17, col('.')) 2118 call assert_equal('n', getreg(0)) 2119 norm! g^yl 2120 call assert_equal(15, col('.')) 2121 call assert_equal('l', getreg(0)) 2122 call assert_beeps('normal 5g$') 2123 2124 " Test for g_ 2125 call assert_beeps('normal! 100g_') 2126 call setline(2, [' foo ', ' foobar ']) 2127 normal! 2ggg_ 2128 call assert_equal(5, col('.')) 2129 normal! 2g_ 2130 call assert_equal(8, col('.')) 2131 2132 norm! 2ggdG 2133 $put =lineC 2134 2135 " Test for gM 2136 norm! gMyl 2137 call assert_equal(73, col('.')) 2138 call assert_equal('0', getreg(0)) 2139 " Test for 20gM 2140 norm! 20gMyl 2141 call assert_equal(29, col('.')) 2142 call assert_equal('S', getreg(0)) 2143 " Test for 60gM 2144 norm! 60gMyl 2145 call assert_equal(87, col('.')) 2146 call assert_equal('E', getreg(0)) 2147 2148 " Test for g Ctrl-G 2149 set ff=unix 2150 let a=execute(":norm! g\<c-g>") 2151 call assert_match('Col 87 of 144; Line 2 of 2; Word 1 of 1; Byte 88 of 146', a) 2152 2153 " Test for gI 2154 norm! gIfoo 2155 call assert_equal(['', 'foo0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'], getline(1,'$')) 2156 2157 " Test for gi 2158 wincmd c 2159 %d 2160 set tw=0 2161 call setline(1, ['foobar', 'new line']) 2162 norm! A next word 2163 $put ='third line' 2164 norm! gi another word 2165 call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$')) 2166 call setline(1, 'foobar') 2167 normal! Ggifirst line 2168 call assert_equal('foobarfirst line', getline(1)) 2169 " Test gi in 'virtualedit' mode with cursor after the end of the line 2170 set virtualedit=all 2171 call setline(1, 'foo') 2172 exe "normal! Abar\<Right>\<Right>\<Right>\<Right>" 2173 call setline(1, 'foo') 2174 normal! Ggifirst line 2175 call assert_equal('foo first line', getline(1)) 2176 set virtualedit& 2177 2178 " Test for aboring a g command using CTRL-\ CTRL-G 2179 exe "normal! g\<C-\>\<C-G>" 2180 call assert_equal('foo first line', getline('.')) 2181 2182 " clean up 2183 bw! 2184endfunc 2185 2186" Test for g CTRL-G 2187func Test_g_ctrl_g() 2188 new 2189 2190 let a = execute(":norm! g\<c-g>") 2191 call assert_equal("\n--No lines in buffer--", a) 2192 2193 " Test for CTRL-G (same as :file) 2194 let a = execute(":norm! \<c-g>") 2195 call assert_equal("\n\n\"[No Name]\" --No lines in buffer--", a) 2196 2197 call setline(1, ['first line', 'second line']) 2198 2199 " Test g CTRL-g with dos, mac and unix file type. 2200 norm! gojll 2201 set ff=dos 2202 let a = execute(":norm! g\<c-g>") 2203 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 15 of 25", a) 2204 2205 set ff=mac 2206 let a = execute(":norm! g\<c-g>") 2207 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a) 2208 2209 set ff=unix 2210 let a = execute(":norm! g\<c-g>") 2211 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a) 2212 2213 " Test g CTRL-g in visual mode (v) 2214 let a = execute(":norm! gojllvlg\<c-g>") 2215 call assert_equal("\nSelected 1 of 2 Lines; 1 of 4 Words; 2 of 23 Bytes", a) 2216 2217 " Test g CTRL-g in visual mode (CTRL-V) with end col > start col 2218 let a = execute(":norm! \<Esc>gojll\<C-V>kllg\<c-g>") 2219 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a) 2220 2221 " Test g_CTRL-g in visual mode (CTRL-V) with end col < start col 2222 let a = execute(":norm! \<Esc>goll\<C-V>jhhg\<c-g>") 2223 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a) 2224 2225 " Test g CTRL-g in visual mode (CTRL-V) with end_vcol being MAXCOL 2226 let a = execute(":norm! \<Esc>gojll\<C-V>k$g\<c-g>") 2227 call assert_equal("\nSelected 2 of 2 Lines; 4 of 4 Words; 17 of 23 Bytes", a) 2228 2229 " There should be one byte less with noeol 2230 set bin noeol 2231 let a = execute(":norm! \<Esc>gog\<c-g>") 2232 call assert_equal("\nCol 1 of 10; Line 1 of 2; Word 1 of 4; Char 1 of 23; Byte 1 of 22", a) 2233 set bin & eol& 2234 2235 call setline(1, ['Français', '日本語']) 2236 2237 let a = execute(":norm! \<Esc>gojlg\<c-g>") 2238 call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20", a) 2239 2240 let a = execute(":norm! \<Esc>gojvlg\<c-g>") 2241 call assert_equal("\nSelected 1 of 2 Lines; 1 of 2 Words; 2 of 13 Chars; 6 of 20 Bytes", a) 2242 2243 let a = execute(":norm! \<Esc>goll\<c-v>jlg\<c-g>") 2244 call assert_equal("\nSelected 4 Cols; 2 of 2 Lines; 2 of 2 Words; 6 of 13 Chars; 11 of 20 Bytes", a) 2245 2246 set fenc=utf8 bomb 2247 let a = execute(":norm! \<Esc>gojlg\<c-g>") 2248 call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+3 for BOM)", a) 2249 2250 set fenc=utf16 bomb 2251 let a = execute(":norm! g\<c-g>") 2252 call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+2 for BOM)", a) 2253 2254 set fenc=utf32 bomb 2255 let a = execute(":norm! g\<c-g>") 2256 call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+4 for BOM)", a) 2257 2258 set fenc& bomb& 2259 2260 set ff& 2261 bwipe! 2262endfunc 2263 2264" Test for g8 2265func Test_normal34_g_cmd3() 2266 new 2267 let a=execute(':norm! 1G0g8') 2268 call assert_equal("\nNUL", a) 2269 2270 call setline(1, 'abcdefghijklmnopqrstuvwxyzäüö') 2271 let a=execute(':norm! 1G$g8') 2272 call assert_equal("\nc3 b6 ", a) 2273 2274 call setline(1, "a\u0302") 2275 let a=execute(':norm! 1G0g8') 2276 call assert_equal("\n61 + cc 82 ", a) 2277 2278 " clean up 2279 bw! 2280endfunc 2281 2282" Test 8g8 which finds invalid utf8 at or after the cursor. 2283func Test_normal_8g8() 2284 new 2285 2286 " With invalid byte. 2287 call setline(1, "___\xff___") 2288 norm! 1G08g8g 2289 call assert_equal([0, 1, 4, 0, 1], getcurpos()) 2290 2291 " With invalid byte before the cursor. 2292 call setline(1, "___\xff___") 2293 norm! 1G$h8g8g 2294 call assert_equal([0, 1, 6, 0, 9], getcurpos()) 2295 2296 " With truncated sequence. 2297 call setline(1, "___\xE2\x82___") 2298 norm! 1G08g8g 2299 call assert_equal([0, 1, 4, 0, 1], getcurpos()) 2300 2301 " With overlong sequence. 2302 call setline(1, "___\xF0\x82\x82\xAC___") 2303 norm! 1G08g8g 2304 call assert_equal([0, 1, 4, 0, 1], getcurpos()) 2305 2306 " With valid utf8. 2307 call setline(1, "café") 2308 norm! 1G08g8 2309 call assert_equal([0, 1, 1, 0, 1], getcurpos()) 2310 2311 bw! 2312endfunc 2313 2314" Test for g< 2315func Test_normal35_g_cmd4() 2316 " Cannot capture its output, 2317 " probably a bug, therefore, test disabled: 2318 throw "Skipped: output of g< can't be tested currently" 2319 echo "a\nb\nc\nd" 2320 let b=execute(':norm! g<') 2321 call assert_true(!empty(b), 'failed `execute(g<)`') 2322endfunc 2323 2324" Test for gp gP go 2325func Test_normal36_g_cmd5() 2326 new 2327 call append(0, 'abcdefghijklmnopqrstuvwxyz') 2328 set ff=unix 2329 " Test for gp gP 2330 call append(1, range(1,10)) 2331 1 2332 norm! 1yy 2333 3 2334 norm! gp 2335 call assert_equal([0, 5, 1, 0, 1], getcurpos()) 2336 $ 2337 norm! gP 2338 call assert_equal([0, 14, 1, 0, 1], getcurpos()) 2339 2340 " Test for go 2341 norm! 26go 2342 call assert_equal([0, 1, 26, 0, 26], getcurpos()) 2343 norm! 27go 2344 call assert_equal([0, 1, 26, 0, 26], getcurpos()) 2345 norm! 28go 2346 call assert_equal([0, 2, 1, 0, 1], getcurpos()) 2347 set ff=dos 2348 norm! 29go 2349 call assert_equal([0, 2, 1, 0, 1], getcurpos()) 2350 set ff=unix 2351 norm! gg0 2352 norm! 101go 2353 call assert_equal([0, 13, 26, 0, 26], getcurpos()) 2354 norm! 103go 2355 call assert_equal([0, 14, 1, 0, 1], getcurpos()) 2356 " count > buffer content 2357 norm! 120go 2358 call assert_equal([0, 14, 1, 0, 2147483647], getcurpos()) 2359 " clean up 2360 bw! 2361endfunc 2362 2363" Test for gt and gT 2364func Test_normal37_g_cmd6() 2365 tabnew 1.txt 2366 tabnew 2.txt 2367 tabnew 3.txt 2368 norm! 1gt 2369 call assert_equal(1, tabpagenr()) 2370 norm! 3gt 2371 call assert_equal(3, tabpagenr()) 2372 norm! 1gT 2373 " count gT goes not to the absolute tabpagenumber 2374 " but, but goes to the count previous tabpagenumber 2375 call assert_equal(2, tabpagenr()) 2376 " wrap around 2377 norm! 3gT 2378 call assert_equal(3, tabpagenr()) 2379 " gt does not wrap around 2380 norm! 5gt 2381 call assert_equal(3, tabpagenr()) 2382 2383 for i in range(3) 2384 tabclose 2385 endfor 2386 " clean up 2387 call assert_fails(':tabclose', 'E784:') 2388endfunc 2389 2390" Test for <Home> and <C-Home> key 2391func Test_normal38_nvhome() 2392 new 2393 call setline(1, range(10)) 2394 $ 2395 setl et sw=2 2396 norm! V10>$ 2397 " count is ignored 2398 exe "norm! 10\<home>" 2399 call assert_equal(1, col('.')) 2400 exe "norm! \<home>" 2401 call assert_equal([0, 10, 1, 0, 1], getcurpos()) 2402 exe "norm! 5\<c-home>" 2403 call assert_equal([0, 5, 1, 0, 1], getcurpos()) 2404 exe "norm! \<c-home>" 2405 call assert_equal([0, 1, 1, 0, 1], getcurpos()) 2406 exe "norm! G\<c-kHome>" 2407 call assert_equal([0, 1, 1, 0, 1], getcurpos()) 2408 2409 " clean up 2410 bw! 2411endfunc 2412 2413" Test for <End> and <C-End> keys 2414func Test_normal_nvend() 2415 new 2416 call setline(1, map(range(1, 10), '"line" .. v:val')) 2417 exe "normal! \<End>" 2418 call assert_equal(5, col('.')) 2419 exe "normal! 4\<End>" 2420 call assert_equal([4, 5], [line('.'), col('.')]) 2421 exe "normal! \<C-End>" 2422 call assert_equal([10, 6], [line('.'), col('.')]) 2423 close! 2424endfunc 2425 2426" Test for cw cW ce 2427func Test_normal39_cw() 2428 " Test for cw and cW on whitespace 2429 new 2430 set tw=0 2431 call append(0, 'here are some words') 2432 norm! 1gg0elcwZZZ 2433 call assert_equal('hereZZZare some words', getline('.')) 2434 norm! 1gg0elcWYYY 2435 call assert_equal('hereZZZareYYYsome words', getline('.')) 2436 norm! 2gg0cwfoo 2437 call assert_equal('foo', getline('.')) 2438 2439 call setline(1, 'one; two') 2440 call cursor(1, 1) 2441 call feedkeys('cwvim', 'xt') 2442 call assert_equal('vim; two', getline(1)) 2443 call feedkeys('0cWone', 'xt') 2444 call assert_equal('one two', getline(1)) 2445 "When cursor is at the end of a word 'ce' will change until the end of the 2446 "next word, but 'cw' will change only one character 2447 call setline(1, 'one two') 2448 call feedkeys('0ecwce', 'xt') 2449 call assert_equal('once two', getline(1)) 2450 call setline(1, 'one two') 2451 call feedkeys('0ecely', 'xt') 2452 call assert_equal('only', getline(1)) 2453 2454 " clean up 2455 bw! 2456endfunc 2457 2458" Test for CTRL-\ commands 2459func Test_normal40_ctrl_bsl() 2460 new 2461 call append(0, 'here are some words') 2462 exe "norm! 1gg0a\<C-\>\<C-N>" 2463 call assert_equal('n', mode()) 2464 call assert_equal(1, col('.')) 2465 call assert_equal('', visualmode()) 2466 exe "norm! 1gg0viw\<C-\>\<C-N>" 2467 call assert_equal('n', mode()) 2468 call assert_equal(4, col('.')) 2469 exe "norm! 1gg0a\<C-\>\<C-G>" 2470 call assert_equal('n', mode()) 2471 call assert_equal(1, col('.')) 2472 "imap <buffer> , <c-\><c-n> 2473 set im 2474 exe ":norm! \<c-\>\<c-n>dw" 2475 set noim 2476 call assert_equal('are some words', getline(1)) 2477 call assert_false(&insertmode) 2478 call assert_beeps("normal! \<C-\>\<C-A>", 'xt') 2479 2480 " Using CTRL-\ CTRL-N in cmd window should close the window 2481 call feedkeys("q:\<C-\>\<C-N>", 'xt') 2482 call assert_equal('', getcmdwintype()) 2483 2484 " clean up 2485 bw! 2486endfunc 2487 2488" Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>= in insert mode 2489func Test_normal41_insert_reg() 2490 new 2491 set sts=2 sw=2 ts=8 tw=0 2492 call append(0, ["aaa\tbbb\tccc", '', '', '']) 2493 let a=getline(1) 2494 norm! 2gg0 2495 exe "norm! a\<c-r>=a\<cr>" 2496 norm! 3gg0 2497 exe "norm! a\<c-r>\<c-r>=a\<cr>" 2498 norm! 4gg0 2499 exe "norm! a\<c-r>\<c-o>=a\<cr>" 2500 call assert_equal(['aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', ''], getline(1, '$')) 2501 2502 " clean up 2503 set sts=0 sw=8 ts=8 2504 bw! 2505endfunc 2506 2507" Test for Ctrl-D and Ctrl-U 2508func Test_normal42_halfpage() 2509 call Setup_NewWindow() 2510 call assert_equal(5, &scroll) 2511 exe "norm! \<c-d>" 2512 call assert_equal('6', getline('.')) 2513 exe "norm! 2\<c-d>" 2514 call assert_equal('8', getline('.')) 2515 call assert_equal(2, &scroll) 2516 set scroll=5 2517 exe "norm! \<c-u>" 2518 call assert_equal('3', getline('.')) 2519 1 2520 set scrolloff=5 2521 exe "norm! \<c-d>" 2522 call assert_equal('10', getline('.')) 2523 exe "norm! \<c-u>" 2524 call assert_equal('5', getline('.')) 2525 1 2526 set scrolloff=99 2527 exe "norm! \<c-d>" 2528 call assert_equal('10', getline('.')) 2529 set scrolloff=0 2530 100 2531 exe "norm! $\<c-u>" 2532 call assert_equal('95', getline('.')) 2533 call assert_equal([0, 95, 1, 0, 1], getcurpos()) 2534 100 2535 set nostartofline 2536 exe "norm! $\<c-u>" 2537 call assert_equal('95', getline('.')) 2538 call assert_equal([0, 95, 2, 0, 2147483647], getcurpos()) 2539 " cleanup 2540 set startofline 2541 bw! 2542endfunc 2543 2544func Test_normal45_drop() 2545 if !has('dnd') 2546 " The ~ register does not exist 2547 call assert_beeps('norm! "~') 2548 return 2549 endif 2550 2551 " basic test for drag-n-drop 2552 " unfortunately, without a gui, we can't really test much here, 2553 " so simply test that ~p fails (which uses the drop register) 2554 new 2555 call assert_fails(':norm! "~p', 'E353:') 2556 call assert_equal([], getreg('~', 1, 1)) 2557 " the ~ register is read only 2558 call assert_fails(':let @~="1"', 'E354:') 2559 bw! 2560endfunc 2561 2562func Test_normal46_ignore() 2563 new 2564 " How to test this? 2565 " let's just for now test, that the buffer 2566 " does not change 2567 call feedkeys("\<c-s>", 't') 2568 call assert_equal([''], getline(1,'$')) 2569 2570 " no valid commands 2571 exe "norm! \<char-0x100>" 2572 call assert_equal([''], getline(1,'$')) 2573 2574 exe "norm! ä" 2575 call assert_equal([''], getline(1,'$')) 2576 2577 " clean up 2578 bw! 2579endfunc 2580 2581func Test_normal47_visual_buf_wipe() 2582 " This was causing a crash or ml_get error. 2583 enew! 2584 call setline(1,'xxx') 2585 normal $ 2586 new 2587 call setline(1, range(1,2)) 2588 2 2589 exe "norm \<C-V>$" 2590 bw! 2591 norm yp 2592 set nomodified 2593endfunc 2594 2595func Test_normal48_wincmd() 2596 new 2597 exe "norm! \<c-w>c" 2598 call assert_equal(1, winnr('$')) 2599 call assert_fails(":norm! \<c-w>c", 'E444:') 2600endfunc 2601 2602func Test_normal49_counts() 2603 new 2604 call setline(1, 'one two three four five six seven eight nine ten') 2605 1 2606 norm! 3d2w 2607 call assert_equal('seven eight nine ten', getline(1)) 2608 bw! 2609endfunc 2610 2611func Test_normal50_commandline() 2612 CheckFeature timers 2613 CheckFeature cmdline_hist 2614 func! DoTimerWork(id) 2615 call assert_equal('[Command Line]', bufname('')) 2616 " should fail, with E11, but does fail with E23? 2617 "call feedkeys("\<c-^>", 'tm') 2618 2619 " should also fail with E11 2620 call assert_fails(":wincmd p", 'E11:') 2621 " return from commandline window 2622 call feedkeys("\<cr>") 2623 endfunc 2624 2625 let oldlang=v:lang 2626 lang C 2627 set updatetime=20 2628 call timer_start(100, 'DoTimerWork') 2629 try 2630 " throws E23, for whatever reason... 2631 call feedkeys('q:', 'x!') 2632 catch /E23/ 2633 " no-op 2634 endtry 2635 " clean up 2636 set updatetime=4000 2637 exe "lang" oldlang 2638 bw! 2639endfunc 2640 2641func Test_normal51_FileChangedRO() 2642 CheckFeature autocmd 2643 " Don't sleep after the warning message. 2644 call test_settime(1) 2645 call writefile(['foo'], 'Xreadonly.log') 2646 new Xreadonly.log 2647 setl ro 2648 au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix') 2649 call assert_fails(":norm! Af", 'E788:') 2650 call assert_equal(['foo'], getline(1,'$')) 2651 call assert_equal('Xreadonly.log', bufname('')) 2652 2653 " cleanup 2654 call test_settime(0) 2655 bw! 2656 call delete("Xreadonly.log") 2657endfunc 2658 2659func Test_normal52_rl() 2660 CheckFeature rightleft 2661 new 2662 call setline(1, 'abcde fghij klmnopq') 2663 norm! 1gg$ 2664 set rl 2665 call assert_equal(19, col('.')) 2666 call feedkeys('l', 'tx') 2667 call assert_equal(18, col('.')) 2668 call feedkeys('h', 'tx') 2669 call assert_equal(19, col('.')) 2670 call feedkeys("\<right>", 'tx') 2671 call assert_equal(18, col('.')) 2672 call feedkeys("\<left>", 'tx') 2673 call assert_equal(19, col('.')) 2674 call feedkeys("\<s-right>", 'tx') 2675 call assert_equal(13, col('.')) 2676 call feedkeys("\<c-right>", 'tx') 2677 call assert_equal(7, col('.')) 2678 call feedkeys("\<c-left>", 'tx') 2679 call assert_equal(13, col('.')) 2680 call feedkeys("\<s-left>", 'tx') 2681 call assert_equal(19, col('.')) 2682 call feedkeys("<<", 'tx') 2683 call assert_equal(' abcde fghij klmnopq',getline(1)) 2684 call feedkeys(">>", 'tx') 2685 call assert_equal('abcde fghij klmnopq',getline(1)) 2686 2687 " cleanup 2688 set norl 2689 bw! 2690endfunc 2691 2692func Test_normal54_Ctrl_bsl() 2693 new 2694 call setline(1, 'abcdefghijklmn') 2695 exe "norm! df\<c-\>\<c-n>" 2696 call assert_equal(['abcdefghijklmn'], getline(1,'$')) 2697 exe "norm! df\<c-\>\<c-g>" 2698 call assert_equal(['abcdefghijklmn'], getline(1,'$')) 2699 exe "norm! df\<c-\>m" 2700 call assert_equal(['abcdefghijklmn'], getline(1,'$')) 2701 2702 call setline(2, 'abcdefghijklmnāf') 2703 norm! 2gg0 2704 exe "norm! df\<Char-0x101>" 2705 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$')) 2706 norm! 1gg0 2707 exe "norm! df\<esc>" 2708 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$')) 2709 2710 " clean up 2711 bw! 2712endfunc 2713 2714func Test_normal_large_count() 2715 " This may fail with 32bit long, how do we detect that? 2716 new 2717 normal o 2718 normal 6666666666dL 2719 bwipe! 2720endfunc 2721 2722func Test_delete_until_paragraph() 2723 new 2724 normal grádv} 2725 call assert_equal('á', getline(1)) 2726 normal grád} 2727 call assert_equal('', getline(1)) 2728 bwipe! 2729endfunc 2730 2731" Test for the gr (virtual replace) command 2732" Test for the bug fixed by 7.4.387 2733func Test_gr_command() 2734 enew! 2735 let save_cpo = &cpo 2736 call append(0, ['First line', 'Second line', 'Third line']) 2737 exe "normal i\<C-G>u" 2738 call cursor(2, 1) 2739 set cpo-=X 2740 normal 4gro 2741 call assert_equal('oooond line', getline(2)) 2742 undo 2743 set cpo+=X 2744 normal 4gro 2745 call assert_equal('ooooecond line', getline(2)) 2746 let &cpo = save_cpo 2747 normal! ggvegrx 2748 call assert_equal('xxxxx line', getline(1)) 2749 exe "normal! gggr\<C-V>122" 2750 call assert_equal('zxxxx line', getline(1)) 2751 set virtualedit=all 2752 normal! 15|grl 2753 call assert_equal('zxxxx line l', getline(1)) 2754 set virtualedit& 2755 set nomodifiable 2756 call assert_fails('normal! grx', 'E21:') 2757 call assert_fails('normal! gRx', 'E21:') 2758 set modifiable& 2759 enew! 2760endfunc 2761 2762" When splitting a window the changelist position is wrong. 2763" Test the changelist position after splitting a window. 2764" Test for the bug fixed by 7.4.386 2765func Test_changelist() 2766 let save_ul = &ul 2767 enew! 2768 call append('$', ['1', '2']) 2769 exe "normal i\<C-G>u" 2770 exe "normal Gkylpa\<C-G>u" 2771 set ul=100 2772 exe "normal Gylpa\<C-G>u" 2773 set ul=100 2774 normal gg 2775 vsplit 2776 normal g; 2777 call assert_equal([3, 2], [line('.'), col('.')]) 2778 normal g; 2779 call assert_equal([2, 2], [line('.'), col('.')]) 2780 call assert_fails('normal g;', 'E662:') 2781 new 2782 call assert_fails('normal g;', 'E664:') 2783 %bwipe! 2784 let &ul = save_ul 2785endfunc 2786 2787func Test_nv_hat_count() 2788 %bwipeout! 2789 let l:nr = bufnr('%') + 1 2790 call assert_fails(':execute "normal! ' . l:nr . '\<C-^>"', 'E92:') 2791 2792 edit Xfoo 2793 let l:foo_nr = bufnr('Xfoo') 2794 2795 edit Xbar 2796 let l:bar_nr = bufnr('Xbar') 2797 2798 " Make sure we are not just using the alternate file. 2799 edit Xbaz 2800 2801 call feedkeys(l:foo_nr . "\<C-^>", 'tx') 2802 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t')) 2803 2804 call feedkeys(l:bar_nr . "\<C-^>", 'tx') 2805 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t')) 2806 2807 %bwipeout! 2808endfunc 2809 2810func Test_message_when_using_ctrl_c() 2811 " Make sure no buffers are changed. 2812 %bwipe! 2813 2814 exe "normal \<C-C>" 2815 call assert_match("Type :qa and press <Enter> to exit Vim", Screenline(&lines)) 2816 2817 new 2818 cal setline(1, 'hi!') 2819 exe "normal \<C-C>" 2820 call assert_match("Type :qa! and press <Enter> to abandon all changes and exit Vim", Screenline(&lines)) 2821 2822 bwipe! 2823endfunc 2824 2825" Test for '[m', ']m', '[M' and ']M' 2826" Jumping to beginning and end of methods in Java-like languages 2827func Test_java_motion() 2828 new 2829 call assert_beeps('normal! [m') 2830 call assert_beeps('normal! ]m') 2831 call assert_beeps('normal! [M') 2832 call assert_beeps('normal! ]M') 2833 let lines =<< trim [CODE] 2834 Piece of Java 2835 { 2836 tt m1 { 2837 t1; 2838 } e1 2839 2840 tt m2 { 2841 t2; 2842 } e2 2843 2844 tt m3 { 2845 if (x) 2846 { 2847 t3; 2848 } 2849 } e3 2850 } 2851 [CODE] 2852 call setline(1, lines) 2853 2854 normal gg 2855 2856 normal 2]maA 2857 call assert_equal("\ttt m1 {A", getline('.')) 2858 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')]) 2859 2860 normal j]maB 2861 call assert_equal("\ttt m2 {B", getline('.')) 2862 call assert_equal([7, 9, 16], [line('.'), col('.'), virtcol('.')]) 2863 2864 normal ]maC 2865 call assert_equal("\ttt m3 {C", getline('.')) 2866 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')]) 2867 2868 normal [maD 2869 call assert_equal("\ttt m3 {DC", getline('.')) 2870 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')]) 2871 2872 normal k2[maE 2873 call assert_equal("\ttt m1 {EA", getline('.')) 2874 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')]) 2875 2876 normal 3[maF 2877 call assert_equal("{F", getline('.')) 2878 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')]) 2879 2880 normal ]MaG 2881 call assert_equal("\t}G e1", getline('.')) 2882 call assert_equal([5, 3, 10], [line('.'), col('.'), virtcol('.')]) 2883 2884 normal j2]MaH 2885 call assert_equal("\t}H e3", getline('.')) 2886 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')]) 2887 2888 normal ]M]M 2889 normal aI 2890 call assert_equal("}I", getline('.')) 2891 call assert_equal([17, 2, 2], [line('.'), col('.'), virtcol('.')]) 2892 2893 normal 2[MaJ 2894 call assert_equal("\t}JH e3", getline('.')) 2895 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')]) 2896 2897 normal k[MaK 2898 call assert_equal("\t}K e2", getline('.')) 2899 call assert_equal([9, 3, 10], [line('.'), col('.'), virtcol('.')]) 2900 2901 normal 3[MaL 2902 call assert_equal("{LF", getline('.')) 2903 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')]) 2904 2905 call cursor(2, 1) 2906 call assert_beeps('norm! 5]m') 2907 2908 " jumping to a method in a fold should open the fold 2909 6,10fold 2910 call feedkeys("gg3]m", 'xt') 2911 call assert_equal([7, 8, 15], [line('.'), col('.'), virtcol('.')]) 2912 call assert_equal(-1, foldclosedend(7)) 2913 2914 close! 2915endfunc 2916 2917" Tests for g cmds 2918func Test_normal_gdollar_cmd() 2919 CheckFeature jumplist 2920 call Setup_NewWindow() 2921 " Make long lines that will wrap 2922 %s/$/\=repeat(' foobar', 10)/ 2923 20vsp 2924 set wrap 2925 " Test for g$ with count 2926 norm! gg 2927 norm! 0vg$y 2928 call assert_equal(20, col("'>")) 2929 call assert_equal('1 foobar foobar foob', getreg(0)) 2930 norm! gg 2931 norm! 0v4g$y 2932 call assert_equal(72, col("'>")) 2933 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.."\n", getreg(0)) 2934 norm! gg 2935 norm! 0v6g$y 2936 call assert_equal(40, col("'>")) 2937 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 2938 \ '2 foobar foobar foobar foobar foobar foo', getreg(0)) 2939 set nowrap 2940 " clean up 2941 norm! gg 2942 norm! 0vg$y 2943 call assert_equal(20, col("'>")) 2944 call assert_equal('1 foobar foobar foob', getreg(0)) 2945 norm! gg 2946 norm! 0v4g$y 2947 call assert_equal(20, col("'>")) 2948 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 2949 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 2950 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 2951 \ '4 foobar foobar foob', getreg(0)) 2952 norm! gg 2953 norm! 0v6g$y 2954 call assert_equal(20, col("'>")) 2955 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 2956 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 2957 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 2958 \ '4 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 2959 \ '5 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 2960 \ '6 foobar foobar foob', getreg(0)) 2961 " Move to last line, also down movement is not possible, should still move 2962 " the cursor to the last visible char 2963 norm! G 2964 norm! 0v6g$y 2965 call assert_equal(20, col("'>")) 2966 call assert_equal('100 foobar foobar fo', getreg(0)) 2967 bw! 2968endfunc 2969 2970func Test_normal_gk_gj() 2971 " needs 80 column new window 2972 new 2973 vert 80new 2974 call assert_beeps('normal gk') 2975 put =[repeat('x',90)..' {{{1', 'x {{{1'] 2976 norm! gk 2977 " In a 80 column wide terminal the window will be only 78 char 2978 " (because Vim will leave space for the other window), 2979 " but if the terminal is larger, it will be 80 chars, so verify the 2980 " cursor column correctly. 2981 call assert_equal(winwidth(0)+1, col('.')) 2982 call assert_equal(winwidth(0)+1, virtcol('.')) 2983 norm! j 2984 call assert_equal(6, col('.')) 2985 call assert_equal(6, virtcol('.')) 2986 norm! gk 2987 call assert_equal(95, col('.')) 2988 call assert_equal(95, virtcol('.')) 2989 %bw! 2990 2991 " needs 80 column new window 2992 new 2993 vert 80new 2994 call assert_beeps('normal gj') 2995 set number 2996 set numberwidth=10 2997 set cpoptions+=n 2998 put =[repeat('0',90), repeat('1',90)] 2999 norm! 075l 3000 call assert_equal(76, col('.')) 3001 norm! gk 3002 call assert_equal(1, col('.')) 3003 norm! gk 3004 call assert_equal(76, col('.')) 3005 norm! gk 3006 call assert_equal(1, col('.')) 3007 norm! gj 3008 call assert_equal(76, col('.')) 3009 norm! gj 3010 call assert_equal(1, col('.')) 3011 norm! gj 3012 call assert_equal(76, col('.')) 3013 " When 'nowrap' is set, gk and gj behave like k and j 3014 set nowrap 3015 normal! gk 3016 call assert_equal([2, 76], [line('.'), col('.')]) 3017 normal! gj 3018 call assert_equal([3, 76], [line('.'), col('.')]) 3019 %bw! 3020 set cpoptions& number& numberwidth& wrap& 3021endfunc 3022 3023" Test for using : to run a multi-line Ex command in operator pending mode 3024func Test_normal_yank_with_excmd() 3025 new 3026 call setline(1, ['foo', 'bar', 'baz']) 3027 let @a = '' 3028 call feedkeys("\"ay:if v:true\<CR>normal l\<CR>endif\<CR>", 'xt') 3029 call assert_equal('f', @a) 3030 close! 3031endfunc 3032 3033" Test for supplying a count to a normal-mode command across a cursorhold call 3034func Test_normal_cursorhold_with_count() 3035 func s:cHold() 3036 let g:cHold_Called += 1 3037 endfunc 3038 new 3039 augroup normalcHoldTest 3040 au! 3041 au CursorHold <buffer> call s:cHold() 3042 augroup END 3043 let g:cHold_Called = 0 3044 call feedkeys("3\<CursorHold>2ix", 'xt') 3045 call assert_equal(1, g:cHold_Called) 3046 call assert_equal(repeat('x', 32), getline(1)) 3047 augroup normalcHoldTest 3048 au! 3049 augroup END 3050 au! normalcHoldTest 3051 close! 3052 delfunc s:cHold 3053endfunc 3054 3055" Test for using a count and a command with CTRL-W 3056func Test_wincmd_with_count() 3057 call feedkeys("\<C-W>12n", 'xt') 3058 call assert_equal(12, winheight(0)) 3059endfunc 3060 3061" Test for 'b', 'B' 'ge' and 'gE' commands 3062func Test_horiz_motion() 3063 new 3064 normal! gg 3065 call assert_beeps('normal! b') 3066 call assert_beeps('normal! B') 3067 call assert_beeps('normal! gE') 3068 call assert_beeps('normal! ge') 3069 " <S-Backspace> moves one word left and <C-Backspace> moves one WORD left 3070 call setline(1, 'one ,two ,three') 3071 exe "normal! $\<S-BS>" 3072 call assert_equal(11, col('.')) 3073 exe "normal! $\<C-BS>" 3074 call assert_equal(10, col('.')) 3075 close! 3076endfunc 3077 3078" Test for using a : command in operator pending mode 3079func Test_normal_colon_op() 3080 new 3081 call setline(1, ['one', 'two']) 3082 call assert_beeps("normal! Gc:d\<CR>") 3083 close! 3084endfunc 3085 3086" Test for d and D commands 3087func Test_normal_delete_cmd() 3088 new 3089 " D in an empty line 3090 call setline(1, '') 3091 normal D 3092 call assert_equal('', getline(1)) 3093 " D in an empty line in virtualedit mode 3094 set virtualedit=all 3095 normal D 3096 call assert_equal('', getline(1)) 3097 set virtualedit& 3098 " delete to a readonly register 3099 call setline(1, ['abcd']) 3100 call assert_beeps('normal ":d2l') 3101 close! 3102endfunc 3103 3104" Test for deleting or changing characters across lines with 'whichwrap' 3105" containing 's'. Should count <EOL> as one character. 3106func Test_normal_op_across_lines() 3107 new 3108 set whichwrap& 3109 call setline(1, ['one two', 'three four']) 3110 exe "norm! $3d\<Space>" 3111 call assert_equal(['one twhree four'], getline(1, '$')) 3112 3113 call setline(1, ['one two', 'three four']) 3114 exe "norm! $3c\<Space>x" 3115 call assert_equal(['one twxhree four'], getline(1, '$')) 3116 3117 set whichwrap+=l 3118 call setline(1, ['one two', 'three four']) 3119 exe "norm! $3x" 3120 call assert_equal(['one twhree four'], getline(1, '$')) 3121 close! 3122 set whichwrap& 3123endfunc 3124 3125" Test for 'w' and 'b' commands 3126func Test_normal_word_move() 3127 new 3128 call setline(1, ['foo bar a', '', 'foo bar b']) 3129 " copy a single character word at the end of a line 3130 normal 1G$yw 3131 call assert_equal('a', @") 3132 " copy a single character word at the end of a file 3133 normal G$yw 3134 call assert_equal('b', @") 3135 " check for a word movement handling an empty line properly 3136 normal 1G$vwy 3137 call assert_equal("a\n\n", @") 3138 3139 " copy using 'b' command 3140 %d 3141 " non-empty blank line at the start of file 3142 call setline(1, [' ', 'foo bar']) 3143 normal 2Gyb 3144 call assert_equal(" \n", @") 3145 " try to copy backwards from the start of the file 3146 call setline(1, ['one two', 'foo bar']) 3147 call assert_beeps('normal ggyb') 3148 " 'b' command should stop at an empty line 3149 call setline(1, ['one two', '', 'foo bar']) 3150 normal 3Gyb 3151 call assert_equal("\n", @") 3152 normal 3Gy2b 3153 call assert_equal("two\n", @") 3154 " 'b' command should not stop at a non-empty blank line 3155 call setline(1, ['one two', ' ', 'foo bar']) 3156 normal 3Gyb 3157 call assert_equal("two\n ", @") 3158 3159 close! 3160endfunc 3161 3162" Test for 'scrolloff' with a long line that doesn't fit in the screen 3163func Test_normal_scroloff() 3164 10new 3165 80vnew 3166 call setline(1, repeat('a', 1000)) 3167 set scrolloff=10 3168 normal gg10gj 3169 call assert_equal(8, winline()) 3170 normal 10gj 3171 call assert_equal(10, winline()) 3172 normal 10gk 3173 call assert_equal(3, winline()) 3174 set scrolloff& 3175 close! 3176endfunc 3177 3178" Test for vertical scrolling with CTRL-F and CTRL-B with a long line 3179func Test_normal_vert_scroll_longline() 3180 10new 3181 80vnew 3182 call setline(1, range(1, 10)) 3183 call append(5, repeat('a', 1000)) 3184 exe "normal gg\<C-F>" 3185 call assert_equal(6, line('.')) 3186 exe "normal \<C-F>\<C-F>" 3187 call assert_equal(11, line('.')) 3188 call assert_equal(1, winline()) 3189 exe "normal \<C-B>" 3190 call assert_equal(10, line('.')) 3191 call assert_equal(3, winline()) 3192 exe "normal \<C-B>\<C-B>" 3193 call assert_equal(5, line('.')) 3194 call assert_equal(5, winline()) 3195 close! 3196endfunc 3197 3198" Test for jumping in a file using % 3199func Test_normal_percent_jump() 3200 new 3201 call setline(1, range(1, 100)) 3202 3203 " jumping to a folded line should open the fold 3204 25,75fold 3205 call feedkeys('50%', 'xt') 3206 call assert_equal(50, line('.')) 3207 call assert_equal(-1, foldclosedend(50)) 3208 close! 3209endfunc 3210 3211" vim: shiftwidth=2 sts=2 expandtab 3212