Bram Moolenaar | 515545e | 2020-03-22 14:08:59 +0100 | [diff] [blame] | 1 | " Test for Select-mode |
| 2 | |
| 3 | " This only works for Unix in a terminal |
| 4 | source check.vim |
| 5 | CheckNotGui |
| 6 | CheckUnix |
| 7 | |
| 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 assert_equal('c51', getline('.')) |
| 25 | " clean up |
| 26 | bw! |
| 27 | endfunc |
| 28 | |
| 29 | " Test for starting selectmode |
| 30 | func 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)) |
Bram Moolenaar | 845e0ee | 2020-06-20 16:05:32 +0200 | [diff] [blame] | 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)) |
Bram Moolenaar | 515545e | 2020-03-22 14:08:59 +0100 | [diff] [blame] | 44 | set selectmode= keymodel= |
| 45 | bw! |
| 46 | endfunc |
| 47 | |
| 48 | " Test for characterwise select mode |
| 49 | func 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! |
| 95 | endfunc |
| 96 | |
| 97 | " Test for linewise select mode |
| 98 | func 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! |
| 125 | endfunc |
| 126 | |
| 127 | " Test for blockwise select mode (g CTRL-H) |
| 128 | func 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! |
| 134 | endfunc |
| 135 | |
| 136 | " Test for using visual mode maps in select mode |
| 137 | func 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! |
| 160 | endfunc |
| 161 | |
| 162 | " Test double/triple/quadruple click to start 'select' mode |
| 163 | func 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) |
Bram Moolenaar | 1e44846 | 2021-03-16 21:17:16 +0100 | [diff] [blame] | 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 |
Bram Moolenaar | 515545e | 2020-03-22 14:08:59 +0100 | [diff] [blame] | 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! |
| 259 | endfunc |
| 260 | |
Shougo Matsushita | 4ede01f | 2022-01-20 15:26:03 +0000 | [diff] [blame] | 261 | " Test for selecting a register with CTRL-R |
| 262 | func Test_selectmode_register() |
| 263 | new |
| 264 | |
| 265 | " Default behavior: use unnamed register |
| 266 | call setline(1, 'foo') |
| 267 | call setreg('"', 'bar') |
| 268 | call setreg('a', 'baz') |
| 269 | exe ":norm! v\<c-g>a" |
| 270 | call assert_equal(getline('.'), 'aoo') |
| 271 | call assert_equal('f', getreg('"')) |
| 272 | call assert_equal('baz', getreg('a')) |
| 273 | |
| 274 | " Use the black hole register |
| 275 | call setline(1, 'foo') |
| 276 | call setreg('"', 'bar') |
| 277 | call setreg('a', 'baz') |
| 278 | exe ":norm! v\<c-g>\<c-r>_a" |
| 279 | call assert_equal(getline('.'), 'aoo') |
| 280 | call assert_equal('bar', getreg('"')) |
| 281 | call assert_equal('baz', getreg('a')) |
| 282 | |
| 283 | " Invalid register: use unnamed register |
| 284 | call setline(1, 'foo') |
| 285 | call setreg('"', 'bar') |
| 286 | call setreg('a', 'baz') |
| 287 | exe ":norm! v\<c-g>\<c-r>?a" |
| 288 | call assert_equal(getline('.'), 'aoo') |
| 289 | call assert_equal('f', getreg('"')) |
| 290 | call assert_equal('baz', getreg('a')) |
| 291 | |
| 292 | " Use unnamed register |
| 293 | call setline(1, 'foo') |
| 294 | call setreg('"', 'bar') |
| 295 | call setreg('a', 'baz') |
| 296 | exe ":norm! v\<c-g>\<c-r>\"a" |
| 297 | call assert_equal(getline('.'), 'aoo') |
| 298 | call assert_equal('f', getreg('"')) |
| 299 | call assert_equal('baz', getreg('a')) |
| 300 | |
| 301 | " use specicifed register, unnamed register is also written |
| 302 | call setline(1, 'foo') |
| 303 | call setreg('"', 'bar') |
| 304 | call setreg('a', 'baz') |
| 305 | exe ":norm! v\<c-g>\<c-r>aa" |
| 306 | call assert_equal(getline('.'), 'aoo') |
| 307 | call assert_equal('f', getreg('"')) |
| 308 | call assert_equal('f', getreg('a')) |
| 309 | |
| 310 | bw! |
| 311 | endfunc |
| 312 | |
Bram Moolenaar | 515545e | 2020-03-22 14:08:59 +0100 | [diff] [blame] | 313 | " vim: shiftwidth=2 sts=2 expandtab |