1515545e1SBram Moolenaar" Test for Select-mode 2515545e1SBram Moolenaar 3515545e1SBram Moolenaar" This only works for Unix in a terminal 4515545e1SBram Moolenaarsource check.vim 5515545e1SBram MoolenaarCheckNotGui 6515545e1SBram MoolenaarCheckUnix 7515545e1SBram Moolenaar 8515545e1SBram Moolenaarsource mouse.vim 9515545e1SBram Moolenaar 10515545e1SBram Moolenaar" Test for select mode 11515545e1SBram Moolenaarfunc Test_selectmode_basic() 12515545e1SBram Moolenaar new 13515545e1SBram Moolenaar call setline(1, range(1,100)) 14515545e1SBram Moolenaar 50 15515545e1SBram Moolenaar norm! gHy 16515545e1SBram Moolenaar call assert_equal('y51', getline('.')) 17515545e1SBram Moolenaar call setline(1, range(1,100)) 18515545e1SBram Moolenaar 50 19515545e1SBram Moolenaar exe ":norm! V9jo\<c-g>y" 20515545e1SBram Moolenaar call assert_equal('y60', getline('.')) 21515545e1SBram Moolenaar call setline(1, range(1,100)) 22515545e1SBram Moolenaar 50 23515545e1SBram Moolenaar call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx') 24515545e1SBram Moolenaar call assert_equal('c51', getline('.')) 25515545e1SBram Moolenaar " clean up 26515545e1SBram Moolenaar bw! 27515545e1SBram Moolenaarendfunc 28515545e1SBram Moolenaar 29515545e1SBram Moolenaar" Test for starting selectmode 30515545e1SBram Moolenaarfunc Test_selectmode_start() 31515545e1SBram Moolenaar new 32515545e1SBram Moolenaar set selectmode=key keymodel=startsel 33515545e1SBram Moolenaar call setline(1, ['abc', 'def', 'ghi']) 34515545e1SBram Moolenaar call cursor(1, 4) 35515545e1SBram Moolenaar call feedkeys("A\<s-home>start\<esc>", 'txin') 36515545e1SBram Moolenaar call assert_equal(['startdef', 'ghi'], getline(1, '$')) 37515545e1SBram Moolenaar " start select mode again with gv 38515545e1SBram Moolenaar set selectmode=cmd 39515545e1SBram Moolenaar call feedkeys('gvabc', 'xt') 40515545e1SBram Moolenaar call assert_equal('abctdef', getline(1)) 41845e0ee5SBram Moolenaar " arrow keys without shift should not start selection 42845e0ee5SBram Moolenaar call feedkeys("A\<Home>\<Right>\<Left>ro", 'xt') 43845e0ee5SBram Moolenaar call assert_equal('roabctdef', getline(1)) 44515545e1SBram Moolenaar set selectmode= keymodel= 45515545e1SBram Moolenaar bw! 46515545e1SBram Moolenaarendfunc 47515545e1SBram Moolenaar 48515545e1SBram Moolenaar" Test for characterwise select mode 49515545e1SBram Moolenaarfunc Test_characterwise_select_mode() 50515545e1SBram Moolenaar new 51515545e1SBram Moolenaar 52515545e1SBram Moolenaar " Select mode maps 53515545e1SBram Moolenaar snoremap <lt>End> <End> 54515545e1SBram Moolenaar snoremap <lt>Down> <Down> 55515545e1SBram Moolenaar snoremap <lt>Del> <Del> 56515545e1SBram Moolenaar 57515545e1SBram Moolenaar " characterwise select mode: delete middle line 58515545e1SBram Moolenaar call deletebufline('', 1, '$') 59515545e1SBram Moolenaar call append('$', ['a', 'b', 'c']) 60515545e1SBram Moolenaar exe "normal Gkkgh\<End>\<Del>" 61515545e1SBram Moolenaar call assert_equal(['', 'b', 'c'], getline(1, '$')) 62515545e1SBram Moolenaar 63515545e1SBram Moolenaar " characterwise select mode: delete middle two lines 64515545e1SBram Moolenaar call deletebufline('', 1, '$') 65515545e1SBram Moolenaar call append('$', ['a', 'b', 'c']) 66515545e1SBram Moolenaar exe "normal Gkkgh\<Down>\<End>\<Del>" 67515545e1SBram Moolenaar call assert_equal(['', 'c'], getline(1, '$')) 68515545e1SBram Moolenaar 69515545e1SBram Moolenaar " characterwise select mode: delete last line 70515545e1SBram Moolenaar call deletebufline('', 1, '$') 71515545e1SBram Moolenaar call append('$', ['a', 'b', 'c']) 72515545e1SBram Moolenaar exe "normal Ggh\<End>\<Del>" 73515545e1SBram Moolenaar call assert_equal(['', 'a', 'b', ''], getline(1, '$')) 74515545e1SBram Moolenaar 75515545e1SBram Moolenaar " characterwise select mode: delete last two lines 76515545e1SBram Moolenaar call deletebufline('', 1, '$') 77515545e1SBram Moolenaar call append('$', ['a', 'b', 'c']) 78515545e1SBram Moolenaar exe "normal Gkgh\<Down>\<End>\<Del>" 79515545e1SBram Moolenaar call assert_equal(['', 'a', ''], getline(1, '$')) 80515545e1SBram Moolenaar 81515545e1SBram Moolenaar " CTRL-H in select mode behaves like 'x' 82515545e1SBram Moolenaar call setline(1, 'abcdef') 83515545e1SBram Moolenaar exe "normal! gggh\<Right>\<Right>\<Right>\<C-H>" 84515545e1SBram Moolenaar call assert_equal('ef', getline(1)) 85515545e1SBram Moolenaar 86515545e1SBram Moolenaar " CTRL-O in select mode switches to visual mode for one command 87515545e1SBram Moolenaar call setline(1, 'abcdef') 88515545e1SBram Moolenaar exe "normal! gggh\<C-O>3lm" 89515545e1SBram Moolenaar call assert_equal('mef', getline(1)) 90515545e1SBram Moolenaar 91515545e1SBram Moolenaar sunmap <lt>End> 92515545e1SBram Moolenaar sunmap <lt>Down> 93515545e1SBram Moolenaar sunmap <lt>Del> 94515545e1SBram Moolenaar bwipe! 95515545e1SBram Moolenaarendfunc 96515545e1SBram Moolenaar 97515545e1SBram Moolenaar" Test for linewise select mode 98515545e1SBram Moolenaarfunc Test_linewise_select_mode() 99515545e1SBram Moolenaar new 100515545e1SBram Moolenaar 101515545e1SBram Moolenaar " linewise select mode: delete middle line 102515545e1SBram Moolenaar call append('$', ['a', 'b', 'c']) 103515545e1SBram Moolenaar exe "normal GkkgH\<Del>" 104515545e1SBram Moolenaar call assert_equal(['', 'b', 'c'], getline(1, '$')) 105515545e1SBram Moolenaar 106515545e1SBram Moolenaar " linewise select mode: delete middle two lines 107515545e1SBram Moolenaar call deletebufline('', 1, '$') 108515545e1SBram Moolenaar call append('$', ['a', 'b', 'c']) 109515545e1SBram Moolenaar exe "normal GkkgH\<Down>\<Del>" 110515545e1SBram Moolenaar call assert_equal(['', 'c'], getline(1, '$')) 111515545e1SBram Moolenaar 112515545e1SBram Moolenaar " linewise select mode: delete last line 113515545e1SBram Moolenaar call deletebufline('', 1, '$') 114515545e1SBram Moolenaar call append('$', ['a', 'b', 'c']) 115515545e1SBram Moolenaar exe "normal GgH\<Del>" 116515545e1SBram Moolenaar call assert_equal(['', 'a', 'b'], getline(1, '$')) 117515545e1SBram Moolenaar 118515545e1SBram Moolenaar " linewise select mode: delete last two lines 119515545e1SBram Moolenaar call deletebufline('', 1, '$') 120515545e1SBram Moolenaar call append('$', ['a', 'b', 'c']) 121515545e1SBram Moolenaar exe "normal GkgH\<Down>\<Del>" 122515545e1SBram Moolenaar call assert_equal(['', 'a'], getline(1, '$')) 123515545e1SBram Moolenaar 124515545e1SBram Moolenaar bwipe! 125515545e1SBram Moolenaarendfunc 126515545e1SBram Moolenaar 127515545e1SBram Moolenaar" Test for blockwise select mode (g CTRL-H) 128515545e1SBram Moolenaarfunc Test_blockwise_select_mode() 129515545e1SBram Moolenaar new 130515545e1SBram Moolenaar call setline(1, ['foo', 'bar']) 131515545e1SBram Moolenaar call feedkeys("g\<BS>\<Right>\<Down>mm", 'xt') 132515545e1SBram Moolenaar call assert_equal(['mmo', 'mmr'], getline(1, '$')) 133515545e1SBram Moolenaar close! 134515545e1SBram Moolenaarendfunc 135515545e1SBram Moolenaar 136515545e1SBram Moolenaar" Test for using visual mode maps in select mode 137515545e1SBram Moolenaarfunc Test_select_mode_map() 138515545e1SBram Moolenaar new 139515545e1SBram Moolenaar vmap <buffer> <F2> 3l 140515545e1SBram Moolenaar call setline(1, 'Test line') 141515545e1SBram Moolenaar call feedkeys("gh\<F2>map", 'xt') 142515545e1SBram Moolenaar call assert_equal('map line', getline(1)) 143515545e1SBram Moolenaar 144515545e1SBram Moolenaar vmap <buffer> <F2> ygV 145515545e1SBram Moolenaar call feedkeys("0gh\<Right>\<Right>\<F2>cwabc", 'xt') 146515545e1SBram Moolenaar call assert_equal('abc line', getline(1)) 147515545e1SBram Moolenaar 148515545e1SBram Moolenaar vmap <buffer> <F2> :<C-U>let v=100<CR> 149515545e1SBram Moolenaar call feedkeys("gggh\<Right>\<Right>\<F2>foo", 'xt') 150515545e1SBram Moolenaar call assert_equal('foo line', getline(1)) 151515545e1SBram Moolenaar 152515545e1SBram Moolenaar " reselect the select mode using gv from a visual mode map 153515545e1SBram Moolenaar vmap <buffer> <F2> gv 154515545e1SBram Moolenaar set selectmode=cmd 155515545e1SBram Moolenaar call feedkeys("0gh\<F2>map", 'xt') 156515545e1SBram Moolenaar call assert_equal('map line', getline(1)) 157515545e1SBram Moolenaar set selectmode& 158515545e1SBram Moolenaar 159515545e1SBram Moolenaar close! 160515545e1SBram Moolenaarendfunc 161515545e1SBram Moolenaar 162515545e1SBram Moolenaar" Test double/triple/quadruple click to start 'select' mode 163515545e1SBram Moolenaarfunc Test_term_mouse_multiple_clicks_to_select_mode() 164515545e1SBram Moolenaar let save_mouse = &mouse 165515545e1SBram Moolenaar let save_term = &term 166515545e1SBram Moolenaar let save_ttymouse = &ttymouse 167515545e1SBram Moolenaar call test_override('no_query_mouse', 1) 168*1e448465SBram Moolenaar 169*1e448465SBram Moolenaar " 'mousetime' must be sufficiently large, or else the test is flaky when 170*1e448465SBram Moolenaar " using a ssh connection with X forwarding; i.e. ssh -X. 171*1e448465SBram Moolenaar set mouse=a term=xterm mousetime=1000 172515545e1SBram Moolenaar set selectmode=mouse 173515545e1SBram Moolenaar new 174515545e1SBram Moolenaar 175515545e1SBram Moolenaar for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 176515545e1SBram Moolenaar let msg = 'ttymouse=' .. ttymouse_val 177515545e1SBram Moolenaar exe 'set ttymouse=' .. ttymouse_val 178515545e1SBram Moolenaar 179515545e1SBram Moolenaar " Single-click and drag should 'select' the characters 180515545e1SBram Moolenaar call setline(1, ['foo [foo bar] foo', 'foo']) 181515545e1SBram Moolenaar call MouseLeftClick(1, 3) 182515545e1SBram Moolenaar call assert_equal(0, getcharmod(), msg) 183515545e1SBram Moolenaar call MouseLeftDrag(1, 13) 184515545e1SBram Moolenaar call MouseLeftRelease(1, 13) 185515545e1SBram Moolenaar norm! o 186515545e1SBram Moolenaar call assert_equal(['foo foo', 'foo'], getline(1, '$'), msg) 187515545e1SBram Moolenaar 188515545e1SBram Moolenaar " Double-click on word should visually 'select' the word. 189515545e1SBram Moolenaar call setline(1, ['foo [foo bar] foo', 'foo']) 190515545e1SBram Moolenaar call MouseLeftClick(1, 2) 191515545e1SBram Moolenaar call assert_equal(0, getcharmod(), msg) 192515545e1SBram Moolenaar call MouseLeftRelease(1, 2) 193515545e1SBram Moolenaar call MouseLeftClick(1, 2) 194515545e1SBram Moolenaar call assert_equal(32, getcharmod(), msg) " double-click 195515545e1SBram Moolenaar call MouseLeftRelease(1, 2) 196515545e1SBram Moolenaar call assert_equal('s', mode(), msg) 197515545e1SBram Moolenaar norm! bar 198515545e1SBram Moolenaar call assert_equal(['bar [foo bar] foo', 'foo'], getline(1, '$'), msg) 199515545e1SBram Moolenaar 200515545e1SBram Moolenaar " Double-click on opening square bracket should visually 201515545e1SBram Moolenaar " 'select' the whole [foo bar]. 202515545e1SBram Moolenaar call setline(1, ['foo [foo bar] foo', 'foo']) 203515545e1SBram Moolenaar call MouseLeftClick(1, 5) 204515545e1SBram Moolenaar call assert_equal(0, getcharmod(), msg) 205515545e1SBram Moolenaar call MouseLeftRelease(1, 5) 206515545e1SBram Moolenaar call MouseLeftClick(1, 5) 207515545e1SBram Moolenaar call assert_equal(32, getcharmod(), msg) " double-click 208515545e1SBram Moolenaar call MouseLeftRelease(1, 5) 209515545e1SBram Moolenaar call assert_equal('s', mode(), msg) 210515545e1SBram Moolenaar norm! bar 211515545e1SBram Moolenaar call assert_equal(['foo bar foo', 'foo'], getline(1, '$'), msg) 212515545e1SBram Moolenaar 213515545e1SBram Moolenaar " To guarantee that the next click is not counted as a triple click 214515545e1SBram Moolenaar call MouseRightClick(1, 1) 215515545e1SBram Moolenaar call MouseRightRelease(1, 1) 216515545e1SBram Moolenaar 217515545e1SBram Moolenaar " Triple-click should visually 'select' the whole line. 218515545e1SBram Moolenaar call setline(1, ['foo [foo bar] foo', 'foo']) 219515545e1SBram Moolenaar call MouseLeftClick(1, 3) 220515545e1SBram Moolenaar call assert_equal(0, getcharmod(), msg) 221515545e1SBram Moolenaar call MouseLeftRelease(1, 3) 222515545e1SBram Moolenaar call MouseLeftClick(1, 3) 223515545e1SBram Moolenaar call assert_equal(32, getcharmod(), msg) " double-click 224515545e1SBram Moolenaar call MouseLeftRelease(1, 3) 225515545e1SBram Moolenaar call MouseLeftClick(1, 3) 226515545e1SBram Moolenaar call assert_equal(64, getcharmod(), msg) " triple-click 227515545e1SBram Moolenaar call MouseLeftRelease(1, 3) 228515545e1SBram Moolenaar call assert_equal('S', mode(), msg) 229515545e1SBram Moolenaar norm! baz 230515545e1SBram Moolenaar call assert_equal(['bazfoo'], getline(1, '$'), msg) 231515545e1SBram Moolenaar 232515545e1SBram Moolenaar " Quadruple-click should start visual block 'select'. 233515545e1SBram Moolenaar call setline(1, ['aaaaaa', 'bbbbbb']) 234515545e1SBram Moolenaar call MouseLeftClick(1, 2) 235515545e1SBram Moolenaar call assert_equal(0, getcharmod(), msg) 236515545e1SBram Moolenaar call MouseLeftRelease(1, 2) 237515545e1SBram Moolenaar call MouseLeftClick(1, 2) 238515545e1SBram Moolenaar call assert_equal(32, getcharmod(), msg) " double-click 239515545e1SBram Moolenaar call MouseLeftRelease(1, 2) 240515545e1SBram Moolenaar call MouseLeftClick(1, 2) 241515545e1SBram Moolenaar call assert_equal(64, getcharmod(), msg) " triple-click 242515545e1SBram Moolenaar call MouseLeftRelease(1, 2) 243515545e1SBram Moolenaar call MouseLeftClick(1, 2) 244515545e1SBram Moolenaar call assert_equal(96, getcharmod(), msg) " quadruple-click 245515545e1SBram Moolenaar call MouseLeftDrag(2, 4) 246515545e1SBram Moolenaar call MouseLeftRelease(2, 4) 247515545e1SBram Moolenaar call assert_equal("\<c-s>", mode(), msg) 248515545e1SBram Moolenaar norm! x 249515545e1SBram Moolenaar call assert_equal(['axaa', 'bxbb'], getline(1, '$'), msg) 250515545e1SBram Moolenaar endfor 251515545e1SBram Moolenaar 252515545e1SBram Moolenaar let &mouse = save_mouse 253515545e1SBram Moolenaar let &term = save_term 254515545e1SBram Moolenaar let &ttymouse = save_ttymouse 255515545e1SBram Moolenaar set mousetime& 256515545e1SBram Moolenaar set selectmode& 257515545e1SBram Moolenaar call test_override('no_query_mouse', 0) 258515545e1SBram Moolenaar bwipe! 259515545e1SBram Moolenaarendfunc 260515545e1SBram Moolenaar 261515545e1SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 262