test_selectmode.vim (10133B)
1 " Test for Select-mode 2 3 source check.vim 4 " CheckNotGui 5 " CheckUnix 6 7 source shared.vim 8 source mouse.vim 9 10 " Test for select mode 11 func 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 feedkeys("i\<c-o>gHc\<esc>", 'tx') 25 call assert_equal('c51', getline('.')) 26 " clean up 27 bw! 28 endfunc 29 30 " Test for starting selectmode 31 func Test_selectmode_start() 32 new 33 set selectmode=key keymodel=startsel 34 call setline(1, ['abc', 'def', 'ghi']) 35 call cursor(1, 4) 36 call feedkeys("A\<s-home>start\<esc>", 'txin') 37 call assert_equal(['startdef', 'ghi'], getline(1, '$')) 38 " start select mode again with gv 39 set selectmode=cmd 40 call feedkeys('gvabc', 'xt') 41 call assert_equal('abctdef', getline(1)) 42 " arrow keys without shift should not start selection 43 call feedkeys("A\<Home>\<Right>\<Left>ro", 'xt') 44 call assert_equal('roabctdef', getline(1)) 45 set selectmode= keymodel= 46 bw! 47 endfunc 48 49 " Test for characterwise select mode 50 func Test_characterwise_select_mode() 51 new 52 53 " Select mode maps 54 snoremap <lt>End> <End> 55 snoremap <lt>Down> <Down> 56 snoremap <lt>Del> <Del> 57 58 " characterwise select mode: delete middle line 59 call deletebufline('', 1, '$') 60 call append('$', ['a', 'b', 'c']) 61 exe "normal Gkkgh\<End>\<Del>" 62 call assert_equal(['', 'b', 'c'], getline(1, '$')) 63 64 " characterwise select mode: delete middle two lines 65 call deletebufline('', 1, '$') 66 call append('$', ['a', 'b', 'c']) 67 exe "normal Gkkgh\<Down>\<End>\<Del>" 68 call assert_equal(['', 'c'], getline(1, '$')) 69 70 " characterwise select mode: delete last line 71 call deletebufline('', 1, '$') 72 call append('$', ['a', 'b', 'c']) 73 exe "normal Ggh\<End>\<Del>" 74 call assert_equal(['', 'a', 'b', ''], getline(1, '$')) 75 76 " characterwise select mode: delete last two lines 77 call deletebufline('', 1, '$') 78 call append('$', ['a', 'b', 'c']) 79 exe "normal Gkgh\<Down>\<End>\<Del>" 80 call assert_equal(['', 'a', ''], getline(1, '$')) 81 82 " CTRL-H in select mode behaves like 'x' 83 call setline(1, 'abcdef') 84 exe "normal! gggh\<Right>\<Right>\<Right>\<C-H>" 85 call assert_equal('ef', getline(1)) 86 87 " CTRL-O in select mode switches to visual mode for one command 88 call setline(1, 'abcdef') 89 exe "normal! gggh\<C-O>3lm" 90 call assert_equal('mef', getline(1)) 91 92 sunmap <lt>End> 93 sunmap <lt>Down> 94 sunmap <lt>Del> 95 bwipe! 96 endfunc 97 98 " Test for linewise select mode 99 func Test_linewise_select_mode() 100 new 101 102 " linewise select mode: delete middle line 103 call append('$', ['a', 'b', 'c']) 104 exe "normal GkkgH\<Del>" 105 call assert_equal(['', 'b', 'c'], getline(1, '$')) 106 107 " linewise select mode: delete middle two lines 108 call deletebufline('', 1, '$') 109 call append('$', ['a', 'b', 'c']) 110 exe "normal GkkgH\<Down>\<Del>" 111 call assert_equal(['', 'c'], getline(1, '$')) 112 113 " linewise select mode: delete last line 114 call deletebufline('', 1, '$') 115 call append('$', ['a', 'b', 'c']) 116 exe "normal GgH\<Del>" 117 call assert_equal(['', 'a', 'b'], getline(1, '$')) 118 119 " linewise select mode: delete last two lines 120 call deletebufline('', 1, '$') 121 call append('$', ['a', 'b', 'c']) 122 exe "normal GkgH\<Down>\<Del>" 123 call assert_equal(['', 'a'], getline(1, '$')) 124 125 bwipe! 126 endfunc 127 128 " Test for blockwise select mode (g CTRL-H) 129 func Test_blockwise_select_mode() 130 new 131 call setline(1, ['foo', 'bar']) 132 call feedkeys("g\<BS>\<Right>\<Down>mm", 'xt') 133 call assert_equal(['mmo', 'mmr'], getline(1, '$')) 134 close! 135 endfunc 136 137 " Test for using visual mode maps in select mode 138 func Test_select_mode_map() 139 new 140 vmap <buffer> <F2> 3l 141 call setline(1, 'Test line') 142 call feedkeys("gh\<F2>map", 'xt') 143 call assert_equal('map line', getline(1)) 144 145 vmap <buffer> <F2> ygV 146 call feedkeys("0gh\<Right>\<Right>\<F2>cwabc", 'xt') 147 call assert_equal('abc line', getline(1)) 148 149 vmap <buffer> <F2> :<C-U>let v=100<CR> 150 call feedkeys("gggh\<Right>\<Right>\<F2>foo", 'xt') 151 call assert_equal('foo line', getline(1)) 152 153 " reselect the select mode using gv from a visual mode map 154 vmap <buffer> <F2> gv 155 set selectmode=cmd 156 call feedkeys("0gh\<F2>map", 'xt') 157 call assert_equal('map line', getline(1)) 158 set selectmode& 159 160 close! 161 endfunc 162 163 " Test double/triple/quadruple click to start 'select' mode 164 func Test_term_mouse_multiple_clicks_to_select_mode() 165 let save_mouse = &mouse 166 let save_term = &term 167 " let save_ttymouse = &ttymouse 168 " call test_override('no_query_mouse', 1) 169 170 " 'mousetime' must be sufficiently large, or else the test is flaky when 171 " using a ssh connection with X forwarding; i.e. ssh -X. 172 " set mouse=a term=xterm mousetime=1000 173 set mouse=a mousetime=1000 174 set selectmode=mouse 175 new 176 177 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec 178 let msg = 'ttymouse=' .. ttymouse_val 179 " exe 'set ttymouse=' .. ttymouse_val 180 181 " Single-click and drag should 'select' the characters 182 call setline(1, ['foo [foo bar] foo', 'foo']) 183 call MouseLeftClick(1, 3) 184 call assert_equal(0, getcharmod(), msg) 185 call MouseLeftDrag(1, 13) 186 call MouseLeftRelease(1, 13) 187 norm! o 188 call assert_equal(['foo foo', 'foo'], getline(1, '$'), msg) 189 190 " Double-click on word should visually 'select' the word. 191 call setline(1, ['foo [foo bar] foo', 'foo']) 192 call MouseLeftClick(1, 2) 193 call assert_equal(0, getcharmod(), msg) 194 call MouseLeftRelease(1, 2) 195 call MouseLeftClick(1, 2) 196 call assert_equal(32, getcharmod(), msg) " double-click 197 call MouseLeftRelease(1, 2) 198 call assert_equal('s', mode(), msg) 199 norm! bar 200 call assert_equal(['bar [foo bar] foo', 'foo'], getline(1, '$'), msg) 201 202 " Double-click on opening square bracket should visually 203 " 'select' the whole [foo bar]. 204 call setline(1, ['foo [foo bar] foo', 'foo']) 205 call MouseLeftClick(1, 5) 206 call assert_equal(0, getcharmod(), msg) 207 call MouseLeftRelease(1, 5) 208 call MouseLeftClick(1, 5) 209 call assert_equal(32, getcharmod(), msg) " double-click 210 call MouseLeftRelease(1, 5) 211 call assert_equal('s', mode(), msg) 212 norm! bar 213 call assert_equal(['foo bar foo', 'foo'], getline(1, '$'), msg) 214 215 " To guarantee that the next click is not counted as a triple click 216 call MouseRightClick(1, 1) 217 call MouseRightRelease(1, 1) 218 219 " Triple-click should visually 'select' the whole line. 220 call setline(1, ['foo [foo bar] foo', 'foo']) 221 call MouseLeftClick(1, 3) 222 call assert_equal(0, getcharmod(), msg) 223 call MouseLeftRelease(1, 3) 224 call MouseLeftClick(1, 3) 225 call assert_equal(32, getcharmod(), msg) " double-click 226 call MouseLeftRelease(1, 3) 227 call MouseLeftClick(1, 3) 228 call assert_equal(64, getcharmod(), msg) " triple-click 229 call MouseLeftRelease(1, 3) 230 call assert_equal('S', mode(), msg) 231 norm! baz 232 call assert_equal(['bazfoo'], getline(1, '$'), msg) 233 234 " Quadruple-click should start visual block 'select'. 235 call setline(1, ['aaaaaa', 'bbbbbb']) 236 call MouseLeftClick(1, 2) 237 call assert_equal(0, getcharmod(), msg) 238 call MouseLeftRelease(1, 2) 239 call MouseLeftClick(1, 2) 240 call assert_equal(32, getcharmod(), msg) " double-click 241 call MouseLeftRelease(1, 2) 242 call MouseLeftClick(1, 2) 243 call assert_equal(64, getcharmod(), msg) " triple-click 244 call MouseLeftRelease(1, 2) 245 call MouseLeftClick(1, 2) 246 call assert_equal(96, getcharmod(), msg) " quadruple-click 247 call MouseLeftDrag(2, 4) 248 call MouseLeftRelease(2, 4) 249 call assert_equal("\<c-s>", mode(), msg) 250 norm! x 251 call assert_equal(['axaa', 'bxbb'], getline(1, '$'), msg) 252 endfor 253 254 let &mouse = save_mouse 255 " let &term = save_term 256 " let &ttymouse = save_ttymouse 257 set mousetime& 258 set selectmode& 259 " call test_override('no_query_mouse', 0) 260 bwipe! 261 endfunc 262 263 " Test for selecting a register with CTRL-R 264 func Test_selectmode_register() 265 new 266 267 " Default behavior: use unnamed register 268 call setline(1, 'foo') 269 call setreg('"', 'bar') 270 call setreg('a', 'baz') 271 exe ":norm! v\<c-g>a" 272 call assert_equal(getline('.'), 'aoo') 273 call assert_equal('f', getreg('"')) 274 call assert_equal('baz', getreg('a')) 275 276 " Use the black hole register 277 call setline(1, 'foo') 278 call setreg('"', 'bar') 279 call setreg('a', 'baz') 280 exe ":norm! v\<c-g>\<c-r>_a" 281 call assert_equal(getline('.'), 'aoo') 282 call assert_equal('bar', getreg('"')) 283 call assert_equal('baz', getreg('a')) 284 285 " Invalid register: use unnamed register 286 call setline(1, 'foo') 287 call setreg('"', 'bar') 288 call setreg('a', 'baz') 289 exe ":norm! v\<c-g>\<c-r>?a" 290 call assert_equal(getline('.'), 'aoo') 291 call assert_equal('f', getreg('"')) 292 call assert_equal('baz', getreg('a')) 293 294 " Use unnamed register 295 call setline(1, 'foo') 296 call setreg('"', 'bar') 297 call setreg('a', 'baz') 298 exe ":norm! v\<c-g>\<c-r>\"a" 299 call assert_equal(getline('.'), 'aoo') 300 call assert_equal('f', getreg('"')) 301 call assert_equal('baz', getreg('a')) 302 303 " use specicifed register, unnamed register is also written 304 call setline(1, 'foo') 305 call setreg('"', 'bar') 306 call setreg('a', 'baz') 307 exe ":norm! v\<c-g>\<c-r>aa" 308 call assert_equal(getline('.'), 'aoo') 309 call assert_equal('f', getreg('"')) 310 call assert_equal('f', getreg('a')) 311 312 bw! 313 endfunc 314 315 func Test_ins_ctrl_o_in_insert_mode_resets_selectmode() 316 new 317 " ctrl-o in insert mode resets restart_VIsual_select 318 call setline(1, 'abcdef') 319 call cursor(1, 1) 320 exe "norm! \<c-v>\<c-g>\<c-o>c\<c-o>\<c-v>\<right>\<right>IABC" 321 call assert_equal('ABCbcdef', getline(1)) 322 323 bwipe! 324 endfunc 325 326 " Test that an :lmap mapping for a printable keypad key is applied when typing 327 " it in Select mode. 328 func Test_selectmode_keypad_lmap() 329 new 330 lnoremap <buffer> <kPoint> ??? 331 lnoremap <buffer> <kEnter> !!! 332 setlocal iminsert=1 333 call setline(1, 'abcdef') 334 call feedkeys("gH\<kPoint>\<Esc>", 'tx') 335 call assert_equal(['???'], getline(1, '$')) 336 call feedkeys("gH\<kEnter>\<Esc>", 'tx') 337 call assert_equal(['!!!'], getline(1, '$')) 338 339 bwipe! 340 endfunc 341 342 " vim: shiftwidth=2 sts=2 expandtab