test_virtualedit.vim (19660B)
1 " Tests for 'virtualedit'. 2 3 func Test_yank_move_change() 4 new 5 call setline(1, [ 6 \ "func foo() error {", 7 \ "\tif n, err := bar();", 8 \ "\terr != nil {", 9 \ "\t\treturn err", 10 \ "\t}", 11 \ "\tn = n * n", 12 \ ]) 13 set virtualedit=all 14 set ts=4 15 function! MoveSelectionDown(count) abort 16 normal! m` 17 silent! exe "'<,'>move'>+".a:count 18 norm! `` 19 endfunction 20 21 xmap ]e :<C-U>call MoveSelectionDown(v:count1)<CR> 22 2 23 normal 2gg 24 normal J 25 normal jVj 26 normal ]e 27 normal ce 28 bwipe! 29 set virtualedit= 30 set ts=8 31 endfunc 32 33 func Test_paste_end_of_line() 34 new 35 set virtualedit=all 36 call setline(1, ['456', '123']) 37 normal! gg0"ay$ 38 exe "normal! 2G$lllA\<C-O>:normal! \"agP\r" 39 call assert_equal('123456', getline(2)) 40 41 bwipe! 42 set virtualedit= 43 endfunc 44 45 func Test_replace_end_of_line() 46 new 47 set virtualedit=all 48 call setline(1, range(20)) 49 exe "normal! gg2jv10lr-" 50 call assert_equal(["1", "-----------", "3"], getline(2,4)) 51 call setline(1, range(20)) 52 exe "normal! gg2jv10lr\<c-k>hh" 53 call assert_equal(["1", "───────────", "3"], getline(2,4)) 54 55 bwipe! 56 set virtualedit= 57 endfunc 58 59 func Test_edit_CTRL_G() 60 new 61 set virtualedit=insert 62 call setline(1, ['123', '1', '12']) 63 exe "normal! ggA\<c-g>jx\<c-g>jx" 64 call assert_equal(['123', '1 x', '12 x'], getline(1,'$')) 65 66 set virtualedit=all 67 %d_ 68 call setline(1, ['1', '12']) 69 exe "normal! ggllix\<c-g>jx" 70 call assert_equal(['1 x', '12x'], getline(1,'$')) 71 72 73 bwipe! 74 set virtualedit= 75 endfunc 76 77 func Test_edit_change() 78 new 79 set virtualedit=all 80 81 call setline(1, "\t⒌") 82 normal Cx 83 call assert_equal('x', getline(1)) 84 85 call setline(1, "\ta̳") 86 normal Cx 87 call assert_equal('x', getline(1)) 88 89 call setline(1, "\tβ̳") 90 normal Cx 91 call assert_equal('x', getline(1)) 92 93 if has('arabic') 94 call setline(1, "\tلا") 95 normal Cx 96 call assert_equal('x', getline(1)) 97 endif 98 99 " Do a visual block change 100 call setline(1, ['a', 'b', 'c']) 101 exe "normal gg3l\<C-V>2jcx" 102 call assert_equal(['a x', 'b x', 'c x'], getline(1, '$')) 103 104 bwipe! 105 set virtualedit= 106 endfunc 107 108 func Test_edit_special_char() 109 new 110 se ve=all 111 norm a0 112 sil! exe "norm o00000\<Nul>k<a0s" 113 114 bwipe! 115 set virtualedit= 116 endfunc 117 118 " Tests for pasting at the beginning, end and middle of a tab character 119 " in virtual edit mode. 120 func Test_paste_in_tab() 121 new 122 call append(0, '') 123 set virtualedit=all 124 125 " Tests for pasting a register with characterwise mode type 126 call setreg('"', 'xyz', 'c') 127 128 " paste (p) unnamed register at the beginning of a tab 129 call setline(1, "a\tb") 130 call cursor(1, 2, 0) 131 normal p 132 call assert_equal('a xyz b', getline(1)) 133 134 " paste (P) unnamed register at the beginning of a tab 135 call setline(1, "a\tb") 136 call cursor(1, 2, 0) 137 normal P 138 call assert_equal("axyz\tb", getline(1)) 139 140 " paste (p) unnamed register at the end of a tab 141 call setline(1, "a\tb") 142 call cursor(1, 2, 6) 143 normal p 144 call assert_equal("a\txyzb", getline(1)) 145 146 " paste (P) unnamed register at the end of a tab 147 call setline(1, "a\tb") 148 call cursor(1, 2, 6) 149 normal P 150 call assert_equal('a xyz b', getline(1)) 151 152 " Tests for pasting a register with blockwise mode type 153 call setreg('"', 'xyz', 'b') 154 155 " paste (p) unnamed register at the beginning of a tab 156 call setline(1, "a\tb") 157 call cursor(1, 2, 0) 158 normal p 159 call assert_equal('a xyz b', getline(1)) 160 161 " paste (P) unnamed register at the beginning of a tab 162 call setline(1, "a\tb") 163 call cursor(1, 2, 0) 164 normal P 165 call assert_equal("axyz\tb", getline(1)) 166 167 " paste (p) unnamed register at the end of a tab 168 call setline(1, "a\tb") 169 call cursor(1, 2, 6) 170 normal p 171 call assert_equal("a\txyzb", getline(1)) 172 173 " paste (P) unnamed register at the end of a tab 174 call setline(1, "a\tb") 175 call cursor(1, 2, 6) 176 normal P 177 call assert_equal('a xyz b', getline(1)) 178 179 " Tests for pasting with gp and gP in virtual edit mode 180 181 " paste (gp) unnamed register at the beginning of a tab 182 call setline(1, "a\tb") 183 call cursor(1, 2, 0) 184 normal gp 185 call assert_equal('a xyz b', getline(1)) 186 call assert_equal([0, 1, 12, 0, 12], getcurpos()) 187 188 " paste (gP) unnamed register at the beginning of a tab 189 call setline(1, "a\tb") 190 call cursor(1, 2, 0) 191 normal gP 192 call assert_equal("axyz\tb", getline(1)) 193 call assert_equal([0, 1, 5, 0, 5], getcurpos()) 194 195 " paste (gp) unnamed register at the end of a tab 196 call setline(1, "a\tb") 197 call cursor(1, 2, 6) 198 normal gp 199 call assert_equal("a\txyzb", getline(1)) 200 call assert_equal([0, 1, 6, 0, 12], getcurpos()) 201 202 " paste (gP) unnamed register at the end of a tab 203 call setline(1, "a\tb") 204 call cursor(1, 2, 6) 205 normal gP 206 call assert_equal('a xyz b', getline(1)) 207 call assert_equal([0, 1, 12, 0, 12], getcurpos()) 208 209 " Tests for pasting a named register 210 let @r = 'xyz' 211 212 " paste (gp) named register in the middle of a tab 213 call setline(1, "a\tb") 214 call cursor(1, 2, 2) 215 normal "rgp 216 call assert_equal('a xyz b', getline(1)) 217 call assert_equal([0, 1, 8, 0, 8], getcurpos()) 218 219 " paste (gP) named register in the middle of a tab 220 call setline(1, "a\tb") 221 call cursor(1, 2, 2) 222 normal "rgP 223 call assert_equal('a xyz b', getline(1)) 224 call assert_equal([0, 1, 7, 0, 7], getcurpos()) 225 226 bwipe! 227 set virtualedit= 228 endfunc 229 230 " Test for yanking a few spaces within a tab to a register 231 func Test_yank_in_tab() 232 new 233 let @r = '' 234 call setline(1, "a\tb") 235 set virtualedit=all 236 call cursor(1, 2, 2) 237 normal "ry5l 238 call assert_equal(' ', @r) 239 240 bwipe! 241 set virtualedit= 242 endfunc 243 244 " Insert "keyword keyw", ESC, C CTRL-N, shows "keyword ykeyword". 245 " Repeating CTRL-N fixes it. (Mary Ellen Foster) 246 func Test_ve_completion() 247 new 248 set completeopt&vim 249 set virtualedit=all 250 exe "normal ikeyword keyw\<Esc>C\<C-N>" 251 call assert_equal('keyword keyword', getline(1)) 252 bwipe! 253 set virtualedit= 254 endfunc 255 256 " Using "C" then <CR> moves the last remaining character to the next 257 " line. (Mary Ellen Foster) 258 func Test_ve_del_to_eol() 259 new 260 set virtualedit=all 261 call append(0, 'all your base are belong to us') 262 call search('are', 'w') 263 exe "normal C\<CR>are belong to vim" 264 call assert_equal(['all your base ', 'are belong to vim'], getline(1, 2)) 265 bwipe! 266 set virtualedit= 267 endfunc 268 269 " When past the end of a line that ends in a single character "b" skips 270 " that word. 271 func Test_ve_b_past_eol() 272 new 273 set virtualedit=all 274 call append(0, '1 2 3 4 5 6') 275 normal gg^$15lbC7 276 call assert_equal('1 2 3 4 5 7', getline(1)) 277 bwipe! 278 set virtualedit= 279 endfunc 280 281 " Make sure 'i', 'C', 'a', 'A' and 'D' works 282 func Test_ve_ins_del() 283 new 284 set virtualedit=all 285 call append(0, ["'i'", "'C'", "'a'", "'A'", "'D'"]) 286 call cursor(1, 1) 287 normal $4lix 288 call assert_equal("'i' x", getline(1)) 289 call cursor(2, 1) 290 normal $4lCx 291 call assert_equal("'C' x", getline(2)) 292 call cursor(3, 1) 293 normal $4lax 294 call assert_equal("'a' x", getline(3)) 295 call cursor(4, 1) 296 normal $4lAx 297 call assert_equal("'A'x", getline(4)) 298 call cursor(5, 1) 299 normal $4lDix 300 call assert_equal("'D' x", getline(5)) 301 bwipe! 302 set virtualedit= 303 endfunc 304 305 " Test for yank bug reported by Mark Waggoner. 306 func Test_yank_block() 307 new 308 set virtualedit=block 309 call append(0, repeat(['this is a test'], 3)) 310 exe "normal gg^2w\<C-V>3jy" 311 call assert_equal("a\na\na\n ", @") 312 bwipe! 313 set virtualedit= 314 endfunc 315 316 " Test "r" beyond the end of the line 317 func Test_replace_after_eol() 318 new 319 set virtualedit=all 320 call append(0, '"r"') 321 normal gg$5lrxa 322 call assert_equal('"r" x', getline(1)) 323 " visual block replace 324 %d _ 325 call setline(1, ['a', '', 'b']) 326 exe "normal 2l\<C-V>2jrx" 327 call assert_equal(['a x', ' x', 'b x'], getline(1, '$')) 328 " visual characterwise selection replace after eol 329 %d _ 330 call setline(1, 'a') 331 normal 4lv2lrx 332 call assert_equal('a xxx', getline(1)) 333 bwipe! 334 set virtualedit= 335 endfunc 336 337 " Test "r" on a tab 338 " Note that for this test, 'ts' must be 8 (the default). 339 func Test_replace_on_tab() 340 new 341 set virtualedit=all 342 call append(0, "'r'\t") 343 normal gg^5lrxAy 344 call assert_equal("'r' x y", getline(1)) 345 call setline(1, 'aaaaaaaaaaaa') 346 exe "normal! gg2lgR\<Tab>" 347 call assert_equal("aa\taaaa", getline(1)) 348 bwipe! 349 set virtualedit= 350 endfunc 351 352 " Test to make sure 'x' can delete control characters 353 func Test_ve_del_ctrl_chars() 354 new 355 set virtualedit=all 356 call append(0, "a\<C-V>b\<CR>sd") 357 set display=uhex 358 normal gg^xxxxxxi[text] 359 set display= 360 call assert_equal('[text]', getline(1)) 361 bwipe! 362 set virtualedit= 363 endfunc 364 365 " Test for ^Y/^E due to bad w_virtcol value, reported by 366 " Roy <royl@netropolis.net>. 367 func Test_ins_copy_char() 368 new 369 set virtualedit=all 370 call append(0, 'abcv8efi.him2kl') 371 exe "normal gg^O\<Esc>3li\<C-E>\<Esc>4li\<C-E>\<Esc>4li\<C-E> <--" 372 exe "normal j^o\<Esc>4li\<C-Y>\<Esc>4li\<C-Y>\<Esc>4li\<C-Y> <--" 373 call assert_equal(' v i m <--', getline(1)) 374 call assert_equal(' 8 . 2 <--', getline(3)) 375 bwipe! 376 set virtualedit= 377 endfunc 378 379 " Test for yanking and pasting using the small delete register 380 func Test_yank_paste_small_del_reg() 381 new 382 set virtualedit=all 383 call append(0, "foo, bar") 384 normal ggdewve"-p 385 call assert_equal(', foo', getline(1)) 386 bwipe! 387 set virtualedit= 388 endfunc 389 390 " Test for delete that breaks a tab into spaces 391 func Test_delete_break_tab() 392 new 393 call setline(1, "one\ttwo") 394 set virtualedit=all 395 normal v3ld 396 call assert_equal(' two', getline(1)) 397 set virtualedit& 398 bw! 399 endfunc 400 401 " Test for using <BS>, <C-W> and <C-U> in virtual edit mode 402 " to erase character, word and line. 403 func Test_ve_backspace() 404 new 405 call setline(1, 'sample') 406 set virtualedit=all 407 set backspace=indent,eol,start 408 exe "normal 15|i\<BS>\<BS>" 409 call assert_equal([0, 1, 7, 5], getpos('.')) 410 exe "normal 15|i\<C-W>" 411 call assert_equal([0, 1, 6, 0], getpos('.')) 412 exe "normal 15|i\<C-U>" 413 call assert_equal([0, 1, 1, 0], getpos('.')) 414 set backspace& 415 set virtualedit& 416 bw! 417 endfunc 418 419 " Test for delete (x) on EOL character and after EOL 420 func Test_delete_past_eol() 421 new 422 call setline(1, "ab") 423 set virtualedit=all 424 exe "normal 2lx" 425 call assert_equal('ab', getline(1)) 426 exe "normal 10lx" 427 call assert_equal('ab', getline(1)) 428 set virtualedit& 429 bw! 430 endfunc 431 432 " After calling s:TryVirtualeditReplace(), line 1 will contain one of these 433 " two strings, depending on whether virtual editing is on or off. 434 let s:result_ve_on = 'a x' 435 let s:result_ve_off = 'x' 436 437 " Utility function for Test_global_local_virtualedit() 438 func s:TryVirtualeditReplace() 439 call setline(1, 'a') 440 normal gg7l 441 normal rx 442 endfunc 443 444 " Test for :set and :setlocal 445 func Test_global_local_virtualedit() 446 new 447 448 " Verify that 'virtualedit' is initialized to empty, can be set globally to 449 " all and to empty, and can be set locally to all and to empty. 450 call s:TryVirtualeditReplace() 451 call assert_equal(s:result_ve_off, getline(1)) 452 set ve=all 453 call s:TryVirtualeditReplace() 454 call assert_equal(s:result_ve_on, getline(1)) 455 set ve= 456 call s:TryVirtualeditReplace() 457 call assert_equal(s:result_ve_off, getline(1)) 458 setlocal ve=all 459 call s:TryVirtualeditReplace() 460 call assert_equal(s:result_ve_on, getline(1)) 461 setlocal ve= 462 call s:TryVirtualeditReplace() 463 call assert_equal(s:result_ve_off, getline(1)) 464 465 " Verify that :set affects multiple windows. 466 split 467 set ve=all 468 call s:TryVirtualeditReplace() 469 call assert_equal(s:result_ve_on, getline(1)) 470 wincmd p 471 call s:TryVirtualeditReplace() 472 call assert_equal(s:result_ve_on, getline(1)) 473 set ve= 474 wincmd p 475 call s:TryVirtualeditReplace() 476 call assert_equal(s:result_ve_off, getline(1)) 477 bwipe! 478 479 " Verify that :setlocal affects only the current window. 480 new 481 split 482 setlocal ve=all 483 call s:TryVirtualeditReplace() 484 call assert_equal(s:result_ve_on, getline(1)) 485 wincmd p 486 call s:TryVirtualeditReplace() 487 call assert_equal(s:result_ve_off, getline(1)) 488 bwipe! 489 call s:TryVirtualeditReplace() 490 call assert_equal(s:result_ve_off, getline(1)) 491 492 " Verify that the buffer 'virtualedit' state follows the global value only 493 " when empty and that "none" works as expected. 494 " 495 " 'virtualedit' State 496 " +--------+--------------------------+ 497 " | Local | Global | 498 " | | | 499 " +--------+--------+--------+--------+ 500 " | | "" | "all" | "none" | 501 " +--------+--------+--------+--------+ 502 " | "" | off | on | off | 503 " | "all" | on | on | on | 504 " | "none" | off | off | off | 505 " +--------+--------+--------+--------+ 506 new 507 508 setglobal ve= 509 setlocal ve= 510 call s:TryVirtualeditReplace() 511 call assert_equal(s:result_ve_off, getline(1)) 512 setlocal ve=all 513 call s:TryVirtualeditReplace() 514 call assert_equal(s:result_ve_on, getline(1)) 515 setlocal ve=none 516 call s:TryVirtualeditReplace() 517 call assert_equal(s:result_ve_off, getline(1)) 518 519 setglobal ve=all 520 setlocal ve= 521 call s:TryVirtualeditReplace() 522 call assert_equal(s:result_ve_on, getline(1)) 523 setlocal ve=all 524 call s:TryVirtualeditReplace() 525 call assert_equal(s:result_ve_on, getline(1)) 526 setlocal ve=none 527 call s:TryVirtualeditReplace() 528 call assert_equal(s:result_ve_off, getline(1)) 529 setlocal ve=NONE 530 call s:TryVirtualeditReplace() 531 call assert_equal(s:result_ve_off, getline(1)) 532 533 setglobal ve=none 534 setlocal ve= 535 call s:TryVirtualeditReplace() 536 call assert_equal(s:result_ve_off, getline(1)) 537 setlocal ve=all 538 call s:TryVirtualeditReplace() 539 call assert_equal(s:result_ve_on, getline(1)) 540 setlocal ve=none 541 call s:TryVirtualeditReplace() 542 call assert_equal(s:result_ve_off, getline(1)) 543 544 bwipe! 545 546 " Verify that the 'virtualedit' state is copied to new windows. 547 new 548 call s:TryVirtualeditReplace() 549 call assert_equal(s:result_ve_off, getline(1)) 550 split 551 setlocal ve=all 552 call s:TryVirtualeditReplace() 553 call assert_equal(s:result_ve_on, getline(1)) 554 split 555 call s:TryVirtualeditReplace() 556 call assert_equal(s:result_ve_on, getline(1)) 557 setlocal ve= 558 split 559 call s:TryVirtualeditReplace() 560 call assert_equal(s:result_ve_off, getline(1)) 561 bwipe! 562 563 setlocal virtualedit& 564 set virtualedit& 565 endfunc 566 567 func Test_virtualedit_setlocal() 568 enew 569 setglobal virtualedit=all 570 setlocal virtualedit=all 571 normal! l 572 redraw 573 setlocal virtualedit=none 574 call assert_equal(1, wincol()) 575 576 setlocal virtualedit& 577 set virtualedit& 578 endfunc 579 580 func Test_virtualedit_mouse() 581 let save_mouse = &mouse 582 set mouse=a 583 set virtualedit=all 584 botright new 585 let row = win_screenpos(0)[0] 586 20vsplit 587 wincmd p 588 589 call setline(1, ["text\tword"]) 590 redraw 591 call Ntest_setmouse(row, 21 + 4) 592 call feedkeys("\<LeftMouse>", "xt") 593 call assert_equal([0, 1, 4, 0, 4], getcurpos()) 594 call Ntest_setmouse(row, 21 + 5) 595 call feedkeys("\<LeftMouse>", "xt") 596 call assert_equal([0, 1, 5, 0, 5], getcurpos()) 597 call Ntest_setmouse(row, 21 + 6) 598 call feedkeys("\<LeftMouse>", "xt") 599 call assert_equal([0, 1, 5, 1, 6], getcurpos()) 600 call Ntest_setmouse(row, 21 + 7) 601 call feedkeys("\<LeftMouse>", "xt") 602 call assert_equal([0, 1, 5, 2, 7], getcurpos()) 603 call Ntest_setmouse(row, 21 + 8) 604 call feedkeys("\<LeftMouse>", "xt") 605 call assert_equal([0, 1, 5, 3, 8], getcurpos()) 606 call Ntest_setmouse(row, 21 + 9) 607 call feedkeys("\<LeftMouse>", "xt") 608 call assert_equal([0, 1, 6, 0, 9], getcurpos()) 609 call Ntest_setmouse(row, 21 + 12) 610 call feedkeys("\<LeftMouse>", "xt") 611 call assert_equal([0, 1, 9, 0, 12], getcurpos()) 612 call Ntest_setmouse(row, 21 + 13) 613 call feedkeys("\<LeftMouse>", "xt") 614 call assert_equal([0, 1, 10, 0, 13], getcurpos()) 615 call Ntest_setmouse(row, 21 + 15) 616 call feedkeys("\<LeftMouse>", "xt") 617 call assert_equal([0, 1, 10, 2, 15], getcurpos()) 618 call Ntest_setmouse(row, 21 + 20) 619 call feedkeys("\<LeftMouse>", "xt") 620 call assert_equal([0, 1, 10, 7, 20], getcurpos()) 621 622 setlocal nowrap 623 call setline(2, repeat('a', 19)) 624 normal! j14zl 625 redraw 626 call Ntest_setmouse(row, 21 + 1) 627 call feedkeys("\<LeftMouse>", "xt") 628 call assert_equal([0, 1, 10, 2, 15], getcurpos()) 629 call Ntest_setmouse(row, 21 + 11) 630 call feedkeys("\<LeftMouse>", "xt") 631 call assert_equal([0, 1, 10, 12, 25], getcurpos()) 632 call Ntest_setmouse(row + 1, 21 + 1) 633 call feedkeys("\<LeftMouse>", "xt") 634 call assert_equal([0, 2, 15, 0, 15], getcurpos()) 635 call Ntest_setmouse(row + 1, 21 + 11) 636 call feedkeys("\<LeftMouse>", "xt") 637 call assert_equal([0, 2, 20, 5, 25], getcurpos()) 638 639 setlocal number numberwidth=2 640 redraw 641 call Ntest_setmouse(row, 21 + 3) 642 call feedkeys("\<LeftMouse>", "xt") 643 call assert_equal([0, 1, 10, 2, 15], getcurpos()) 644 call Ntest_setmouse(row, 21 + 13) 645 call feedkeys("\<LeftMouse>", "xt") 646 call assert_equal([0, 1, 10, 12, 25], getcurpos()) 647 call Ntest_setmouse(row + 1, 21 + 3) 648 call feedkeys("\<LeftMouse>", "xt") 649 call assert_equal([0, 2, 15, 0, 15], getcurpos()) 650 call Ntest_setmouse(row + 1, 21 + 13) 651 call feedkeys("\<LeftMouse>", "xt") 652 call assert_equal([0, 2, 20, 5, 25], getcurpos()) 653 setlocal nonumber 654 655 if has('signs') 656 sign define Sign1 text=口 657 sign place 1 name=Sign1 line=1 658 sign place 2 name=Sign1 line=2 659 redraw 660 call Ntest_setmouse(row, 21 + 3) 661 call feedkeys("\<LeftMouse>", "xt") 662 call assert_equal([0, 1, 10, 2, 15], getcurpos()) 663 call Ntest_setmouse(row, 21 + 13) 664 call feedkeys("\<LeftMouse>", "xt") 665 call assert_equal([0, 1, 10, 12, 25], getcurpos()) 666 call Ntest_setmouse(row + 1, 21 + 3) 667 call feedkeys("\<LeftMouse>", "xt") 668 call assert_equal([0, 2, 15, 0, 15], getcurpos()) 669 call Ntest_setmouse(row + 1, 21 + 13) 670 call feedkeys("\<LeftMouse>", "xt") 671 call assert_equal([0, 2, 20, 5, 25], getcurpos()) 672 sign unplace 1 673 sign unplace 2 674 sign undefine Sign1 675 endif 676 677 wincmd h 678 4wincmd > 679 normal! gg24I. 680 redraw 681 call Ntest_setmouse(row + 1, 12) 682 call feedkeys("\<LeftMouse>", "xt") 683 call assert_equal([0, 1, 24 + 9, 0, 24 + 12], getcurpos()) 684 call Ntest_setmouse(row + 1, 13) 685 call feedkeys("\<LeftMouse>", "xt") 686 call assert_equal([0, 1, 24 + 10, 0, 24 + 13], getcurpos()) 687 call Ntest_setmouse(row + 1, 15) 688 call feedkeys("\<LeftMouse>", "xt") 689 call assert_equal([0, 1, 24 + 10, 2, 24 + 15], getcurpos()) 690 call Ntest_setmouse(row + 1, 20) 691 call feedkeys("\<LeftMouse>", "xt") 692 call assert_equal([0, 1, 24 + 10, 7, 24 + 20], getcurpos()) 693 694 bwipe! 695 let &mouse = save_mouse 696 set virtualedit& 697 endfunc 698 699 " this was replacing the NUL at the end of the line 700 func Test_virtualedit_replace_after_tab() 701 new 702 s/\v/ 0 703 set ve=all 704 let @" = '' 705 sil! norm vPvr0 706 707 call assert_equal("\t0", getline(1)) 708 set ve& 709 bwipe! 710 endfunc 711 712 " Test that setpos('.') and cursor() behave the same for v:maxcol 713 func Test_virtualedit_set_cursor_pos_maxcol() 714 new 715 set virtualedit=all 716 717 call setline(1, 'foobar') 718 exe "normal! V\<Esc>" 719 call assert_equal([0, 1, 1, 0], getpos("'<")) 720 call assert_equal([0, 1, v:maxcol, 0], getpos("'>")) 721 let pos = getpos("'>") 722 723 call cursor(1, 1) 724 call setpos('.', pos) 725 call assert_equal([0, 1, 7, 0], getpos('.')) 726 727 call cursor(1, 1) 728 call cursor(pos[1:]) 729 call assert_equal([0, 1, 7, 0], getpos('.')) 730 731 set virtualedit& 732 bwipe! 733 endfunc 734 735 " Verify that getpos() remains consistent when the cursor is past EOL after 736 " toggling Visual mode with virtualedit=all. 737 func Test_virtualedit_getpos_stable_past_eol_after_visual() 738 new 739 set virtualedit=all 740 call setline(1, 'abc') 741 742 normal! gg$3l 743 let p1 = getpos('.') 744 745 normal! v 746 redraw 747 exe "normal! \<Esc>" 748 749 let p2 = getpos('.') 750 call assert_equal(p1, p2, 'Position should not be re-encoded after leaving Visual mode') 751 752 set virtualedit& 753 bwipe! 754 endfunc 755 756 " vim: shiftwidth=2 sts=2 expandtab