test_termcodes.vim (33702B)
1 source check.vim 2 " CheckNotGui 3 " CheckUnix 4 5 source shared.vim 6 source mouse.vim 7 source view_util.vim 8 source term_util.vim 9 10 func Test_term_mouse_left_click() 11 new 12 let save_mouse = &mouse 13 let save_term = &term 14 " let save_ttymouse = &ttymouse 15 " call test_override('no_query_mouse', 1) 16 " set mouse=a term=xterm 17 set mouse=a 18 call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer']) 19 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm 20 let msg = 'ttymouse=' .. ttymouse_val 21 " exe 'set ttymouse=' .. ttymouse_val 22 go 23 call assert_equal([0, 1, 1, 0], getpos('.'), msg) 24 let row = 2 25 let col = 6 26 call MouseLeftClick(row, col) 27 call MouseLeftRelease(row, col) 28 call assert_equal([0, 2, 6, 0], getpos('.'), msg) 29 endfor 30 31 let &mouse = save_mouse 32 " let &term = save_term 33 " let &ttymouse = save_ttymouse 34 " call test_override('no_query_mouse', 0) 35 bwipe! 36 endfunc 37 38 func Test_xterm_mouse_right_click_extends_visual() 39 if has('mac') 40 " throw "Skipped: test right click in visual mode does not work on macOs (why?)" 41 endif 42 let save_mouse = &mouse 43 let save_term = &term 44 " let save_ttymouse = &ttymouse 45 " call test_override('no_query_mouse', 1) 46 " set mouse=a term=xterm 47 set mouse=a 48 49 for visual_mode in ["v", "V", "\<C-V>"] 50 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 51 let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val 52 " exe 'set ttymouse=' .. ttymouse_val 53 54 call setline(1, repeat([repeat('-', 7)], 7)) 55 call MouseLeftClick(4, 4) 56 call MouseLeftRelease(4, 4) 57 exe "norm! " .. visual_mode 58 59 " Right click extends top left of visual area. 60 call MouseRightClick(2, 2) 61 call MouseRightRelease(2, 2) 62 63 " Right click extends bottom right of visual area. 64 call MouseRightClick(6, 6) 65 call MouseRightRelease(6, 6) 66 norm! r1gv 67 68 " Right click shrinks top left of visual area. 69 call MouseRightClick(3, 3) 70 call MouseRightRelease(3, 3) 71 72 " Right click shrinks bottom right of visual area. 73 call MouseRightClick(5, 5) 74 call MouseRightRelease(5, 5) 75 norm! r2 76 77 if visual_mode ==# 'v' 78 call assert_equal(['-------', 79 \ '-111111', 80 \ '1122222', 81 \ '2222222', 82 \ '2222211', 83 \ '111111-', 84 \ '-------'], getline(1, '$'), msg) 85 elseif visual_mode ==# 'V' 86 call assert_equal(['-------', 87 \ '1111111', 88 \ '2222222', 89 \ '2222222', 90 \ '2222222', 91 \ '1111111', 92 \ '-------'], getline(1, '$'), msg) 93 else 94 call assert_equal(['-------', 95 \ '-11111-', 96 \ '-12221-', 97 \ '-12221-', 98 \ '-12221-', 99 \ '-11111-', 100 \ '-------'], getline(1, '$'), msg) 101 endif 102 endfor 103 endfor 104 105 let &mouse = save_mouse 106 " let &term = save_term 107 " let &ttymouse = save_ttymouse 108 " call test_override('no_query_mouse', 0) 109 bwipe! 110 endfunc 111 112 " Test that <C-LeftMouse> jumps to help tag and <C-RightMouse> jumps back. 113 func Test_xterm_mouse_ctrl_click() 114 let save_mouse = &mouse 115 let save_term = &term 116 " let save_ttymouse = &ttymouse 117 " set mouse=a term=xterm 118 set mouse=a 119 120 for ttymouse_val in g:Ttymouse_values 121 let msg = 'ttymouse=' .. ttymouse_val 122 " exe 'set ttymouse=' .. ttymouse_val 123 " help 124 help usr_toc.txt 125 /usr_02.txt 126 norm! zt 127 let row = 1 128 let col = 1 129 call MouseCtrlLeftClick(row, col) 130 call MouseLeftRelease(row, col) 131 call assert_match('usr_02.txt$', bufname('%'), msg) 132 call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg) 133 134 call MouseCtrlRightClick(row, col) 135 call MouseRightRelease(row, col) 136 " call assert_match('help.txt$', bufname('%'), msg) 137 call assert_match('usr_toc.txt$', bufname('%'), msg) 138 call assert_equal('|usr_02.txt|', expand('<cWORD>'), msg) 139 140 helpclose 141 endfor 142 143 let &mouse = save_mouse 144 " let &term = save_term 145 " let &ttymouse = save_ttymouse 146 endfunc 147 148 func Test_term_mouse_middle_click() 149 CheckFeature clipboard_working 150 151 new 152 let save_mouse = &mouse 153 let save_term = &term 154 " let save_ttymouse = &ttymouse 155 " call test_override('no_query_mouse', 1) 156 let save_quotestar = @* 157 let @* = 'abc' 158 " set mouse=a term=xterm 159 set mouse=a 160 161 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 162 let msg = 'ttymouse=' .. ttymouse_val 163 " exe 'set ttymouse=' .. ttymouse_val 164 call setline(1, ['123456789', '123456789']) 165 166 " Middle-click in the middle of the line pastes text where clicked. 167 let row = 1 168 let col = 6 169 call MouseMiddleClick(row, col) 170 call MouseMiddleRelease(row, col) 171 call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg) 172 173 " Middle-click beyond end of the line pastes text at the end of the line. 174 let col = 20 175 call MouseMiddleClick(row, col) 176 call MouseMiddleRelease(row, col) 177 call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg) 178 179 " Middle-click beyond the last line pastes in the last line. 180 let row = 5 181 let col = 3 182 call MouseMiddleClick(row, col) 183 call MouseMiddleRelease(row, col) 184 call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg) 185 endfor 186 187 let &mouse = save_mouse 188 " let &term = save_term 189 " let &ttymouse = save_ttymouse 190 " call test_override('no_query_mouse', 0) 191 let @* = save_quotestar 192 bwipe! 193 endfunc 194 195 " TODO: for unclear reasons this test fails if it comes after 196 " Test_xterm_mouse_ctrl_click() 197 func Test_1xterm_mouse_wheel() 198 new 199 let save_mouse = &mouse 200 let save_term = &term 201 let save_wrap = &wrap 202 " let save_ttymouse = &ttymouse 203 " set mouse=a term=xterm nowrap 204 set mouse=a nowrap 205 call setline(1, range(100000000000000, 100000000000100)) 206 207 for ttymouse_val in g:Ttymouse_values 208 let msg = 'ttymouse=' .. ttymouse_val 209 " exe 'set ttymouse=' .. ttymouse_val 210 go 211 call assert_equal(1, line('w0'), msg) 212 call assert_equal([0, 1, 1, 0], getpos('.'), msg) 213 214 call MouseWheelDown(1, 1) 215 call assert_equal(4, line('w0'), msg) 216 call assert_equal([0, 4, 1, 0], getpos('.'), msg) 217 218 call MouseWheelDown(1, 1) 219 call assert_equal(7, line('w0'), msg) 220 call assert_equal([0, 7, 1, 0], getpos('.'), msg) 221 222 call MouseWheelUp(1, 1) 223 call assert_equal(4, line('w0'), msg) 224 call assert_equal([0, 7, 1, 0], getpos('.'), msg) 225 226 call MouseWheelUp(1, 1) 227 call assert_equal(1, line('w0'), msg) 228 call assert_equal([0, 7, 1, 0], getpos('.'), msg) 229 230 call MouseWheelRight(1, 1) 231 call assert_equal(7, 1 + virtcol(".") - wincol(), msg) 232 call assert_equal([0, 7, 7, 0], getpos('.'), msg) 233 234 call MouseWheelRight(1, 1) 235 call assert_equal(13, 1 + virtcol(".") - wincol(), msg) 236 call assert_equal([0, 7, 13, 0], getpos('.'), msg) 237 238 call MouseWheelLeft(1, 1) 239 call assert_equal(7, 1 + virtcol(".") - wincol(), msg) 240 call assert_equal([0, 7, 13, 0], getpos('.'), msg) 241 242 call MouseWheelLeft(1, 1) 243 call assert_equal(1, 1 + virtcol(".") - wincol(), msg) 244 call assert_equal([0, 7, 13, 0], getpos('.'), msg) 245 246 endfor 247 248 let &mouse = save_mouse 249 " let &term = save_term 250 let &wrap = save_wrap 251 " let &ttymouse = save_ttymouse 252 bwipe! 253 endfunc 254 255 " Test that dragging beyond the window (at the bottom and at the top) 256 " scrolls window content by the number of lines beyond the window. 257 func Test_term_mouse_drag_beyond_window() 258 let save_mouse = &mouse 259 let save_term = &term 260 " let save_ttymouse = &ttymouse 261 " call test_override('no_query_mouse', 1) 262 " set mouse=a term=xterm 263 set mouse=a 264 let col = 1 265 call setline(1, range(1, 100)) 266 267 " Split into 3 windows, and go into the middle window 268 " so we test dragging mouse below and above the window. 269 2split 270 wincmd j 271 2split 272 273 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 274 let msg = 'ttymouse=' .. ttymouse_val 275 " exe 'set ttymouse=' .. ttymouse_val 276 277 " Line #10 at the top. 278 norm! 10zt 279 redraw 280 call assert_equal(10, winsaveview().topline, msg) 281 call assert_equal(2, winheight(0), msg) 282 283 let row = 4 284 call MouseLeftClick(row, col) 285 call assert_equal(10, winsaveview().topline, msg) 286 287 " Drag downwards. We're still in the window so topline should 288 " not change yet. 289 let row += 1 290 call MouseLeftDrag(row, col) 291 call assert_equal(10, winsaveview().topline, msg) 292 293 " We now leave the window at the bottom, so the window content should 294 " scroll by 1 line, then 2 lines (etc) as we drag further away. 295 let row += 1 296 call MouseLeftDrag(row, col) 297 call assert_equal(11, winsaveview().topline, msg) 298 299 let row += 1 300 call MouseLeftDrag(row, col) 301 call assert_equal(13, winsaveview().topline, msg) 302 303 " Now drag upwards. 304 let row -= 1 305 call MouseLeftDrag(row, col) 306 call assert_equal(14, winsaveview().topline, msg) 307 308 " We're now back in the window so the topline should not change. 309 let row -= 1 310 call MouseLeftDrag(row, col) 311 call assert_equal(14, winsaveview().topline, msg) 312 313 let row -= 1 314 call MouseLeftDrag(row, col) 315 call assert_equal(14, winsaveview().topline, msg) 316 317 " We now leave the window at the top so the window content should 318 " scroll by 1 line, then 2, then 3 (etc) in the opposite direction. 319 let row -= 1 320 call MouseLeftDrag(row, col) 321 call assert_equal(13, winsaveview().topline, msg) 322 323 let row -= 1 324 call MouseLeftDrag(row, col) 325 call assert_equal(11, winsaveview().topline, msg) 326 327 let row -= 1 328 call MouseLeftDrag(row, col) 329 call assert_equal(8, winsaveview().topline, msg) 330 331 call MouseLeftRelease(row, col) 332 call assert_equal(8, winsaveview().topline, msg) 333 call assert_equal(2, winheight(0), msg) 334 endfor 335 336 let &mouse = save_mouse 337 " let &term = save_term 338 " let &ttymouse = save_ttymouse 339 " call test_override('no_query_mouse', 0) 340 bwipe! 341 endfunc 342 343 func Test_term_mouse_drag_window_separator() 344 let save_mouse = &mouse 345 let save_term = &term 346 " let save_ttymouse = &ttymouse 347 " call test_override('no_query_mouse', 1) 348 " set mouse=a term=xterm 349 set mouse=a 350 351 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 352 let msg = 'ttymouse=' .. ttymouse_val 353 " exe 'set ttymouse=' .. ttymouse_val 354 355 " Split horizontally and test dragging the horizontal window separator. 356 split 357 let rowseparator = winheight(0) + 1 358 let row = rowseparator 359 let col = 1 360 361 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported. 362 if ttymouse_val !=# 'xterm2' || row <= 223 363 call MouseLeftClick(row, col) 364 let row -= 1 365 call MouseLeftDrag(row, col) 366 call assert_equal(rowseparator - 1, winheight(0) + 1, msg) 367 let row += 1 368 call MouseLeftDrag(row, col) 369 call assert_equal(rowseparator, winheight(0) + 1, msg) 370 call MouseLeftRelease(row, col) 371 call assert_equal(rowseparator, winheight(0) + 1, msg) 372 endif 373 bwipe! 374 375 " Split vertically and test dragging the vertical window separator. 376 vsplit 377 let colseparator = winwidth(0) + 1 378 let row = 1 379 let col = colseparator 380 381 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported. 382 if ttymouse_val !=# 'xterm2' || col <= 223 383 call MouseLeftClick(row, col) 384 let col -= 1 385 call MouseLeftDrag(row, col) 386 call assert_equal(colseparator - 1, winwidth(0) + 1, msg) 387 let col += 1 388 call MouseLeftDrag(row, col) 389 call assert_equal(colseparator, winwidth(0) + 1, msg) 390 call MouseLeftRelease(row, col) 391 call assert_equal(colseparator, winwidth(0) + 1, msg) 392 endif 393 bwipe! 394 endfor 395 396 let &mouse = save_mouse 397 " let &term = save_term 398 " let &ttymouse = save_ttymouse 399 " call test_override('no_query_mouse', 0) 400 endfunc 401 402 func Test_term_mouse_drag_statusline() 403 let save_mouse = &mouse 404 let save_term = &term 405 " let save_ttymouse = &ttymouse 406 " call test_override('no_query_mouse', 1) 407 let save_laststatus = &laststatus 408 " set mouse=a term=xterm laststatus=2 409 set mouse=a laststatus=2 410 411 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 412 let msg = 'ttymouse=' .. ttymouse_val 413 " exe 'set ttymouse=' .. ttymouse_val 414 415 call assert_equal(1, &cmdheight, msg) 416 let rowstatusline = winheight(0) + 1 417 let row = rowstatusline 418 let col = 1 419 420 if ttymouse_val ==# 'xterm2' && row > 223 421 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported. 422 continue 423 endif 424 425 call MouseLeftClick(row, col) 426 let row -= 1 427 call MouseLeftDrag(row, col) 428 call assert_equal(2, &cmdheight, msg) 429 call assert_equal(rowstatusline - 1, winheight(0) + 1, msg) 430 let row += 1 431 call MouseLeftDrag(row, col) 432 call assert_equal(1, &cmdheight, msg) 433 call assert_equal(rowstatusline, winheight(0) + 1, msg) 434 call MouseLeftRelease(row, col) 435 call assert_equal(1, &cmdheight, msg) 436 call assert_equal(rowstatusline, winheight(0) + 1, msg) 437 endfor 438 439 let &mouse = save_mouse 440 " let &term = save_term 441 " let &ttymouse = save_ttymouse 442 " call test_override('no_query_mouse', 0) 443 let &laststatus = save_laststatus 444 endfunc 445 446 func Test_term_mouse_click_tab() 447 let save_mouse = &mouse 448 let save_term = &term 449 " let save_ttymouse = &ttymouse 450 " call test_override('no_query_mouse', 1) 451 " set mouse=a term=xterm 452 set mouse=a 453 let row = 1 454 455 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm 456 let msg = 'ttymouse=' .. ttymouse_val 457 " exe 'set ttymouse=' .. ttymouse_val 458 e Xfoo 459 tabnew Xbar 460 461 let a = split(execute(':tabs'), "\n") 462 call assert_equal(['Tab page 1', 463 \ '# Xfoo', 464 \ 'Tab page 2', 465 \ '> Xbar'], a, msg) 466 467 " Test clicking on tab names in the tabline at the top. 468 let col = 2 469 redraw 470 call MouseLeftClick(row, col) 471 call MouseLeftRelease(row, col) 472 let a = split(execute(':tabs'), "\n") 473 call assert_equal(['Tab page 1', 474 \ '> Xfoo', 475 \ 'Tab page 2', 476 \ '# Xbar'], a, msg) 477 478 let col = 9 479 call MouseLeftClick(row, col) 480 call MouseLeftRelease(row, col) 481 let a = split(execute(':tabs'), "\n") 482 call assert_equal(['Tab page 1', 483 \ '# Xfoo', 484 \ 'Tab page 2', 485 \ '> Xbar'], a, msg) 486 487 %bwipe! 488 endfor 489 490 let &mouse = save_mouse 491 " let &term = save_term 492 " let &ttymouse = save_ttymouse 493 " call test_override('no_query_mouse', 0) 494 endfunc 495 496 func Test_term_mouse_click_X_to_close_tab() 497 let save_mouse = &mouse 498 let save_term = &term 499 " let save_ttymouse = &ttymouse 500 " call test_override('no_query_mouse', 1) 501 " set mouse=a term=xterm 502 set mouse=a 503 let row = 1 504 let col = &columns 505 506 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm 507 if ttymouse_val ==# 'xterm2' && col > 223 508 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported. 509 continue 510 endif 511 let msg = 'ttymouse=' .. ttymouse_val 512 " exe 'set ttymouse=' .. ttymouse_val 513 e Xtab1 514 tabnew Xtab2 515 tabnew Xtab3 516 tabn 2 517 518 let a = split(execute(':tabs'), "\n") 519 call assert_equal(['Tab page 1', 520 \ ' Xtab1', 521 \ 'Tab page 2', 522 \ '> Xtab2', 523 \ 'Tab page 3', 524 \ '# Xtab3'], a, msg) 525 526 " Click on "X" in tabline to close current tab i.e. Xtab2. 527 redraw 528 call MouseLeftClick(row, col) 529 call MouseLeftRelease(row, col) 530 let a = split(execute(':tabs'), "\n") 531 call assert_equal(['Tab page 1', 532 \ ' Xtab1', 533 \ 'Tab page 2', 534 \ '> Xtab3'], a, msg) 535 536 %bwipe! 537 endfor 538 539 let &mouse = save_mouse 540 " let &term = save_term 541 " let &ttymouse = save_ttymouse 542 " call test_override('no_query_mouse', 0) 543 endfunc 544 545 func Test_term_mouse_drag_to_move_tab() 546 let save_mouse = &mouse 547 let save_term = &term 548 " let save_ttymouse = &ttymouse 549 " call test_override('no_query_mouse', 1) 550 " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop 551 " set mouse=a term=xterm mousetime=1 552 set mouse=a mousetime=0 553 let row = 1 554 555 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 556 let msg = 'ttymouse=' .. ttymouse_val 557 " exe 'set ttymouse=' .. ttymouse_val 558 e Xtab1 559 tabnew Xtab2 560 561 let a = split(execute(':tabs'), "\n") 562 call assert_equal(['Tab page 1', 563 \ '# Xtab1', 564 \ 'Tab page 2', 565 \ '> Xtab2'], a, msg) 566 redraw 567 568 " Click in tab2 and drag it to tab1. 569 " Check getcharmod() to verify that click is not 570 " interpreted as a spurious double-click. 571 call MouseLeftClick(row, 10) 572 call assert_equal(0, getcharmod(), msg) 573 for col in [9, 8, 7, 6] 574 call MouseLeftDrag(row, col) 575 endfor 576 call MouseLeftRelease(row, col) 577 let a = split(execute(':tabs'), "\n") 578 call assert_equal(['Tab page 1', 579 \ '> Xtab2', 580 \ 'Tab page 2', 581 \ '# Xtab1'], a, msg) 582 583 " Switch to tab1 584 tabnext 585 let a = split(execute(':tabs'), "\n") 586 call assert_equal(['Tab page 1', 587 \ '# Xtab2', 588 \ 'Tab page 2', 589 \ '> Xtab1'], a, msg) 590 591 " Click in tab2 and drag it to tab1. 592 " This time it is non-current tab. 593 call MouseLeftClick(row, 6) 594 call assert_equal(0, getcharmod(), msg) 595 for col in [7, 8, 9, 10] 596 call MouseLeftDrag(row, col) 597 endfor 598 call MouseLeftRelease(row, col) 599 let a = split(execute(':tabs'), "\n") 600 call assert_equal(['Tab page 1', 601 \ '# Xtab1', 602 \ 'Tab page 2', 603 \ '> Xtab2'], a, msg) 604 605 " Click elsewhere so that click in next iteration is not 606 " interpreted as unwanted double-click. 607 call MouseLeftClick(row, 11) 608 call MouseLeftRelease(row, 11) 609 610 %bwipe! 611 endfor 612 613 let &mouse = save_mouse 614 " let &term = save_term 615 " let &ttymouse = save_ttymouse 616 " call test_override('no_query_mouse', 0) 617 set mousetime& 618 endfunc 619 620 func Test_term_mouse_double_click_to_create_tab() 621 let save_mouse = &mouse 622 let save_term = &term 623 " let save_ttymouse = &ttymouse 624 " call test_override('no_query_mouse', 1) 625 " Set 'mousetime' to a small value, so that double-click works but we don't 626 " have to wait long to avoid a triple-click. 627 " set mouse=a term=xterm mousetime=200 628 set mouse=a mousetime=200 629 let row = 1 630 let col = 10 631 632 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 633 let msg = 'ttymouse=' .. ttymouse_val 634 " exe 'set ttymouse=' .. ttymouse_val 635 e Xtab1 636 tabnew Xtab2 637 638 let a = split(execute(':tabs'), "\n") 639 call assert_equal(['Tab page 1', 640 \ '# Xtab1', 641 \ 'Tab page 2', 642 \ '> Xtab2'], a, msg) 643 644 redraw 645 call MouseLeftClick(row, col) 646 " Check getcharmod() to verify that first click is not 647 " interpreted as a spurious double-click. 648 call assert_equal(0, getcharmod(), msg) 649 call MouseLeftRelease(row, col) 650 call MouseLeftClick(row, col) 651 call assert_equal(32, getcharmod(), msg) " double-click 652 call MouseLeftRelease(row, col) 653 let a = split(execute(':tabs'), "\n") 654 call assert_equal(['Tab page 1', 655 \ ' Xtab1', 656 \ 'Tab page 2', 657 \ '> [No Name]', 658 \ 'Tab page 3', 659 \ '# Xtab2'], a, msg) 660 661 " Click elsewhere so that click in next iteration is not 662 " interpreted as unwanted double click. 663 call MouseLeftClick(row, col + 1) 664 call MouseLeftRelease(row, col + 1) 665 666 %bwipe! 667 endfor 668 669 let &mouse = save_mouse 670 " let &term = save_term 671 " let &ttymouse = save_ttymouse 672 " call test_override('no_query_mouse', 0) 673 set mousetime& 674 endfunc 675 676 " Test double/triple/quadruple click in normal mode to visually select. 677 func Test_term_mouse_multiple_clicks_to_visually_select() 678 let save_mouse = &mouse 679 let save_term = &term 680 " let save_ttymouse = &ttymouse 681 " call test_override('no_query_mouse', 1) 682 683 " 'mousetime' must be sufficiently large, or else the test is flaky when 684 " using a ssh connection with X forwarding; i.e. ssh -X (issue #7563). 685 " set mouse=a term=xterm mousetime=600 686 set mouse=a mousetime=600 687 new 688 689 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 690 let msg = 'ttymouse=' .. ttymouse_val 691 " exe 'set ttymouse=' .. ttymouse_val 692 call setline(1, ['foo [foo bar] foo', 'foo']) 693 694 " Double-click on word should visually select the word. 695 call MouseLeftClick(1, 2) 696 call assert_equal(0, getcharmod(), msg) 697 call MouseLeftRelease(1, 2) 698 call MouseLeftClick(1, 2) 699 call assert_equal(32, getcharmod(), msg) " double-click 700 call MouseLeftRelease(1, 2) 701 call assert_equal('v', mode(), msg) 702 norm! r1 703 call assert_equal(['111 [foo bar] foo', 'foo'], getline(1, '$'), msg) 704 705 " Double-click on opening square bracket should visually 706 " select the whole [foo bar]. 707 call MouseLeftClick(1, 5) 708 call assert_equal(0, getcharmod(), msg) 709 call MouseLeftRelease(1, 5) 710 call MouseLeftClick(1, 5) 711 call assert_equal(32, getcharmod(), msg) " double-click 712 call MouseLeftRelease(1, 5) 713 call assert_equal('v', mode(), msg) 714 norm! r2 715 call assert_equal(['111 222222222 foo', 'foo'], getline(1, '$'), msg) 716 717 " Triple-click should visually select the whole line. 718 call MouseLeftClick(1, 3) 719 call assert_equal(0, getcharmod(), msg) 720 call MouseLeftRelease(1, 3) 721 call MouseLeftClick(1, 3) 722 call assert_equal(32, getcharmod(), msg) " double-click 723 call MouseLeftRelease(1, 3) 724 call MouseLeftClick(1, 3) 725 call assert_equal(64, getcharmod(), msg) " triple-click 726 call MouseLeftRelease(1, 3) 727 call assert_equal('V', mode(), msg) 728 norm! r3 729 call assert_equal(['33333333333333333', 'foo'], getline(1, '$'), msg) 730 731 " Quadruple-click should start visual block select. 732 call MouseLeftClick(1, 2) 733 call assert_equal(0, getcharmod(), msg) 734 call MouseLeftRelease(1, 2) 735 call MouseLeftClick(1, 2) 736 call assert_equal(32, getcharmod(), msg) " double-click 737 call MouseLeftRelease(1, 2) 738 call MouseLeftClick(1, 2) 739 call assert_equal(64, getcharmod(), msg) " triple-click 740 call MouseLeftRelease(1, 2) 741 call MouseLeftClick(1, 2) 742 call assert_equal(96, getcharmod(), msg) " quadruple-click 743 call MouseLeftRelease(1, 2) 744 call assert_equal("\<c-v>", mode(), msg) 745 norm! r4 746 call assert_equal(['34333333333333333', 'foo'], getline(1, '$'), msg) 747 748 " Double-click on a space character should visually select all the 749 " consecutive space characters. 750 %d 751 call setline(1, ' one two') 752 call MouseLeftClick(1, 2) 753 call MouseLeftRelease(1, 2) 754 call MouseLeftClick(1, 2) 755 call MouseLeftRelease(1, 2) 756 call assert_equal('v', mode(), msg) 757 norm! r1 758 call assert_equal(['1111one two'], getline(1, '$'), msg) 759 760 " Double-click on a word with exclusive selection 761 set selection=exclusive 762 let @" = '' 763 call MouseLeftClick(1, 10) 764 call MouseLeftRelease(1, 10) 765 call MouseLeftClick(1, 10) 766 call MouseLeftRelease(1, 10) 767 norm! y 768 call assert_equal('two', @", msg) 769 770 " Double click to select a block of text with exclusive selection 771 %d 772 call setline(1, 'one (two) three') 773 call MouseLeftClick(1, 5) 774 call MouseLeftRelease(1, 5) 775 call MouseLeftClick(1, 5) 776 call MouseLeftRelease(1, 5) 777 norm! y 778 call assert_equal(5, col("'<"), msg) 779 call assert_equal(10, col("'>"), msg) 780 781 call MouseLeftClick(1, 9) 782 call MouseLeftRelease(1, 9) 783 call MouseLeftClick(1, 9) 784 call MouseLeftRelease(1, 9) 785 norm! y 786 call assert_equal(5, col("'<"), msg) 787 call assert_equal(10, col("'>"), msg) 788 set selection& 789 790 " Click somewhere else so that the clicks above is not combined with the 791 " clicks in the next iteration. 792 call MouseRightClick(3, 10) 793 call MouseRightRelease(3, 10) 794 endfor 795 796 let &mouse = save_mouse 797 " let &term = save_term 798 " let &ttymouse = save_ttymouse 799 set mousetime& 800 " call test_override('no_query_mouse', 0) 801 bwipe! 802 endfunc 803 804 " Test for selecting text in visual blockwise mode using Alt-LeftClick 805 func Test_mouse_alt_leftclick() 806 let save_mouse = &mouse 807 let save_term = &term 808 " let save_ttymouse = &ttymouse 809 " call test_override('no_query_mouse', 1) 810 " set mouse=a term=xterm mousetime=200 811 set mouse=a mousetime=200 812 set mousemodel=popup 813 new 814 call setline(1, 'one (two) three') 815 816 for ttymouse_val in g:Ttymouse_values 817 let msg = 'ttymouse=' .. ttymouse_val 818 " exe 'set ttymouse=' .. ttymouse_val 819 820 " Left click with the Alt modifier key should extend the selection in 821 " blockwise visual mode. 822 let @" = '' 823 call MouseLeftClick(1, 3) 824 call MouseLeftRelease(1, 3) 825 call MouseAltLeftClick(1, 11) 826 call MouseLeftRelease(1, 11) 827 call assert_equal("\<C-V>", mode(), msg) 828 normal! y 829 call assert_equal('e (two) t', @") 830 endfor 831 832 let &mouse = save_mouse 833 " let &term = save_term 834 " let &ttymouse = save_ttymouse 835 set mousetime& mousemodel& 836 " call test_override('no_query_mouse', 0) 837 bw! 838 endfunc 839 840 func Run_test_xterm_mouse_click_in_fold_columns() 841 new 842 let save_mouse = &mouse 843 let save_term = &term 844 " let save_ttymouse = &ttymouse 845 let save_foldcolumn = &foldcolumn 846 " set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2 847 set mouse=a foldcolumn=3 848 849 " Create 2 nested folds. 850 call setline(1, range(1, 7)) 851 2,6fold 852 norm! zR 853 4,5fold 854 call assert_equal([-1, -1, -1, 4, 4, -1, -1], 855 \ map(range(1, 7), 'foldclosed(v:val)')) 856 857 " Click in "+" of inner fold in foldcolumn should open it. 858 redraw 859 let row = 4 860 let col = 2 861 call MouseLeftClick(row, col) 862 call MouseLeftRelease(row, col) 863 call assert_equal([-1, -1, -1, -1, -1, -1, -1], 864 \ map(range(1, 7), 'foldclosed(v:val)')) 865 866 " Click in "-" of outer fold in foldcolumn should close it. 867 redraw 868 let row = 2 869 let col = 1 870 call MouseLeftClick(row, col) 871 call MouseLeftRelease(row, col) 872 call assert_equal([-1, 2, 2, 2, 2, 2, -1], 873 \ map(range(1, 7), 'foldclosed(v:val)')) 874 norm! zR 875 876 " Click in "|" of inner fold in foldcolumn should close it. 877 redraw 878 let row = 5 879 let col = 2 880 call MouseLeftClick(row, col) 881 call MouseLeftRelease(row, col) 882 call assert_equal([-1, -1, -1, 4, 4, -1, -1], 883 \ map(range(1, 7), 'foldclosed(v:val)')) 884 885 let &foldcolumn = save_foldcolumn 886 " Redraw at the end of the test to avoid interfering with other tests. 887 defer execute('redraw') 888 " let &ttymouse = save_ttymouse 889 " let &term = save_term 890 let &mouse = save_mouse 891 bwipe! 892 endfunc 893 894 func Test_xterm_mouse_click_in_fold_columns() 895 call Run_test_xterm_mouse_click_in_fold_columns() 896 set fillchars+=foldclose:▶ 897 call Run_test_xterm_mouse_click_in_fold_columns() 898 set fillchars-=foldclose:▶ fillchars+=foldclose:! 899 call Run_test_xterm_mouse_click_in_fold_columns() 900 set fillchars& 901 endfunc 902 903 " Test for the 'h' flag in the 'mouse' option. Using mouse in the help window. 904 func Test_term_mouse_help_window() 905 let save_mouse = &mouse 906 let save_term = &term 907 " let save_ttymouse = &ttymouse 908 " call test_override('no_query_mouse', 1) 909 " set mouse=h term=xterm mousetime=200 910 set mouse=h mousetime=200 911 912 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 913 let msg = 'ttymouse=' .. ttymouse_val 914 " exe 'set ttymouse=' .. ttymouse_val 915 help 916 let @" = '' 917 call MouseLeftClick(2, 5) 918 call MouseLeftRelease(2, 5) 919 call MouseLeftClick(1, 1) 920 call MouseLeftDrag(1, 10) 921 call MouseLeftRelease(1, 10) 922 norm! y 923 call assert_equal('*help.txt*', @", msg) 924 helpclose 925 926 " Click somewhere else to make sure the left click above is not combined 927 " with the next left click and treated as a double click 928 call MouseRightClick(5, 10) 929 call MouseRightRelease(5, 10) 930 endfor 931 932 let &mouse = save_mouse 933 " let &term = save_term 934 " let &ttymouse = save_ttymouse 935 set mousetime& 936 " call test_override('no_query_mouse', 0) 937 %bw! 938 endfunc 939 940 " Test for the translation of various mouse terminal codes 941 func Test_mouse_termcodes() 942 let save_mouse = &mouse 943 let save_term = &term 944 " let save_ttymouse = &ttymouse 945 " call test_override('no_query_mouse', 1) 946 " set mouse=a term=xterm mousetime=200 947 948 new 949 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm 950 let msg = 'ttymouse=' .. ttymouse_val 951 " exe 'set ttymouse=' .. ttymouse_val 952 953 let mouse_codes = [ 954 \ ["\<LeftMouse>", "<LeftMouse>"], 955 \ ["\<MiddleMouse>", "<MiddleMouse>"], 956 \ ["\<RightMouse>", "<RightMouse>"], 957 \ ["\<S-LeftMouse>", "<S-LeftMouse>"], 958 \ ["\<S-MiddleMouse>", "<S-MiddleMouse>"], 959 \ ["\<S-RightMouse>", "<S-RightMouse>"], 960 \ ["\<C-LeftMouse>", "<C-LeftMouse>"], 961 \ ["\<C-MiddleMouse>", "<C-MiddleMouse>"], 962 \ ["\<C-RightMouse>", "<C-RightMouse>"], 963 \ ["\<M-LeftMouse>", "<M-LeftMouse>"], 964 \ ["\<M-MiddleMouse>", "<M-MiddleMouse>"], 965 \ ["\<M-RightMouse>", "<M-RightMouse>"], 966 \ ["\<2-LeftMouse>", "<2-LeftMouse>"], 967 \ ["\<2-MiddleMouse>", "<2-MiddleMouse>"], 968 \ ["\<2-RightMouse>", "<2-RightMouse>"], 969 \ ["\<3-LeftMouse>", "<3-LeftMouse>"], 970 \ ["\<3-MiddleMouse>", "<3-MiddleMouse>"], 971 \ ["\<3-RightMouse>", "<3-RightMouse>"], 972 \ ["\<4-LeftMouse>", "<4-LeftMouse>"], 973 \ ["\<4-MiddleMouse>", "<4-MiddleMouse>"], 974 \ ["\<4-RightMouse>", "<4-RightMouse>"], 975 \ ["\<LeftDrag>", "<LeftDrag>"], 976 \ ["\<MiddleDrag>", "<MiddleDrag>"], 977 \ ["\<RightDrag>", "<RightDrag>"], 978 \ ["\<LeftRelease>", "<LeftRelease>"], 979 \ ["\<MiddleRelease>", "<MiddleRelease>"], 980 \ ["\<RightRelease>", "<RightRelease>"], 981 \ ["\<ScrollWheelUp>", "<ScrollWheelUp>"], 982 \ ["\<S-ScrollWheelUp>", "<S-ScrollWheelUp>"], 983 \ ["\<C-ScrollWheelUp>", "<C-ScrollWheelUp>"], 984 \ ["\<ScrollWheelDown>", "<ScrollWheelDown>"], 985 \ ["\<S-ScrollWheelDown>", "<S-ScrollWheelDown>"], 986 \ ["\<C-ScrollWheelDown>", "<C-ScrollWheelDown>"], 987 \ ["\<ScrollWheelLeft>", "<ScrollWheelLeft>"], 988 \ ["\<S-ScrollWheelLeft>", "<S-ScrollWheelLeft>"], 989 \ ["\<C-ScrollWheelLeft>", "<C-ScrollWheelLeft>"], 990 \ ["\<ScrollWheelRight>", "<ScrollWheelRight>"], 991 \ ["\<S-ScrollWheelRight>", "<S-ScrollWheelRight>"], 992 \ ["\<C-ScrollWheelRight>", "<C-ScrollWheelRight>"] 993 \ ] 994 995 for [code, outstr] in mouse_codes 996 exe "normal ggC\<C-K>" . code 997 call assert_equal(outstr, getline(1), msg) 998 endfor 999 endfor 1000 1001 let &mouse = save_mouse 1002 " let &term = save_term 1003 " let &ttymouse = save_ttymouse 1004 set mousetime& 1005 " call test_override('no_query_mouse', 0) 1006 %bw! 1007 endfunc 1008 1009 " Test for translation of special key codes (<xF1>, <xF2>, etc.) 1010 func Test_Keycode_Translation() 1011 let keycodes = [ 1012 \ ["<xUp>", "<Up>"], 1013 \ ["<xDown>", "<Down>"], 1014 \ ["<xLeft>", "<Left>"], 1015 \ ["<xRight>", "<Right>"], 1016 \ ["<xHome>", "<Home>"], 1017 \ ["<xEnd>", "<End>"], 1018 \ ["<zHome>", "<Home>"], 1019 \ ["<zEnd>", "<End>"], 1020 \ ["<xF1>", "<F1>"], 1021 \ ["<xF2>", "<F2>"], 1022 \ ["<xF3>", "<F3>"], 1023 \ ["<xF4>", "<F4>"], 1024 \ ["<S-xF1>", "<S-F1>"], 1025 \ ["<S-xF2>", "<S-F2>"], 1026 \ ["<S-xF3>", "<S-F3>"], 1027 \ ["<S-xF4>", "<S-F4>"]] 1028 for [k1, k2] in keycodes 1029 exe "nnoremap " .. k1 .. " 2wx" 1030 call assert_true(maparg(k1, 'n', 0, 1).lhs == k2) 1031 exe "nunmap " .. k1 1032 endfor 1033 endfunc 1034 1035 " Test for terminal keycodes that doesn't have termcap entries 1036 func Test_special_term_keycodes() 1037 new 1038 " Test for <xHome>, <S-xHome> and <C-xHome> 1039 " send <K_SPECIAL> <KS_EXTRA> keycode 1040 call feedkeys("i\<C-K>\x80\xfd\x3f\n", 'xt') 1041 " send <K_SPECIAL> <KS_MODIFIER> bitmap <K_SPECIAL> <KS_EXTRA> keycode 1042 call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3f\n", 'xt') 1043 call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3f\n", 'xt') 1044 " Test for <xEnd>, <S-xEnd> and <C-xEnd> 1045 call feedkeys("i\<C-K>\x80\xfd\x3d\n", 'xt') 1046 call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3d\n", 'xt') 1047 call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3d\n", 'xt') 1048 " Test for <zHome>, <S-zHome> and <C-zHome> 1049 call feedkeys("i\<C-K>\x80\xfd\x40\n", 'xt') 1050 call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x40\n", 'xt') 1051 call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x40\n", 'xt') 1052 " Test for <zEnd>, <S-zEnd> and <C-zEnd> 1053 call feedkeys("i\<C-K>\x80\xfd\x3e\n", 'xt') 1054 call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3e\n", 'xt') 1055 call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3e\n", 'xt') 1056 " Test for <xUp>, <xDown>, <xLeft> and <xRight> 1057 call feedkeys("i\<C-K>\x80\xfd\x41\n", 'xt') 1058 call feedkeys("i\<C-K>\x80\xfd\x42\n", 'xt') 1059 call feedkeys("i\<C-K>\x80\xfd\x43\n", 'xt') 1060 call feedkeys("i\<C-K>\x80\xfd\x44\n", 'xt') 1061 call assert_equal(['<Home>', '<S-Home>', '<C-Home>', 1062 \ '<End>', '<S-End>', '<C-End>', 1063 \ '<Home>', '<S-Home>', '<C-Home>', 1064 \ '<End>', '<S-End>', '<C-End>', 1065 \ '<Up>', '<Down>', '<Left>', '<Right>', ''], getline(1, '$')) 1066 bw! 1067 endfunc 1068 1069 1070 " vim: shiftwidth=2 sts=2 expandtab