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 set selectmode= keymodel= 42 bw! 43endfunc 44 45" Test for characterwise select mode 46func Test_characterwise_select_mode() 47 new 48 49 " Select mode maps 50 snoremap <lt>End> <End> 51 snoremap <lt>Down> <Down> 52 snoremap <lt>Del> <Del> 53 54 " characterwise select mode: delete middle line 55 call deletebufline('', 1, '$') 56 call append('$', ['a', 'b', 'c']) 57 exe "normal Gkkgh\<End>\<Del>" 58 call assert_equal(['', 'b', 'c'], getline(1, '$')) 59 60 " characterwise select mode: delete middle two lines 61 call deletebufline('', 1, '$') 62 call append('$', ['a', 'b', 'c']) 63 exe "normal Gkkgh\<Down>\<End>\<Del>" 64 call assert_equal(['', 'c'], getline(1, '$')) 65 66 " characterwise select mode: delete last line 67 call deletebufline('', 1, '$') 68 call append('$', ['a', 'b', 'c']) 69 exe "normal Ggh\<End>\<Del>" 70 call assert_equal(['', 'a', 'b', ''], getline(1, '$')) 71 72 " characterwise select mode: delete last two lines 73 call deletebufline('', 1, '$') 74 call append('$', ['a', 'b', 'c']) 75 exe "normal Gkgh\<Down>\<End>\<Del>" 76 call assert_equal(['', 'a', ''], getline(1, '$')) 77 78 " CTRL-H in select mode behaves like 'x' 79 call setline(1, 'abcdef') 80 exe "normal! gggh\<Right>\<Right>\<Right>\<C-H>" 81 call assert_equal('ef', getline(1)) 82 83 " CTRL-O in select mode switches to visual mode for one command 84 call setline(1, 'abcdef') 85 exe "normal! gggh\<C-O>3lm" 86 call assert_equal('mef', getline(1)) 87 88 sunmap <lt>End> 89 sunmap <lt>Down> 90 sunmap <lt>Del> 91 bwipe! 92endfunc 93 94" Test for linewise select mode 95func Test_linewise_select_mode() 96 new 97 98 " linewise select mode: delete middle line 99 call append('$', ['a', 'b', 'c']) 100 exe "normal GkkgH\<Del>" 101 call assert_equal(['', 'b', 'c'], getline(1, '$')) 102 103 " linewise select mode: delete middle two lines 104 call deletebufline('', 1, '$') 105 call append('$', ['a', 'b', 'c']) 106 exe "normal GkkgH\<Down>\<Del>" 107 call assert_equal(['', 'c'], getline(1, '$')) 108 109 " linewise select mode: delete last line 110 call deletebufline('', 1, '$') 111 call append('$', ['a', 'b', 'c']) 112 exe "normal GgH\<Del>" 113 call assert_equal(['', 'a', 'b'], getline(1, '$')) 114 115 " linewise select mode: delete last two lines 116 call deletebufline('', 1, '$') 117 call append('$', ['a', 'b', 'c']) 118 exe "normal GkgH\<Down>\<Del>" 119 call assert_equal(['', 'a'], getline(1, '$')) 120 121 bwipe! 122endfunc 123 124" Test for blockwise select mode (g CTRL-H) 125func Test_blockwise_select_mode() 126 new 127 call setline(1, ['foo', 'bar']) 128 call feedkeys("g\<BS>\<Right>\<Down>mm", 'xt') 129 call assert_equal(['mmo', 'mmr'], getline(1, '$')) 130 close! 131endfunc 132 133" Test for using visual mode maps in select mode 134func Test_select_mode_map() 135 new 136 vmap <buffer> <F2> 3l 137 call setline(1, 'Test line') 138 call feedkeys("gh\<F2>map", 'xt') 139 call assert_equal('map line', getline(1)) 140 141 vmap <buffer> <F2> ygV 142 call feedkeys("0gh\<Right>\<Right>\<F2>cwabc", 'xt') 143 call assert_equal('abc line', getline(1)) 144 145 vmap <buffer> <F2> :<C-U>let v=100<CR> 146 call feedkeys("gggh\<Right>\<Right>\<F2>foo", 'xt') 147 call assert_equal('foo line', getline(1)) 148 149 " reselect the select mode using gv from a visual mode map 150 vmap <buffer> <F2> gv 151 set selectmode=cmd 152 call feedkeys("0gh\<F2>map", 'xt') 153 call assert_equal('map line', getline(1)) 154 set selectmode& 155 156 close! 157endfunc 158 159" Test double/triple/quadruple click to start 'select' mode 160func Test_term_mouse_multiple_clicks_to_select_mode() 161 let save_mouse = &mouse 162 let save_term = &term 163 let save_ttymouse = &ttymouse 164 call test_override('no_query_mouse', 1) 165 set mouse=a term=xterm mousetime=200 166 set selectmode=mouse 167 new 168 169 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 170 let msg = 'ttymouse=' .. ttymouse_val 171 exe 'set ttymouse=' .. ttymouse_val 172 173 " Single-click and drag should 'select' the characters 174 call setline(1, ['foo [foo bar] foo', 'foo']) 175 call MouseLeftClick(1, 3) 176 call assert_equal(0, getcharmod(), msg) 177 call MouseLeftDrag(1, 13) 178 call MouseLeftRelease(1, 13) 179 norm! o 180 call assert_equal(['foo foo', 'foo'], getline(1, '$'), msg) 181 182 " Double-click on word should visually 'select' the word. 183 call setline(1, ['foo [foo bar] foo', 'foo']) 184 call MouseLeftClick(1, 2) 185 call assert_equal(0, getcharmod(), msg) 186 call MouseLeftRelease(1, 2) 187 call MouseLeftClick(1, 2) 188 call assert_equal(32, getcharmod(), msg) " double-click 189 call MouseLeftRelease(1, 2) 190 call assert_equal('s', mode(), msg) 191 norm! bar 192 call assert_equal(['bar [foo bar] foo', 'foo'], getline(1, '$'), msg) 193 194 " Double-click on opening square bracket should visually 195 " 'select' the whole [foo bar]. 196 call setline(1, ['foo [foo bar] foo', 'foo']) 197 call MouseLeftClick(1, 5) 198 call assert_equal(0, getcharmod(), msg) 199 call MouseLeftRelease(1, 5) 200 call MouseLeftClick(1, 5) 201 call assert_equal(32, getcharmod(), msg) " double-click 202 call MouseLeftRelease(1, 5) 203 call assert_equal('s', mode(), msg) 204 norm! bar 205 call assert_equal(['foo bar foo', 'foo'], getline(1, '$'), msg) 206 207 " To guarantee that the next click is not counted as a triple click 208 call MouseRightClick(1, 1) 209 call MouseRightRelease(1, 1) 210 211 " Triple-click should visually 'select' the whole line. 212 call setline(1, ['foo [foo bar] foo', 'foo']) 213 call MouseLeftClick(1, 3) 214 call assert_equal(0, getcharmod(), msg) 215 call MouseLeftRelease(1, 3) 216 call MouseLeftClick(1, 3) 217 call assert_equal(32, getcharmod(), msg) " double-click 218 call MouseLeftRelease(1, 3) 219 call MouseLeftClick(1, 3) 220 call assert_equal(64, getcharmod(), msg) " triple-click 221 call MouseLeftRelease(1, 3) 222 call assert_equal('S', mode(), msg) 223 norm! baz 224 call assert_equal(['bazfoo'], getline(1, '$'), msg) 225 226 " Quadruple-click should start visual block 'select'. 227 call setline(1, ['aaaaaa', 'bbbbbb']) 228 call MouseLeftClick(1, 2) 229 call assert_equal(0, getcharmod(), msg) 230 call MouseLeftRelease(1, 2) 231 call MouseLeftClick(1, 2) 232 call assert_equal(32, getcharmod(), msg) " double-click 233 call MouseLeftRelease(1, 2) 234 call MouseLeftClick(1, 2) 235 call assert_equal(64, getcharmod(), msg) " triple-click 236 call MouseLeftRelease(1, 2) 237 call MouseLeftClick(1, 2) 238 call assert_equal(96, getcharmod(), msg) " quadruple-click 239 call MouseLeftDrag(2, 4) 240 call MouseLeftRelease(2, 4) 241 call assert_equal("\<c-s>", mode(), msg) 242 norm! x 243 call assert_equal(['axaa', 'bxbb'], getline(1, '$'), msg) 244 endfor 245 246 let &mouse = save_mouse 247 let &term = save_term 248 let &ttymouse = save_ttymouse 249 set mousetime& 250 set selectmode& 251 call test_override('no_query_mouse', 0) 252 bwipe! 253endfunc 254 255" vim: shiftwidth=2 sts=2 expandtab 256