1" Test for Select-mode 2 3" This only works for Unix in a terminal 4source check.vim 5CheckNotGui 6CheckUnix 7 8source mouse.vim 9 10" Test for select mode 11func Test_selectmode_basic() 12 new 13 call setline(1, range(1,100)) 14 50 15 norm! gHy 16 call assert_equal('y51', getline('.')) 17 call setline(1, range(1,100)) 18 50 19 exe ":norm! V9jo\<c-g>y" 20 call assert_equal('y60', getline('.')) 21 call setline(1, range(1,100)) 22 50 23 call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx') 24 call assert_equal('c51', getline('.')) 25 " clean up 26 bw! 27endfunc 28 29" Test for starting selectmode 30func Test_selectmode_start() 31 new 32 set selectmode=key keymodel=startsel 33 call setline(1, ['abc', 'def', 'ghi']) 34 call cursor(1, 4) 35 call feedkeys("A\<s-home>start\<esc>", 'txin') 36 call assert_equal(['startdef', 'ghi'], getline(1, '$')) 37 " start select mode again with gv 38 set selectmode=cmd 39 call feedkeys('gvabc', 'xt') 40 call assert_equal('abctdef', getline(1)) 41 " arrow keys without shift should not start selection 42 call feedkeys("A\<Home>\<Right>\<Left>ro", 'xt') 43 call assert_equal('roabctdef', getline(1)) 44 set selectmode= keymodel= 45 bw! 46endfunc 47 48" Test for characterwise select mode 49func Test_characterwise_select_mode() 50 new 51 52 " Select mode maps 53 snoremap <lt>End> <End> 54 snoremap <lt>Down> <Down> 55 snoremap <lt>Del> <Del> 56 57 " characterwise select mode: delete middle line 58 call deletebufline('', 1, '$') 59 call append('$', ['a', 'b', 'c']) 60 exe "normal Gkkgh\<End>\<Del>" 61 call assert_equal(['', 'b', 'c'], getline(1, '$')) 62 63 " characterwise select mode: delete middle two lines 64 call deletebufline('', 1, '$') 65 call append('$', ['a', 'b', 'c']) 66 exe "normal Gkkgh\<Down>\<End>\<Del>" 67 call assert_equal(['', 'c'], getline(1, '$')) 68 69 " characterwise select mode: delete last line 70 call deletebufline('', 1, '$') 71 call append('$', ['a', 'b', 'c']) 72 exe "normal Ggh\<End>\<Del>" 73 call assert_equal(['', 'a', 'b', ''], getline(1, '$')) 74 75 " characterwise select mode: delete last two lines 76 call deletebufline('', 1, '$') 77 call append('$', ['a', 'b', 'c']) 78 exe "normal Gkgh\<Down>\<End>\<Del>" 79 call assert_equal(['', 'a', ''], getline(1, '$')) 80 81 " CTRL-H in select mode behaves like 'x' 82 call setline(1, 'abcdef') 83 exe "normal! gggh\<Right>\<Right>\<Right>\<C-H>" 84 call assert_equal('ef', getline(1)) 85 86 " CTRL-O in select mode switches to visual mode for one command 87 call setline(1, 'abcdef') 88 exe "normal! gggh\<C-O>3lm" 89 call assert_equal('mef', getline(1)) 90 91 sunmap <lt>End> 92 sunmap <lt>Down> 93 sunmap <lt>Del> 94 bwipe! 95endfunc 96 97" Test for linewise select mode 98func Test_linewise_select_mode() 99 new 100 101 " linewise select mode: delete middle line 102 call append('$', ['a', 'b', 'c']) 103 exe "normal GkkgH\<Del>" 104 call assert_equal(['', 'b', 'c'], getline(1, '$')) 105 106 " linewise select mode: delete middle two lines 107 call deletebufline('', 1, '$') 108 call append('$', ['a', 'b', 'c']) 109 exe "normal GkkgH\<Down>\<Del>" 110 call assert_equal(['', 'c'], getline(1, '$')) 111 112 " linewise select mode: delete last line 113 call deletebufline('', 1, '$') 114 call append('$', ['a', 'b', 'c']) 115 exe "normal GgH\<Del>" 116 call assert_equal(['', 'a', 'b'], getline(1, '$')) 117 118 " linewise select mode: delete last two lines 119 call deletebufline('', 1, '$') 120 call append('$', ['a', 'b', 'c']) 121 exe "normal GkgH\<Down>\<Del>" 122 call assert_equal(['', 'a'], getline(1, '$')) 123 124 bwipe! 125endfunc 126 127" Test for blockwise select mode (g CTRL-H) 128func Test_blockwise_select_mode() 129 new 130 call setline(1, ['foo', 'bar']) 131 call feedkeys("g\<BS>\<Right>\<Down>mm", 'xt') 132 call assert_equal(['mmo', 'mmr'], getline(1, '$')) 133 close! 134endfunc 135 136" Test for using visual mode maps in select mode 137func Test_select_mode_map() 138 new 139 vmap <buffer> <F2> 3l 140 call setline(1, 'Test line') 141 call feedkeys("gh\<F2>map", 'xt') 142 call assert_equal('map line', getline(1)) 143 144 vmap <buffer> <F2> ygV 145 call feedkeys("0gh\<Right>\<Right>\<F2>cwabc", 'xt') 146 call assert_equal('abc line', getline(1)) 147 148 vmap <buffer> <F2> :<C-U>let v=100<CR> 149 call feedkeys("gggh\<Right>\<Right>\<F2>foo", 'xt') 150 call assert_equal('foo line', getline(1)) 151 152 " reselect the select mode using gv from a visual mode map 153 vmap <buffer> <F2> gv 154 set selectmode=cmd 155 call feedkeys("0gh\<F2>map", 'xt') 156 call assert_equal('map line', getline(1)) 157 set selectmode& 158 159 close! 160endfunc 161 162" Test double/triple/quadruple click to start 'select' mode 163func Test_term_mouse_multiple_clicks_to_select_mode() 164 let save_mouse = &mouse 165 let save_term = &term 166 let save_ttymouse = &ttymouse 167 call test_override('no_query_mouse', 1) 168 169 " 'mousetime' must be sufficiently large, or else the test is flaky when 170 " using a ssh connection with X forwarding; i.e. ssh -X. 171 set mouse=a term=xterm mousetime=1000 172 set selectmode=mouse 173 new 174 175 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 176 let msg = 'ttymouse=' .. ttymouse_val 177 exe 'set ttymouse=' .. ttymouse_val 178 179 " Single-click and drag should 'select' the characters 180 call setline(1, ['foo [foo bar] foo', 'foo']) 181 call MouseLeftClick(1, 3) 182 call assert_equal(0, getcharmod(), msg) 183 call MouseLeftDrag(1, 13) 184 call MouseLeftRelease(1, 13) 185 norm! o 186 call assert_equal(['foo foo', 'foo'], getline(1, '$'), msg) 187 188 " Double-click on word should visually 'select' the word. 189 call setline(1, ['foo [foo bar] foo', 'foo']) 190 call MouseLeftClick(1, 2) 191 call assert_equal(0, getcharmod(), msg) 192 call MouseLeftRelease(1, 2) 193 call MouseLeftClick(1, 2) 194 call assert_equal(32, getcharmod(), msg) " double-click 195 call MouseLeftRelease(1, 2) 196 call assert_equal('s', mode(), msg) 197 norm! bar 198 call assert_equal(['bar [foo bar] foo', 'foo'], getline(1, '$'), msg) 199 200 " Double-click on opening square bracket should visually 201 " 'select' the whole [foo bar]. 202 call setline(1, ['foo [foo bar] foo', 'foo']) 203 call MouseLeftClick(1, 5) 204 call assert_equal(0, getcharmod(), msg) 205 call MouseLeftRelease(1, 5) 206 call MouseLeftClick(1, 5) 207 call assert_equal(32, getcharmod(), msg) " double-click 208 call MouseLeftRelease(1, 5) 209 call assert_equal('s', mode(), msg) 210 norm! bar 211 call assert_equal(['foo bar foo', 'foo'], getline(1, '$'), msg) 212 213 " To guarantee that the next click is not counted as a triple click 214 call MouseRightClick(1, 1) 215 call MouseRightRelease(1, 1) 216 217 " Triple-click should visually 'select' the whole line. 218 call setline(1, ['foo [foo bar] foo', 'foo']) 219 call MouseLeftClick(1, 3) 220 call assert_equal(0, getcharmod(), msg) 221 call MouseLeftRelease(1, 3) 222 call MouseLeftClick(1, 3) 223 call assert_equal(32, getcharmod(), msg) " double-click 224 call MouseLeftRelease(1, 3) 225 call MouseLeftClick(1, 3) 226 call assert_equal(64, getcharmod(), msg) " triple-click 227 call MouseLeftRelease(1, 3) 228 call assert_equal('S', mode(), msg) 229 norm! baz 230 call assert_equal(['bazfoo'], getline(1, '$'), msg) 231 232 " Quadruple-click should start visual block 'select'. 233 call setline(1, ['aaaaaa', 'bbbbbb']) 234 call MouseLeftClick(1, 2) 235 call assert_equal(0, getcharmod(), msg) 236 call MouseLeftRelease(1, 2) 237 call MouseLeftClick(1, 2) 238 call assert_equal(32, getcharmod(), msg) " double-click 239 call MouseLeftRelease(1, 2) 240 call MouseLeftClick(1, 2) 241 call assert_equal(64, getcharmod(), msg) " triple-click 242 call MouseLeftRelease(1, 2) 243 call MouseLeftClick(1, 2) 244 call assert_equal(96, getcharmod(), msg) " quadruple-click 245 call MouseLeftDrag(2, 4) 246 call MouseLeftRelease(2, 4) 247 call assert_equal("\<c-s>", mode(), msg) 248 norm! x 249 call assert_equal(['axaa', 'bxbb'], getline(1, '$'), msg) 250 endfor 251 252 let &mouse = save_mouse 253 let &term = save_term 254 let &ttymouse = save_ttymouse 255 set mousetime& 256 set selectmode& 257 call test_override('no_query_mouse', 0) 258 bwipe! 259endfunc 260 261" vim: shiftwidth=2 sts=2 expandtab 262