blob: 7d7e2f098738b09d8e0a16d3f0b5c865b9e91f27 [file] [log] [blame]
Bram Moolenaar905dd902019-04-07 14:21:47 +02001" Tests for decoding escape sequences sent by the terminal.
2
3" This only works for Unix in a terminal
Bram Moolenaar8c5a2782019-08-07 23:07:07 +02004source check.vim
5CheckNotGui
6CheckUnix
Bram Moolenaar905dd902019-04-07 14:21:47 +02007
Bram Moolenaar564344a2019-04-28 13:00:12 +02008source shared.vim
Bram Moolenaar515545e2020-03-22 14:08:59 +01009source mouse.vim
Bram Moolenaarecd34bf2020-08-04 20:17:31 +020010source view_util.vim
Bram Moolenaare46a2ed2020-08-04 21:04:57 +020011source term_util.vim
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020012
Bram Moolenaar92fd5992019-05-02 23:00:22 +020013func Test_term_mouse_left_click()
Bram Moolenaar905dd902019-04-07 14:21:47 +020014 new
15 let save_mouse = &mouse
16 let save_term = &term
17 let save_ttymouse = &ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +020018 call test_override('no_query_mouse', 1)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020019 set mouse=a term=xterm
Bram Moolenaar905dd902019-04-07 14:21:47 +020020 call setline(1, ['line 1', 'line 2', 'line 3 is a bit longer'])
Bram Moolenaar905dd902019-04-07 14:21:47 +020021
Bram Moolenaar515545e2020-03-22 14:08:59 +010022 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
Bram Moolenaar49452192019-04-17 16:27:02 +020023 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +020024 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020025 go
Bram Moolenaar49452192019-04-17 16:27:02 +020026 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020027 let row = 2
28 let col = 6
29 call MouseLeftClick(row, col)
30 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +020031 call assert_equal([0, 2, 6, 0], getpos('.'), msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +020032 endfor
Bram Moolenaar905dd902019-04-07 14:21:47 +020033
34 let &mouse = save_mouse
35 let &term = save_term
36 let &ttymouse = save_ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +020037 call test_override('no_query_mouse', 0)
Bram Moolenaar905dd902019-04-07 14:21:47 +020038 bwipe!
39endfunc
40
Bram Moolenaar6aa75232019-10-13 21:01:34 +020041func Test_xterm_mouse_right_click_extends_visual()
42 if has('mac')
43 throw "Skipped: test right click in visual mode does not work on macOs (why?)"
44 endif
45 let save_mouse = &mouse
46 let save_term = &term
47 let save_ttymouse = &ttymouse
48 call test_override('no_query_mouse', 1)
49 set mouse=a term=xterm
50
51 for visual_mode in ["v", "V", "\<C-V>"]
Bram Moolenaar515545e2020-03-22 14:08:59 +010052 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaar6aa75232019-10-13 21:01:34 +020053 let msg = 'visual=' .. visual_mode .. ' ttymouse=' .. ttymouse_val
54 exe 'set ttymouse=' .. ttymouse_val
55
56 call setline(1, repeat([repeat('-', 7)], 7))
57 call MouseLeftClick(4, 4)
58 call MouseLeftRelease(4, 4)
59 exe "norm! " .. visual_mode
60
61 " Right click extends top left of visual area.
62 call MouseRightClick(2, 2)
63 call MouseRightRelease(2, 2)
64
Bram Moolenaarf19f8d12019-12-18 19:36:23 +010065 " Right click extends bottom right of visual area.
Bram Moolenaar6aa75232019-10-13 21:01:34 +020066 call MouseRightClick(6, 6)
67 call MouseRightRelease(6, 6)
68 norm! r1gv
69
70 " Right click shrinks top left of visual area.
71 call MouseRightClick(3, 3)
72 call MouseRightRelease(3, 3)
73
74 " Right click shrinks bottom right of visual area.
75 call MouseRightClick(5, 5)
76 call MouseRightRelease(5, 5)
77 norm! r2
78
79 if visual_mode ==# 'v'
80 call assert_equal(['-------',
81 \ '-111111',
82 \ '1122222',
83 \ '2222222',
84 \ '2222211',
85 \ '111111-',
86 \ '-------'], getline(1, '$'), msg)
87 elseif visual_mode ==# 'V'
88 call assert_equal(['-------',
89 \ '1111111',
90 \ '2222222',
91 \ '2222222',
92 \ '2222222',
93 \ '1111111',
94 \ '-------'], getline(1, '$'), msg)
95 else
96 call assert_equal(['-------',
97 \ '-11111-',
98 \ '-12221-',
99 \ '-12221-',
100 \ '-12221-',
101 \ '-11111-',
102 \ '-------'], getline(1, '$'), msg)
103 endif
104 endfor
105 endfor
106
107 let &mouse = save_mouse
108 let &term = save_term
109 let &ttymouse = save_ttymouse
110 call test_override('no_query_mouse', 0)
111 bwipe!
112endfunc
113
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200114" Test that <C-LeftMouse> jumps to help tag and <C-RightMouse> jumps back.
Bram Moolenaar297bec02020-07-14 22:11:04 +0200115" Also test for g<LeftMouse> and g<RightMouse>.
116func Test_xterm_mouse_tagjump()
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200117 let save_mouse = &mouse
118 let save_term = &term
119 let save_ttymouse = &ttymouse
120 set mouse=a term=xterm
121
Bram Moolenaar515545e2020-03-22 14:08:59 +0100122 for ttymouse_val in g:Ttymouse_values
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200123 let msg = 'ttymouse=' .. ttymouse_val
124 exe 'set ttymouse=' .. ttymouse_val
125 help
126 /usr_02.txt
127 norm! zt
Bram Moolenaar297bec02020-07-14 22:11:04 +0200128
129 " CTRL-left click to jump to a tag
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200130 let row = 1
131 let col = 1
132 call MouseCtrlLeftClick(row, col)
133 call MouseLeftRelease(row, col)
134 call assert_match('usr_02.txt$', bufname('%'), msg)
Bram Moolenaarb4367b72019-10-01 14:19:07 +0200135 call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200136
Bram Moolenaar297bec02020-07-14 22:11:04 +0200137 " CTRL-right click to pop a tag
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200138 call MouseCtrlRightClick(row, col)
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200139 call MouseRightRelease(row, col)
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200140 call assert_match('help.txt$', bufname('%'), msg)
Bram Moolenaarb4367b72019-10-01 14:19:07 +0200141 call assert_equal('|usr_02.txt|', expand('<cWORD>'), msg)
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200142
Bram Moolenaar297bec02020-07-14 22:11:04 +0200143 " Jump to a tag
144 exe "normal \<C-]>"
145 call assert_match('usr_02.txt$', bufname('%'), msg)
146 call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
147
148 " Use CTRL-right click in insert mode to pop the tag
149 new
150 let str = 'iHello' .. MouseCtrlRightClickCode(row, col)
151 \ .. MouseRightReleaseCode(row, col) .. "\<C-C>"
Bram Moolenaar2764d062020-07-18 12:59:19 +0200152 call assert_fails('call feedkeys(str, "Lx!")', 'E37:', msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +0200153 close!
154
155 " CTRL-right click with a count
156 let str = "4" .. MouseCtrlRightClickCode(row, col)
157 \ .. MouseRightReleaseCode(row, col)
Bram Moolenaar2764d062020-07-18 12:59:19 +0200158 call assert_fails('call feedkeys(str, "Lx!")', 'E555:', msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +0200159 call assert_match('help.txt$', bufname('%'), msg)
160 call assert_equal(1, line('.'), msg)
161
162 " g<LeftMouse> to jump to a tag
163 /usr_02.txt
164 norm! zt
165 call test_setmouse(row, col)
166 exe "normal g\<LeftMouse>"
167 call assert_match('usr_02.txt$', bufname('%'), msg)
168 call assert_equal('*usr_02.txt*', expand('<cWORD>'), msg)
169
170 " g<RightMouse> to pop to a tag
171 call test_setmouse(row, col)
172 exe "normal g\<RightMouse>"
173 call assert_match('help.txt$', bufname('%'), msg)
174 call assert_equal('|usr_02.txt|', expand('<cWORD>'), msg)
175
176 %bw!
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200177 endfor
178
179 let &mouse = save_mouse
180 let &term = save_term
181 let &ttymouse = save_ttymouse
182endfunc
183
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200184func Test_term_mouse_middle_click()
Bram Moolenaar52992fe2019-08-12 14:20:33 +0200185 CheckFeature clipboard_working
Bram Moolenaar564344a2019-04-28 13:00:12 +0200186
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200187 new
188 let save_mouse = &mouse
189 let save_term = &term
190 let save_ttymouse = &ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200191 call test_override('no_query_mouse', 1)
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200192 let save_quotestar = @*
Bram Moolenaar297bec02020-07-14 22:11:04 +0200193 let save_quoteplus = @+
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200194 set mouse=a term=xterm
195
Bram Moolenaar515545e2020-03-22 14:08:59 +0100196 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200197 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200198 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200199 call setline(1, ['123456789', '123456789'])
Bram Moolenaar297bec02020-07-14 22:11:04 +0200200 let @* = 'abc'
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200201
202 " Middle-click in the middle of the line pastes text where clicked.
203 let row = 1
204 let col = 6
205 call MouseMiddleClick(row, col)
206 call MouseMiddleRelease(row, col)
207 call assert_equal(['12345abc6789', '123456789'], getline(1, '$'), msg)
208
209 " Middle-click beyond end of the line pastes text at the end of the line.
210 let col = 20
211 call MouseMiddleClick(row, col)
212 call MouseMiddleRelease(row, col)
213 call assert_equal(['12345abc6789abc', '123456789'], getline(1, '$'), msg)
214
215 " Middle-click beyond the last line pastes in the last line.
216 let row = 5
217 let col = 3
218 call MouseMiddleClick(row, col)
219 call MouseMiddleRelease(row, col)
220 call assert_equal(['12345abc6789abc', '12abc3456789'], getline(1, '$'), msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +0200221
222 " Middle mouse click in operator pending mode beeps
223 call assert_beeps('exe "normal c\<MiddleMouse>"')
224
225 " Clicking middle mouse in visual mode, yanks the selection and pastes the
226 " clipboard contents
227 let save_clipboard = &clipboard
228 set clipboard=
229 let @" = ''
230 call cursor(1, 1)
231 call feedkeys("v3l" ..
232 \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7), 'Lx!')
233 call assert_equal(['12345abc6789abc', '12abc3abc456789'],
234 \ getline(1, '$'), msg)
Bram Moolenaar2764d062020-07-18 12:59:19 +0200235 call assert_equal('1234', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +0200236 let &clipboard = save_clipboard
237
238 " Clicking middle mouse in select mode, replaces the selected text with
239 " the clipboard contents
240 let @+ = 'xyz'
241 call cursor(1, 3)
242 exe "normal gh\<Right>\<Right>\<MiddleMouse>"
243 call assert_equal(['12xyzabc6789abc', '12abc3abc456789'],
244 \ getline(1, '$'), msg)
Bram Moolenaar2764d062020-07-18 12:59:19 +0200245
246 " Prefixing middle click with [ or ] fixes the indent after pasting.
247 %d
248 call setline(1, " one two")
249 call setreg('r', 'red blue', 'l')
250 call test_setmouse(1, 5)
251 exe "normal \"r[\<MiddleMouse>"
252 call assert_equal(' red blue', getline(1), msg)
253 call test_setmouse(2, 5)
254 exe "normal \"r]\<MiddleMouse>"
255 call assert_equal(' red blue', getline(3), msg)
256 %d
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200257 endfor
258
259 let &mouse = save_mouse
260 let &term = save_term
261 let &ttymouse = save_ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200262 call test_override('no_query_mouse', 0)
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200263 let @* = save_quotestar
Bram Moolenaar297bec02020-07-14 22:11:04 +0200264 let @+ = save_quotestar
Bram Moolenaarc1b81602019-04-27 19:11:35 +0200265 bwipe!
266endfunc
267
Bram Moolenaar297bec02020-07-14 22:11:04 +0200268" If clipboard is not working, then clicking the middle mouse button in visual
269" mode, will copy and paste the selected text.
270func Test_term_mouse_middle_click_no_clipboard()
271 if has('clipboard_working')
272 throw 'Skipped: clipboard support works'
Bram Moolenaar297bec02020-07-14 22:11:04 +0200273 endif
274 new
275 let save_mouse = &mouse
276 let save_term = &term
277 let save_ttymouse = &ttymouse
278 call test_override('no_query_mouse', 1)
279 set mouse=a term=xterm
280
281 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
282 let msg = 'ttymouse=' .. ttymouse_val
283 exe 'set ttymouse=' .. ttymouse_val
284 call setline(1, ['123456789', '123456789'])
285
286 " Clicking middle mouse in visual mode, yanks the selection and pastes it
287 call cursor(1, 1)
288 call feedkeys("v3l" ..
289 \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7), 'Lx!')
290 call assert_equal(['123456789', '1234561234789'],
291 \ getline(1, '$'), msg)
292 endfor
293
294 call test_override('no_query_mouse', 0)
295 let &ttymouse = save_ttymouse
296 let &term = save_term
297 let &mouse = save_mouse
298 close!
299endfunc
300
301func Test_term_mouse_middle_click_insert_mode()
302 CheckFeature clipboard_working
303
304 new
305 let save_mouse = &mouse
306 let save_term = &term
307 let save_ttymouse = &ttymouse
308 call test_override('no_query_mouse', 1)
309 set mouse=a term=xterm
310
311 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
312 let msg = 'ttymouse=' .. ttymouse_val
313 exe 'set ttymouse=' .. ttymouse_val
314 call setline(1, ['123456789', '123456789'])
315 let @* = 'abc'
316
317 " Middle-click in inesrt mode doesn't move the cursor but inserts the
318 " contents of aregister
319 call cursor(1, 4)
320 call feedkeys('i' ..
321 \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7) ..
322 \ "\<C-C>", 'Lx!')
323 call assert_equal(['123abc456789', '123456789'],
324 \ getline(1, '$'), msg)
Bram Moolenaar2764d062020-07-18 12:59:19 +0200325 call assert_equal([1, 6], [line('.'), col('.')], msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +0200326
327 " Middle-click in replace mode
328 call cursor(1, 1)
329 call feedkeys('$R' ..
330 \ MouseMiddleClickCode(2, 7) .. MouseMiddleReleaseCode(2, 7) ..
331 \ "\<C-C>", 'Lx!')
332 call assert_equal(['123abc45678abc', '123456789'],
333 \ getline(1, '$'), msg)
Bram Moolenaar2764d062020-07-18 12:59:19 +0200334 call assert_equal([1, 14], [line('.'), col('.')], msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +0200335 endfor
336
337 let &mouse = save_mouse
338 let &term = save_term
339 let &ttymouse = save_ttymouse
340 call test_override('no_query_mouse', 0)
341 close!
342endfunc
343
344" Test for switching window using mouse in insert mode
345func Test_term_mouse_switch_win_insert_mode()
346 5new
347 let save_mouse = &mouse
348 let save_term = &term
349 let save_ttymouse = &ttymouse
350 call test_override('no_query_mouse', 1)
351 set mouse=a term=xterm ttymouse=xterm2
352
353 call feedkeys('ivim' ..
354 \ MouseLeftClickCode(8, 6) .. MouseLeftReleaseCode(8, 6) ..
355 \ "\<C-C>", 'Lx!')
356 call assert_equal(2, winnr())
357 wincmd w
358 call assert_equal('n', mode())
359 call assert_equal(['vim'], getline(1, '$'))
360
361 let &mouse = save_mouse
362 let &term = save_term
363 let &ttymouse = save_ttymouse
364 call test_override('no_query_mouse', 0)
365 close!
366endfunc
367
368" Test for using the mouse to increaes the height of the cmdline window
369func Test_mouse_cmdwin_resize()
370 let save_mouse = &mouse
371 let save_term = &term
372 let save_ttymouse = &ttymouse
373 call test_override('no_query_mouse', 1)
374 set mouse=a term=xterm ttymouse=xterm2
375 5new
376 redraw!
377
378 let h = 0
379 let row = &lines - &cmdwinheight - 2
380 call feedkeys("q:" ..
381 \ MouseLeftClickCode(row, 1) ..
382 \ MouseLeftDragCode(row - 1, 1) ..
383 \ MouseLeftReleaseCode(row - 2, 1) ..
384 \ "alet h = \<C-R>=winheight(0)\<CR>\<CR>", 'Lx!')
385 call assert_equal(&cmdwinheight + 2, h)
386
387 let &mouse = save_mouse
388 let &term = save_term
389 let &ttymouse = save_ttymouse
390 call test_override('no_query_mouse', 0)
391 close!
392endfunc
393
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200394" TODO: for unclear reasons this test fails if it comes after
395" Test_xterm_mouse_ctrl_click()
396func Test_1xterm_mouse_wheel()
Bram Moolenaar049736f2019-04-07 21:55:07 +0200397 new
398 let save_mouse = &mouse
399 let save_term = &term
Bram Moolenaard58d4f92020-07-01 15:49:29 +0200400 let save_wrap = &wrap
Bram Moolenaar049736f2019-04-07 21:55:07 +0200401 let save_ttymouse = &ttymouse
Bram Moolenaard58d4f92020-07-01 15:49:29 +0200402 set mouse=a term=xterm nowrap
403 call setline(1, range(100000000000000, 100000000000100))
Bram Moolenaar049736f2019-04-07 21:55:07 +0200404
Bram Moolenaar515545e2020-03-22 14:08:59 +0100405 for ttymouse_val in g:Ttymouse_values
Bram Moolenaar49452192019-04-17 16:27:02 +0200406 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200407 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200408 go
Bram Moolenaar49452192019-04-17 16:27:02 +0200409 call assert_equal(1, line('w0'), msg)
410 call assert_equal([0, 1, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200411
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200412 call MouseWheelDown(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200413 call assert_equal(4, line('w0'), msg)
414 call assert_equal([0, 4, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200415
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200416 call MouseWheelDown(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200417 call assert_equal(7, line('w0'), msg)
418 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200419
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200420 call MouseWheelUp(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200421 call assert_equal(4, line('w0'), msg)
422 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaar049736f2019-04-07 21:55:07 +0200423
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200424 call MouseWheelUp(1, 1)
Bram Moolenaar49452192019-04-17 16:27:02 +0200425 call assert_equal(1, line('w0'), msg)
426 call assert_equal([0, 7, 1, 0], getpos('.'), msg)
Bram Moolenaard58d4f92020-07-01 15:49:29 +0200427
428 if has('gui')
429 " Horizontal wheel scrolling currently only works when vim is
430 " compiled with gui enabled.
431 call MouseWheelRight(1, 1)
432 call assert_equal(7, 1 + virtcol(".") - wincol(), msg)
433 call assert_equal([0, 7, 7, 0], getpos('.'), msg)
434
435 call MouseWheelRight(1, 1)
436 call assert_equal(13, 1 + virtcol(".") - wincol(), msg)
437 call assert_equal([0, 7, 13, 0], getpos('.'), msg)
438
439 call MouseWheelLeft(1, 1)
440 call assert_equal(7, 1 + virtcol(".") - wincol(), msg)
441 call assert_equal([0, 7, 13, 0], getpos('.'), msg)
442
443 call MouseWheelLeft(1, 1)
444 call assert_equal(1, 1 + virtcol(".") - wincol(), msg)
445 call assert_equal([0, 7, 13, 0], getpos('.'), msg)
446 endif
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200447 endfor
Bram Moolenaar049736f2019-04-07 21:55:07 +0200448
449 let &mouse = save_mouse
450 let &term = save_term
Bram Moolenaard58d4f92020-07-01 15:49:29 +0200451 let &wrap = save_wrap
Bram Moolenaar049736f2019-04-07 21:55:07 +0200452 let &ttymouse = save_ttymouse
453 bwipe!
454endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200455
Bram Moolenaarb4367b72019-10-01 14:19:07 +0200456" Test that dragging beyond the window (at the bottom and at the top)
Bram Moolenaarf19f8d12019-12-18 19:36:23 +0100457" scrolls window content by the number of lines beyond the window.
Bram Moolenaarb4367b72019-10-01 14:19:07 +0200458func Test_term_mouse_drag_beyond_window()
459 let save_mouse = &mouse
460 let save_term = &term
461 let save_ttymouse = &ttymouse
462 call test_override('no_query_mouse', 1)
463 set mouse=a term=xterm
464 let col = 1
465 call setline(1, range(1, 100))
466
467 " Split into 3 windows, and go into the middle window
468 " so we test dragging mouse below and above the window.
469 2split
470 wincmd j
471 2split
472
Bram Moolenaar515545e2020-03-22 14:08:59 +0100473 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaarb4367b72019-10-01 14:19:07 +0200474 let msg = 'ttymouse=' .. ttymouse_val
475 exe 'set ttymouse=' .. ttymouse_val
476
477 " Line #10 at the top.
478 norm! 10zt
479 redraw
480 call assert_equal(10, winsaveview().topline, msg)
481 call assert_equal(2, winheight(0), msg)
482
483 let row = 4
484 call MouseLeftClick(row, col)
485 call assert_equal(10, winsaveview().topline, msg)
486
487 " Drag downwards. We're still in the window so topline should
488 " not change yet.
489 let row += 1
490 call MouseLeftDrag(row, col)
491 call assert_equal(10, winsaveview().topline, msg)
492
493 " We now leave the window at the bottom, so the window content should
494 " scroll by 1 line, then 2 lines (etc) as we drag further away.
495 let row += 1
496 call MouseLeftDrag(row, col)
497 call assert_equal(11, winsaveview().topline, msg)
498
499 let row += 1
500 call MouseLeftDrag(row, col)
501 call assert_equal(13, winsaveview().topline, msg)
502
503 " Now drag upwards.
504 let row -= 1
505 call MouseLeftDrag(row, col)
506 call assert_equal(14, winsaveview().topline, msg)
507
508 " We're now back in the window so the topline should not change.
509 let row -= 1
510 call MouseLeftDrag(row, col)
511 call assert_equal(14, winsaveview().topline, msg)
512
513 let row -= 1
514 call MouseLeftDrag(row, col)
515 call assert_equal(14, winsaveview().topline, msg)
516
517 " We now leave the window at the top so the window content should
518 " scroll by 1 line, then 2, then 3 (etc) in the opposite direction.
519 let row -= 1
520 call MouseLeftDrag(row, col)
521 call assert_equal(13, winsaveview().topline, msg)
522
523 let row -= 1
524 call MouseLeftDrag(row, col)
525 call assert_equal(11, winsaveview().topline, msg)
526
527 let row -= 1
528 call MouseLeftDrag(row, col)
529 call assert_equal(8, winsaveview().topline, msg)
530
531 call MouseLeftRelease(row, col)
532 call assert_equal(8, winsaveview().topline, msg)
533 call assert_equal(2, winheight(0), msg)
534 endfor
535
536 let &mouse = save_mouse
537 let &term = save_term
538 let &ttymouse = save_ttymouse
539 call test_override('no_query_mouse', 0)
540 bwipe!
541endfunc
542
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200543func Test_term_mouse_drag_window_separator()
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200544 let save_mouse = &mouse
545 let save_term = &term
546 let save_ttymouse = &ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200547 call test_override('no_query_mouse', 1)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200548 set mouse=a term=xterm
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200549
Bram Moolenaar515545e2020-03-22 14:08:59 +0100550 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaar49452192019-04-17 16:27:02 +0200551 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200552 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200553
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200554 " Split horizontally and test dragging the horizontal window separator.
555 split
556 let rowseparator = winheight(0) + 1
557 let row = rowseparator
558 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200559
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200560 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
561 if ttymouse_val !=# 'xterm2' || row <= 223
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200562 call MouseLeftClick(row, col)
563 let row -= 1
564 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200565 call assert_equal(rowseparator - 1, winheight(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200566 let row += 1
567 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200568 call assert_equal(rowseparator, winheight(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200569 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200570 call assert_equal(rowseparator, winheight(0) + 1, msg)
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200571 endif
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200572 bwipe!
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200573
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200574 " Split vertically and test dragging the vertical window separator.
575 vsplit
576 let colseparator = winwidth(0) + 1
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200577 let row = 1
578 let col = colseparator
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200579
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200580 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
581 if ttymouse_val !=# 'xterm2' || col <= 223
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200582 call MouseLeftClick(row, col)
583 let col -= 1
584 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200585 call assert_equal(colseparator - 1, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200586 let col += 1
587 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200588 call assert_equal(colseparator, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200589 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200590 call assert_equal(colseparator, winwidth(0) + 1, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200591 endif
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200592 bwipe!
593 endfor
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200594
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200595 let &mouse = save_mouse
596 let &term = save_term
597 let &ttymouse = save_ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200598 call test_override('no_query_mouse', 0)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200599endfunc
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200600
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200601func Test_term_mouse_drag_statusline()
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200602 let save_mouse = &mouse
603 let save_term = &term
604 let save_ttymouse = &ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200605 call test_override('no_query_mouse', 1)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200606 let save_laststatus = &laststatus
607 set mouse=a term=xterm laststatus=2
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200608
Bram Moolenaar515545e2020-03-22 14:08:59 +0100609 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaar49452192019-04-17 16:27:02 +0200610 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200611 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200612
Bram Moolenaar49452192019-04-17 16:27:02 +0200613 call assert_equal(1, &cmdheight, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200614 let rowstatusline = winheight(0) + 1
615 let row = rowstatusline
616 let col = 1
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200617
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200618 if ttymouse_val ==# 'xterm2' && row > 223
619 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
Bram Moolenaarc8b3dda2019-04-12 21:42:52 +0200620 continue
621 endif
622
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200623 call MouseLeftClick(row, col)
624 let row -= 1
625 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200626 call assert_equal(2, &cmdheight, msg)
627 call assert_equal(rowstatusline - 1, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200628 let row += 1
629 call MouseLeftDrag(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200630 call assert_equal(1, &cmdheight, msg)
631 call assert_equal(rowstatusline, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200632 call MouseLeftRelease(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200633 call assert_equal(1, &cmdheight, msg)
634 call assert_equal(rowstatusline, winheight(0) + 1, msg)
Bram Moolenaar3fbd2d72019-04-11 23:56:16 +0200635 endfor
636
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200637 let &mouse = save_mouse
638 let &term = save_term
639 let &ttymouse = save_ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200640 call test_override('no_query_mouse', 0)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200641 let &laststatus = save_laststatus
642endfunc
643
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200644func Test_term_mouse_click_tab()
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200645 let save_mouse = &mouse
646 let save_term = &term
647 let save_ttymouse = &ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200648 call test_override('no_query_mouse', 1)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200649 set mouse=a term=xterm
650 let row = 1
651
Bram Moolenaar515545e2020-03-22 14:08:59 +0100652 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
Bram Moolenaar49452192019-04-17 16:27:02 +0200653 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200654 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200655 e Xfoo
656 tabnew Xbar
657
658 let a = split(execute(':tabs'), "\n")
659 call assert_equal(['Tab page 1',
660 \ ' Xfoo',
661 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200662 \ '> Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200663
664 " Test clicking on tab names in the tabline at the top.
665 let col = 2
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200666 redraw
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200667 call MouseLeftClick(row, col)
668 call MouseLeftRelease(row, col)
669 let a = split(execute(':tabs'), "\n")
670 call assert_equal(['Tab page 1',
671 \ '> Xfoo',
672 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200673 \ ' Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200674
675 let col = 9
676 call MouseLeftClick(row, col)
677 call MouseLeftRelease(row, col)
678 let a = split(execute(':tabs'), "\n")
679 call assert_equal(['Tab page 1',
680 \ ' Xfoo',
681 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200682 \ '> Xbar'], a, msg)
Bram Moolenaarca57ab52019-04-13 14:53:16 +0200683
684 %bwipe!
685 endfor
686
687 let &mouse = save_mouse
688 let &term = save_term
689 let &ttymouse = save_ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200690 call test_override('no_query_mouse', 0)
Bram Moolenaar3fb01a52019-04-09 21:52:02 +0200691endfunc
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200692
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200693func Test_term_mouse_click_X_to_close_tab()
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200694 let save_mouse = &mouse
695 let save_term = &term
696 let save_ttymouse = &ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200697 call test_override('no_query_mouse', 1)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200698 set mouse=a term=xterm
699 let row = 1
700 let col = &columns
701
Bram Moolenaar515545e2020-03-22 14:08:59 +0100702 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +0200703 if ttymouse_val ==# 'xterm2' && col > 223
704 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200705 continue
706 endif
Bram Moolenaar49452192019-04-17 16:27:02 +0200707 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200708 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200709 e Xtab1
710 tabnew Xtab2
711 tabnew Xtab3
712 tabn 2
713
714 let a = split(execute(':tabs'), "\n")
715 call assert_equal(['Tab page 1',
716 \ ' Xtab1',
717 \ 'Tab page 2',
718 \ '> Xtab2',
719 \ 'Tab page 3',
Bram Moolenaar49452192019-04-17 16:27:02 +0200720 \ ' Xtab3'], a, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200721
722 " Click on "X" in tabline to close current tab i.e. Xtab2.
723 redraw
724 call MouseLeftClick(row, col)
725 call MouseLeftRelease(row, col)
726 let a = split(execute(':tabs'), "\n")
727 call assert_equal(['Tab page 1',
728 \ ' Xtab1',
729 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200730 \ '> Xtab3'], a, msg)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200731
732 %bwipe!
733 endfor
734
735 let &mouse = save_mouse
736 let &term = save_term
737 let &ttymouse = save_ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200738 call test_override('no_query_mouse', 0)
Bram Moolenaar39f76c62019-04-13 22:13:23 +0200739endfunc
Bram Moolenaare3e38282019-04-15 20:55:31 +0200740
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200741func Test_term_mouse_drag_to_move_tab()
Bram Moolenaare3e38282019-04-15 20:55:31 +0200742 let save_mouse = &mouse
743 let save_term = &term
744 let save_ttymouse = &ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200745 call test_override('no_query_mouse', 1)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200746 " Set 'mousetime' to 1 to avoid recognizing a double-click in the loop
747 set mouse=a term=xterm mousetime=1
748 let row = 1
749
Bram Moolenaar515545e2020-03-22 14:08:59 +0100750 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaar49452192019-04-17 16:27:02 +0200751 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200752 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaare3e38282019-04-15 20:55:31 +0200753 e Xtab1
754 tabnew Xtab2
755
756 let a = split(execute(':tabs'), "\n")
757 call assert_equal(['Tab page 1',
758 \ ' Xtab1',
759 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200760 \ '> Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200761 redraw
762
763 " Click in tab2 and drag it to tab1.
764 " Check getcharmod() to verify that click is not
765 " interpreted as a spurious double-click.
766 call MouseLeftClick(row, 10)
Bram Moolenaar49452192019-04-17 16:27:02 +0200767 call assert_equal(0, getcharmod(), msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200768 for col in [9, 8, 7, 6]
769 call MouseLeftDrag(row, col)
770 endfor
771 call MouseLeftRelease(row, col)
772 let a = split(execute(':tabs'), "\n")
773 call assert_equal(['Tab page 1',
774 \ '> Xtab2',
775 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200776 \ ' Xtab1'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200777
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100778 " Click elsewhere so that click in next iteration is not
779 " interpreted as unwanted double-click.
780 call MouseLeftClick(row, 11)
781 call MouseLeftRelease(row, 11)
782
Bram Moolenaare3e38282019-04-15 20:55:31 +0200783 %bwipe!
784 endfor
785
786 let &mouse = save_mouse
787 let &term = save_term
788 let &ttymouse = save_ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200789 call test_override('no_query_mouse', 0)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200790 set mousetime&
791endfunc
792
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200793func Test_term_mouse_double_click_to_create_tab()
Bram Moolenaare3e38282019-04-15 20:55:31 +0200794 let save_mouse = &mouse
795 let save_term = &term
796 let save_ttymouse = &ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200797 call test_override('no_query_mouse', 1)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200798 " Set 'mousetime' to a small value, so that double-click works but we don't
799 " have to wait long to avoid a triple-click.
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100800 set mouse=a term=xterm mousetime=200
Bram Moolenaare3e38282019-04-15 20:55:31 +0200801 let row = 1
802 let col = 10
803
Bram Moolenaar515545e2020-03-22 14:08:59 +0100804 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaar49452192019-04-17 16:27:02 +0200805 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200806 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaare3e38282019-04-15 20:55:31 +0200807 e Xtab1
808 tabnew Xtab2
809
810 let a = split(execute(':tabs'), "\n")
811 call assert_equal(['Tab page 1',
812 \ ' Xtab1',
813 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200814 \ '> Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200815
816 redraw
817 call MouseLeftClick(row, col)
818 " Check getcharmod() to verify that first click is not
819 " interpreted as a spurious double-click.
Bram Moolenaar49452192019-04-17 16:27:02 +0200820 call assert_equal(0, getcharmod(), msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200821 call MouseLeftRelease(row, col)
822 call MouseLeftClick(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200823 call assert_equal(32, getcharmod(), msg) " double-click
Bram Moolenaare3e38282019-04-15 20:55:31 +0200824 call MouseLeftRelease(row, col)
825 let a = split(execute(':tabs'), "\n")
826 call assert_equal(['Tab page 1',
827 \ ' Xtab1',
828 \ 'Tab page 2',
829 \ '> [No Name]',
830 \ 'Tab page 3',
Bram Moolenaar49452192019-04-17 16:27:02 +0200831 \ ' Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200832
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100833 " Click elsewhere so that click in next iteration is not
834 " interpreted as unwanted double click.
835 call MouseLeftClick(row, col + 1)
836 call MouseLeftRelease(row, col + 1)
837
Bram Moolenaare3e38282019-04-15 20:55:31 +0200838 %bwipe!
839 endfor
840
841 let &mouse = save_mouse
842 let &term = save_term
843 let &ttymouse = save_ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200844 call test_override('no_query_mouse', 0)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200845 set mousetime&
846endfunc
Bram Moolenaar696d6372019-04-17 16:33:46 +0200847
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100848" Test double/triple/quadruple click in normal mode to visually select.
849func Test_term_mouse_multiple_clicks_to_visually_select()
850 let save_mouse = &mouse
851 let save_term = &term
852 let save_ttymouse = &ttymouse
853 call test_override('no_query_mouse', 1)
854 set mouse=a term=xterm mousetime=200
855 new
856
Bram Moolenaar515545e2020-03-22 14:08:59 +0100857 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100858 let msg = 'ttymouse=' .. ttymouse_val
859 exe 'set ttymouse=' .. ttymouse_val
860 call setline(1, ['foo [foo bar] foo', 'foo'])
861
862 " Double-click on word should visually select the word.
863 call MouseLeftClick(1, 2)
864 call assert_equal(0, getcharmod(), msg)
865 call MouseLeftRelease(1, 2)
866 call MouseLeftClick(1, 2)
867 call assert_equal(32, getcharmod(), msg) " double-click
868 call MouseLeftRelease(1, 2)
869 call assert_equal('v', mode(), msg)
870 norm! r1
871 call assert_equal(['111 [foo bar] foo', 'foo'], getline(1, '$'), msg)
872
873 " Double-click on opening square bracket should visually
874 " select the whole [foo bar].
875 call MouseLeftClick(1, 5)
876 call assert_equal(0, getcharmod(), msg)
877 call MouseLeftRelease(1, 5)
878 call MouseLeftClick(1, 5)
879 call assert_equal(32, getcharmod(), msg) " double-click
880 call MouseLeftRelease(1, 5)
881 call assert_equal('v', mode(), msg)
882 norm! r2
883 call assert_equal(['111 222222222 foo', 'foo'], getline(1, '$'), msg)
884
885 " Triple-click should visually select the whole line.
886 call MouseLeftClick(1, 3)
887 call assert_equal(0, getcharmod(), msg)
888 call MouseLeftRelease(1, 3)
889 call MouseLeftClick(1, 3)
890 call assert_equal(32, getcharmod(), msg) " double-click
891 call MouseLeftRelease(1, 3)
892 call MouseLeftClick(1, 3)
893 call assert_equal(64, getcharmod(), msg) " triple-click
894 call MouseLeftRelease(1, 3)
895 call assert_equal('V', mode(), msg)
896 norm! r3
897 call assert_equal(['33333333333333333', 'foo'], getline(1, '$'), msg)
898
899 " Quadruple-click should start visual block select.
900 call MouseLeftClick(1, 2)
901 call assert_equal(0, getcharmod(), msg)
902 call MouseLeftRelease(1, 2)
903 call MouseLeftClick(1, 2)
904 call assert_equal(32, getcharmod(), msg) " double-click
905 call MouseLeftRelease(1, 2)
906 call MouseLeftClick(1, 2)
907 call assert_equal(64, getcharmod(), msg) " triple-click
908 call MouseLeftRelease(1, 2)
909 call MouseLeftClick(1, 2)
910 call assert_equal(96, getcharmod(), msg) " quadruple-click
911 call MouseLeftRelease(1, 2)
912 call assert_equal("\<c-v>", mode(), msg)
913 norm! r4
914 call assert_equal(['34333333333333333', 'foo'], getline(1, '$'), msg)
Bram Moolenaar2764d062020-07-18 12:59:19 +0200915
916 " Double-click on a space character should visually select all the
917 " consecutive space characters.
918 %d
919 call setline(1, ' one two')
920 call MouseLeftClick(1, 2)
921 call MouseLeftRelease(1, 2)
922 call MouseLeftClick(1, 2)
923 call MouseLeftRelease(1, 2)
924 call assert_equal('v', mode(), msg)
925 norm! r1
926 call assert_equal(['1111one two'], getline(1, '$'), msg)
927
928 " Double-click on a word with exclusive selection
929 set selection=exclusive
930 let @" = ''
931 call MouseLeftClick(1, 10)
932 call MouseLeftRelease(1, 10)
933 call MouseLeftClick(1, 10)
934 call MouseLeftRelease(1, 10)
935 norm! y
936 call assert_equal('two', @", msg)
937
938 " Double click to select a block of text with exclusive selection
939 %d
940 call setline(1, 'one (two) three')
941 call MouseLeftClick(1, 5)
942 call MouseLeftRelease(1, 5)
943 call MouseLeftClick(1, 5)
944 call MouseLeftRelease(1, 5)
945 norm! y
946 call assert_equal(5, col("'<"), msg)
947 call assert_equal(10, col("'>"), msg)
948
949 call MouseLeftClick(1, 9)
950 call MouseLeftRelease(1, 9)
951 call MouseLeftClick(1, 9)
952 call MouseLeftRelease(1, 9)
953 norm! y
954 call assert_equal(5, col("'<"), msg)
955 call assert_equal(10, col("'>"), msg)
956 set selection&
957
958 " Click somewhere else so that the clicks above is not combined with the
959 " clicks in the next iteration.
960 call MouseRightClick(3, 10)
961 call MouseRightRelease(3, 10)
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100962 endfor
963
964 let &mouse = save_mouse
965 let &term = save_term
966 let &ttymouse = save_ttymouse
967 set mousetime&
968 call test_override('no_query_mouse', 0)
969 bwipe!
970endfunc
971
Bram Moolenaar2764d062020-07-18 12:59:19 +0200972" Test for selecting text in visual blockwise mode using Alt-LeftClick
973func Test_mouse_alt_leftclick()
974 let save_mouse = &mouse
975 let save_term = &term
976 let save_ttymouse = &ttymouse
977 call test_override('no_query_mouse', 1)
978 set mouse=a term=xterm mousetime=200
979 set mousemodel=popup
980 new
981 call setline(1, 'one (two) three')
982
983 for ttymouse_val in g:Ttymouse_values
984 let msg = 'ttymouse=' .. ttymouse_val
985 exe 'set ttymouse=' .. ttymouse_val
986
987 " Left click with the Alt modifier key should extend the selection in
988 " blockwise visual mode.
989 let @" = ''
990 call MouseLeftClick(1, 3)
991 call MouseLeftRelease(1, 3)
992 call MouseAltLeftClick(1, 11)
993 call MouseLeftRelease(1, 11)
994 call assert_equal("\<C-V>", mode(), msg)
995 normal! y
996 call assert_equal('e (two) t', @")
997 endfor
998
999 let &mouse = save_mouse
1000 let &term = save_term
1001 let &ttymouse = save_ttymouse
1002 set mousetime& mousemodel&
1003 call test_override('no_query_mouse', 0)
1004 close!
1005endfunc
1006
Bram Moolenaar696d6372019-04-17 16:33:46 +02001007func Test_xterm_mouse_click_in_fold_columns()
1008 new
1009 let save_mouse = &mouse
1010 let save_term = &term
1011 let save_ttymouse = &ttymouse
1012 let save_foldcolumn = &foldcolumn
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +02001013 set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
Bram Moolenaar696d6372019-04-17 16:33:46 +02001014
1015 " Create 2 nested folds.
1016 call setline(1, range(1, 7))
1017 2,6fold
1018 norm! zR
1019 4,5fold
1020 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
1021 \ map(range(1, 7), 'foldclosed(v:val)'))
1022
1023 " Click in "+" of inner fold in foldcolumn should open it.
1024 redraw
1025 let row = 4
1026 let col = 2
1027 call MouseLeftClick(row, col)
1028 call MouseLeftRelease(row, col)
1029 call assert_equal([-1, -1, -1, -1, -1, -1, -1],
1030 \ map(range(1, 7), 'foldclosed(v:val)'))
1031
1032 " Click in "-" of outer fold in foldcolumn should close it.
1033 redraw
1034 let row = 2
1035 let col = 1
1036 call MouseLeftClick(row, col)
1037 call MouseLeftRelease(row, col)
1038 call assert_equal([-1, 2, 2, 2, 2, 2, -1],
1039 \ map(range(1, 7), 'foldclosed(v:val)'))
1040 norm! zR
1041
1042 " Click in "|" of inner fold in foldcolumn should close it.
1043 redraw
1044 let row = 5
1045 let col = 2
1046 call MouseLeftClick(row, col)
1047 call MouseLeftRelease(row, col)
1048 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
1049 \ map(range(1, 7), 'foldclosed(v:val)'))
1050
1051 let &foldcolumn = save_foldcolumn
1052 let &ttymouse = save_ttymouse
1053 let &term = save_term
1054 let &mouse = save_mouse
1055 bwipe!
1056endfunc
Bram Moolenaar66761db2019-06-05 22:07:51 +02001057
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001058" Left or right click in Ex command line sets position of the cursor.
1059func Test_term_mouse_click_in_cmdline_to_set_pos()
1060 let save_mouse = &mouse
1061 let save_term = &term
1062 let save_ttymouse = &ttymouse
1063 call test_override('no_query_mouse', 1)
1064 set mouse=a term=xterm
1065 let row = &lines
1066
Bram Moolenaar515545e2020-03-22 14:08:59 +01001067 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaarab505b12020-03-23 19:28:44 +01001068 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
1069 if ttymouse_val !=# 'xterm2' || row <= 223
1070 let msg = 'ttymouse=' .. ttymouse_val
1071 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001072
Bram Moolenaarab505b12020-03-23 19:28:44 +01001073
1074 call feedkeys(':"3456789'
1075 \ .. MouseLeftClickCode(row, 7)
1076 \ .. MouseLeftReleaseCode(row, 7) .. 'L'
1077 \ .. MouseRightClickCode(row, 4)
1078 \ .. MouseRightReleaseCode(row, 4) .. 'R'
1079 \ .. "\<CR>", 'Lx!')
1080 call assert_equal('"3R456L789', @:, msg)
1081 endif
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001082 endfor
1083
1084 let &mouse = save_mouse
1085 let &term = save_term
1086 let &ttymouse = save_ttymouse
1087 set mousetime&
1088 call test_override('no_query_mouse', 0)
1089endfunc
1090
1091" Middle click in command line pastes at position of cursor.
1092func Test_term_mouse_middle_click_in_cmdline_to_paste()
1093 CheckFeature clipboard_working
1094 let save_mouse = &mouse
1095 let save_term = &term
1096 let save_ttymouse = &ttymouse
1097 call test_override('no_query_mouse', 1)
1098 set mouse=a term=xterm
1099 let row = &lines
1100 " Column values does not matter, paste is done at position of cursor.
1101 let col = 1
1102 let @* = 'paste'
1103
Bram Moolenaar515545e2020-03-22 14:08:59 +01001104 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001105 let msg = 'ttymouse=' .. ttymouse_val
1106 exe 'set ttymouse=' .. ttymouse_val
1107
1108 call feedkeys(":\"->"
1109 \ .. MouseMiddleReleaseCode(row, col)
1110 \ .. MouseMiddleClickCode(row, col)
1111 \ .. "<-"
1112 \ .. MouseMiddleReleaseCode(row, col)
1113 \ .. MouseMiddleClickCode(row, col)
1114 \ .. "\<CR>", 'Lx!')
1115 call assert_equal('"->paste<-paste', @:, msg)
1116 endfor
1117
1118 let &mouse = save_mouse
1119 let &term = save_term
1120 let &ttymouse = save_ttymouse
1121 let @* = ''
1122 call test_override('no_query_mouse', 0)
1123endfunc
1124
Bram Moolenaar297bec02020-07-14 22:11:04 +02001125" Test for making sure S-Middlemouse doesn't do anything
1126func Test_term_mouse_shift_middle_click()
1127 new
1128 let save_mouse = &mouse
1129 let save_term = &term
1130 let save_ttymouse = &ttymouse
1131 call test_override('no_query_mouse', 1)
1132 set mouse=a term=xterm ttymouse=xterm2 mousemodel=
1133
1134 call test_setmouse(1, 1)
1135 exe "normal \<S-MiddleMouse>"
1136 call assert_equal([''], getline(1, '$'))
1137 call assert_equal(1, winnr())
1138
1139 let &mouse = save_mouse
1140 let &term = save_term
1141 let &ttymouse = save_ttymouse
1142 set mousemodel&
1143 call test_override('no_query_mouse', 0)
1144 close!
1145endfunc
1146
1147" Test for using mouse in visual mode
1148func Test_term_mouse_visual_mode()
1149 new
1150 let save_mouse = &mouse
1151 let save_term = &term
1152 let save_ttymouse = &ttymouse
1153 call test_override('no_query_mouse', 1)
1154 set term=xterm ttymouse=xterm2
1155
1156 " If visual mode is not present in 'mouse', then left click should not
1157 " do anything in visal mode.
1158 call setline(1, ['one two three four'])
1159 set mouse=nci
1160 call cursor(1, 5)
1161 let @" = ''
1162 call feedkeys("ve"
1163 \ .. MouseLeftClickCode(1, 15) .. MouseLeftReleaseCode(1, 15)
1164 \ .. 'y', 'Lx!')
1165 call assert_equal(5, col('.'))
1166 call assert_equal('two', @")
1167
1168 " Pressing right click in visual mode should change the visual selection
1169 " if 'mousemodel' doesn't contain popup.
1170 " Right click after the visual selection
1171 set mousemodel=
1172 set mouse=a
1173 call test_setmouse(1, 13)
1174 exe "normal 5|ve\<RightMouse>y"
1175 call assert_equal('two three', @")
1176 call assert_equal(5, col('.'))
1177
1178 " Right click before the visual selection
1179 call test_setmouse(1, 9)
1180 exe "normal 15|ve\<RightMouse>y"
1181 call assert_equal('three four', @")
1182 call assert_equal(9, col('.'))
1183
Bram Moolenaar2764d062020-07-18 12:59:19 +02001184 " Right click inside the selection closer to the start of the selection
1185 call test_setmouse(1, 7)
1186 exe "normal 5|vee\<RightMouse>lly"
1187 call assert_equal('three', @")
1188 call assert_equal(9, col('.'))
1189 call assert_equal(9, col("'<"))
1190 call assert_equal(13, col("'>"))
1191
1192 " Right click inside the selection closer to the end of the selection
1193 call test_setmouse(1, 11)
1194 exe "normal 5|vee\<RightMouse>ly"
1195 call assert_equal('two thre', @")
1196 call assert_equal(5, col('.'))
1197 call assert_equal(5, col("'<"))
1198 call assert_equal(12, col("'>"))
1199
1200 " Multi-line selection. Right click inside thse selection.
1201 call setline(1, repeat(['aaaaaa'], 7))
Bram Moolenaar297bec02020-07-14 22:11:04 +02001202 call test_setmouse(3, 1)
1203 exe "normal ggVG\<RightMouse>y"
1204 call assert_equal(3, line("'<"))
Bram Moolenaar2764d062020-07-18 12:59:19 +02001205 call test_setmouse(5, 1)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001206 exe "normal ggVG\<RightMouse>y"
Bram Moolenaar2764d062020-07-18 12:59:19 +02001207 call assert_equal(5, line("'>"))
1208
1209 " Click right in the middle line of the selection
1210 call test_setmouse(4, 3)
1211 exe "normal ggVG$\<RightMouse>y"
1212 call assert_equal(4, line("'<"))
1213 call test_setmouse(4, 4)
1214 exe "normal ggVG$\<RightMouse>y"
Bram Moolenaar297bec02020-07-14 22:11:04 +02001215 call assert_equal(4, line("'>"))
1216
1217 set mousemodel&
1218 let &mouse = save_mouse
1219 let &term = save_term
1220 let &ttymouse = save_ttymouse
1221 call test_override('no_query_mouse', 0)
1222 close!
1223endfunc
1224
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001225" Test for displaying the popup menu using the right mouse click
Bram Moolenaar297bec02020-07-14 22:11:04 +02001226func Test_term_mouse_popup_menu()
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001227 CheckFeature menu
1228 new
1229 call setline(1, 'popup menu test')
1230 let save_mouse = &mouse
1231 let save_term = &term
1232 let save_ttymouse = &ttymouse
1233 let save_mousemodel = &mousemodel
1234 call test_override('no_query_mouse', 1)
1235 set mouse=a term=xterm mousemodel=popup
1236
1237 menu PopUp.foo :let g:menustr = 'foo'<CR>
1238 menu PopUp.bar :let g:menustr = 'bar'<CR>
1239 menu PopUp.baz :let g:menustr = 'baz'<CR>
1240
Bram Moolenaar515545e2020-03-22 14:08:59 +01001241 for ttymouse_val in g:Ttymouse_values
Bram Moolenaar2764d062020-07-18 12:59:19 +02001242 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001243 exe 'set ttymouse=' .. ttymouse_val
1244 let g:menustr = ''
1245 call feedkeys(MouseRightClickCode(1, 4)
1246 \ .. MouseRightReleaseCode(1, 4) .. "\<Down>\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001247 call assert_equal('bar', g:menustr, msg)
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001248 endfor
1249
1250 unmenu PopUp
1251 let &mouse = save_mouse
1252 let &term = save_term
1253 let &ttymouse = save_ttymouse
1254 let &mousemodel = save_mousemodel
1255 call test_override('no_query_mouse', 0)
1256 close!
1257endfunc
1258
Bram Moolenaar297bec02020-07-14 22:11:04 +02001259" Test for 'mousemodel' set to popup_setpos to move the cursor where the popup
1260" menu is displayed.
1261func Test_term_mouse_popup_menu_setpos()
1262 CheckFeature menu
1263 5new
1264 call setline(1, ['the dish ran away with the spoon',
1265 \ 'the cow jumped over the moon' ])
1266 let save_mouse = &mouse
1267 let save_term = &term
1268 let save_ttymouse = &ttymouse
1269 let save_mousemodel = &mousemodel
1270 call test_override('no_query_mouse', 1)
1271 set mouse=a term=xterm mousemodel=popup_setpos
1272
1273 nmenu PopUp.foo :let g:menustr = 'foo'<CR>
1274 nmenu PopUp.bar :let g:menustr = 'bar'<CR>
1275 nmenu PopUp.baz :let g:menustr = 'baz'<CR>
1276 vmenu PopUp.foo y:<C-U>let g:menustr = 'foo'<CR>
1277 vmenu PopUp.bar y:<C-U>let g:menustr = 'bar'<CR>
1278 vmenu PopUp.baz y:<C-U>let g:menustr = 'baz'<CR>
1279
1280 for ttymouse_val in g:Ttymouse_values
Bram Moolenaar2764d062020-07-18 12:59:19 +02001281 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar297bec02020-07-14 22:11:04 +02001282 exe 'set ttymouse=' .. ttymouse_val
1283 let g:menustr = ''
1284 call cursor(1, 1)
1285 call feedkeys(MouseRightClickCode(1, 5)
1286 \ .. MouseRightReleaseCode(1, 5) .. "\<Down>\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001287 call assert_equal('bar', g:menustr, msg)
1288 call assert_equal([1, 5], [line('.'), col('.')], msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001289
1290 " Test for right click in visual mode inside the selection
1291 let @" = ''
1292 call cursor(1, 10)
1293 call feedkeys('vee' .. MouseRightClickCode(1, 12)
1294 \ .. MouseRightReleaseCode(1, 12) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001295 call assert_equal([1, 10], [line('.'), col('.')], msg)
1296 call assert_equal('ran away', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001297
1298 " Test for right click in visual mode before the selection
1299 let @" = ''
1300 call cursor(1, 10)
1301 call feedkeys('vee' .. MouseRightClickCode(1, 2)
1302 \ .. MouseRightReleaseCode(1, 2) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001303 call assert_equal([1, 2], [line('.'), col('.')], msg)
1304 call assert_equal('', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001305
1306 " Test for right click in visual mode after the selection
1307 let @" = ''
1308 call cursor(1, 10)
1309 call feedkeys('vee' .. MouseRightClickCode(1, 20)
1310 \ .. MouseRightReleaseCode(1, 20) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001311 call assert_equal([1, 20], [line('.'), col('.')], msg)
1312 call assert_equal('', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001313
1314 " Test for right click in block-wise visual mode inside the selection
1315 let @" = ''
1316 call cursor(1, 16)
1317 call feedkeys("\<C-V>j3l" .. MouseRightClickCode(2, 17)
1318 \ .. MouseRightReleaseCode(2, 17) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001319 call assert_equal([1, 16], [line('.'), col('.')], msg)
1320 call assert_equal("\<C-V>4", getregtype('"'), msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001321
1322 " Test for right click in block-wise visual mode outside the selection
1323 let @" = ''
1324 call cursor(1, 16)
1325 call feedkeys("\<C-V>j3l" .. MouseRightClickCode(2, 2)
1326 \ .. MouseRightReleaseCode(2, 2) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001327 call assert_equal([2, 2], [line('.'), col('.')], msg)
1328 call assert_equal('v', getregtype('"'), msg)
1329 call assert_equal('', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001330
1331 " Try clicking on the status line
1332 let @" = ''
1333 call cursor(1, 10)
1334 call feedkeys('vee' .. MouseRightClickCode(6, 2)
1335 \ .. MouseRightReleaseCode(6, 2) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001336 call assert_equal([1, 10], [line('.'), col('.')], msg)
1337 call assert_equal('ran away', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001338
1339 " Try clicking outside the window
1340 let @" = ''
1341 call cursor(7, 2)
1342 call feedkeys('vee' .. MouseRightClickCode(7, 2)
1343 \ .. MouseRightReleaseCode(7, 2) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001344 call assert_equal(2, winnr(), msg)
1345 call assert_equal('', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001346 wincmd w
1347 endfor
1348
1349 unmenu PopUp
1350 let &mouse = save_mouse
1351 let &term = save_term
1352 let &ttymouse = save_ttymouse
1353 let &mousemodel = save_mousemodel
1354 call test_override('no_query_mouse', 0)
1355 close!
1356endfunc
1357
1358" Test for searching for the word under the cursor using Shift-Right or
1359" Shift-Left click.
1360func Test_term_mouse_search()
1361 new
1362 let save_mouse = &mouse
1363 let save_term = &term
1364 let save_ttymouse = &ttymouse
1365 call test_override('no_query_mouse', 1)
1366 set mouse=a term=xterm ttymouse=xterm2
1367 set mousemodel=
1368
1369 " In normal mode, Shift-Left or Shift-Right click should search for the word
1370 " under the cursor.
1371 call setline(1, ['one two three four', 'four three two one'])
1372 call test_setmouse(1, 4)
1373 exe "normal \<S-LeftMouse>"
1374 call assert_equal([2, 12], [line('.'), col('.')])
1375 call test_setmouse(2, 16)
1376 exe "normal \<S-RightMouse>"
1377 call assert_equal([1, 1], [line('.'), col('.')])
1378
1379 " In visual mode, Shift-Left or Shift-Right click should search for the word
1380 " under the cursor and extend the selection.
1381 call test_setmouse(1, 4)
1382 exe "normal 4|ve\<S-LeftMouse>y"
1383 call assert_equal([2, 12], [line("'>"), col("'>")])
1384 call test_setmouse(2, 16)
1385 exe "normal 2G16|ve\<S-RightMouse>y"
1386 call assert_equal([1, 1], [line("'<"), col("'<")])
1387
1388 set mousemodel&
1389 let &mouse = save_mouse
1390 let &term = save_term
1391 let &ttymouse = save_ttymouse
1392 call test_override('no_query_mouse', 0)
1393 close!
1394endfunc
1395
1396" Test for selecting an entry in the quickfix/location list window using the
1397" mouse.
1398func Test_term_mouse_quickfix_window()
1399 let save_mouse = &mouse
1400 let save_term = &term
1401 let save_ttymouse = &ttymouse
1402 call test_override('no_query_mouse', 1)
1403 set mouse=a term=xterm ttymouse=xterm2
1404 set mousemodel=
1405
1406 cgetexpr "Xfile1:1:L1"
1407 copen 5
1408 call test_setmouse(&lines - 7, 1)
1409 exe "normal \<2-LeftMouse>"
1410 call assert_equal('Xfile1', @%)
1411 %bw!
1412
1413 lgetexpr "Xfile2:1:L1"
1414 lopen 5
1415 call test_setmouse(&lines - 7, 1)
1416 exe "normal \<2-LeftMouse>"
1417 call assert_equal('Xfile2', @%)
1418 %bw!
1419
1420 set mousemodel&
1421 let &mouse = save_mouse
1422 let &term = save_term
1423 let &ttymouse = save_ttymouse
1424 call test_override('no_query_mouse', 0)
1425endfunc
1426
Bram Moolenaar2764d062020-07-18 12:59:19 +02001427" Test for the 'h' flag in the 'mouse' option. Using mouse in the help window.
1428func Test_term_mouse_help_window()
1429 let save_mouse = &mouse
1430 let save_term = &term
1431 let save_ttymouse = &ttymouse
1432 call test_override('no_query_mouse', 1)
1433 set mouse=h term=xterm mousetime=200
1434
1435 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
1436 let msg = 'ttymouse=' .. ttymouse_val
1437 exe 'set ttymouse=' .. ttymouse_val
1438 help
1439 let @" = ''
1440 call MouseLeftClick(2, 5)
1441 call MouseLeftRelease(2, 5)
1442 call MouseLeftClick(1, 1)
1443 call MouseLeftDrag(1, 10)
1444 call MouseLeftRelease(1, 10)
1445 norm! y
1446 call assert_equal('*help.txt*', @", msg)
1447 helpclose
1448
1449 " Click somewhere else to make sure the left click above is not combined
1450 " with the next left click and treated as a double click
1451 call MouseRightClick(5, 10)
1452 call MouseRightRelease(5, 10)
1453 endfor
1454
1455 let &mouse = save_mouse
1456 let &term = save_term
1457 let &ttymouse = save_ttymouse
1458 set mousetime&
1459 call test_override('no_query_mouse', 0)
1460 %bw!
1461endfunc
1462
1463" Test for the translation of various mouse terminal codes
1464func Test_mouse_termcodes()
1465 let save_mouse = &mouse
1466 let save_term = &term
1467 let save_ttymouse = &ttymouse
1468 call test_override('no_query_mouse', 1)
1469 set mouse=a term=xterm mousetime=200
1470
1471 new
1472 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
1473 let msg = 'ttymouse=' .. ttymouse_val
1474 exe 'set ttymouse=' .. ttymouse_val
1475
1476 let mouse_codes = [
1477 \ ["\<LeftMouse>", "<LeftMouse>"],
1478 \ ["\<MiddleMouse>", "<MiddleMouse>"],
1479 \ ["\<RightMouse>", "<RightMouse>"],
1480 \ ["\<S-LeftMouse>", "<S-LeftMouse>"],
1481 \ ["\<S-MiddleMouse>", "<S-MiddleMouse>"],
1482 \ ["\<S-RightMouse>", "<S-RightMouse>"],
1483 \ ["\<C-LeftMouse>", "<C-LeftMouse>"],
1484 \ ["\<C-MiddleMouse>", "<C-MiddleMouse>"],
1485 \ ["\<C-RightMouse>", "<C-RightMouse>"],
1486 \ ["\<M-LeftMouse>", "<M-LeftMouse>"],
1487 \ ["\<M-MiddleMouse>", "<M-MiddleMouse>"],
1488 \ ["\<M-RightMouse>", "<M-RightMouse>"],
1489 \ ["\<2-LeftMouse>", "<2-LeftMouse>"],
1490 \ ["\<2-MiddleMouse>", "<2-MiddleMouse>"],
1491 \ ["\<2-RightMouse>", "<2-RightMouse>"],
1492 \ ["\<3-LeftMouse>", "<3-LeftMouse>"],
1493 \ ["\<3-MiddleMouse>", "<3-MiddleMouse>"],
1494 \ ["\<3-RightMouse>", "<3-RightMouse>"],
1495 \ ["\<4-LeftMouse>", "<4-LeftMouse>"],
1496 \ ["\<4-MiddleMouse>", "<4-MiddleMouse>"],
1497 \ ["\<4-RightMouse>", "<4-RightMouse>"],
1498 \ ["\<LeftDrag>", "<LeftDrag>"],
1499 \ ["\<MiddleDrag>", "<MiddleDrag>"],
1500 \ ["\<RightDrag>", "<RightDrag>"],
1501 \ ["\<LeftRelease>", "<LeftRelease>"],
1502 \ ["\<MiddleRelease>", "<MiddleRelease>"],
1503 \ ["\<RightRelease>", "<RightRelease>"],
1504 \ ["\<ScrollWheelUp>", "<ScrollWheelUp>"],
1505 \ ["\<S-ScrollWheelUp>", "<S-ScrollWheelUp>"],
1506 \ ["\<C-ScrollWheelUp>", "<C-ScrollWheelUp>"],
1507 \ ["\<ScrollWheelDown>", "<ScrollWheelDown>"],
1508 \ ["\<S-ScrollWheelDown>", "<S-ScrollWheelDown>"],
1509 \ ["\<C-ScrollWheelDown>", "<C-ScrollWheelDown>"],
1510 \ ["\<ScrollWheelLeft>", "<ScrollWheelLeft>"],
1511 \ ["\<S-ScrollWheelLeft>", "<S-ScrollWheelLeft>"],
1512 \ ["\<C-ScrollWheelLeft>", "<C-ScrollWheelLeft>"],
1513 \ ["\<ScrollWheelRight>", "<ScrollWheelRight>"],
1514 \ ["\<S-ScrollWheelRight>", "<S-ScrollWheelRight>"],
1515 \ ["\<C-ScrollWheelRight>", "<C-ScrollWheelRight>"]
1516 \ ]
1517
1518 for [code, outstr] in mouse_codes
1519 exe "normal ggC\<C-K>" . code
1520 call assert_equal(outstr, getline(1), msg)
1521 endfor
1522 endfor
1523
1524 let &mouse = save_mouse
1525 let &term = save_term
1526 let &ttymouse = save_ttymouse
1527 set mousetime&
1528 call test_override('no_query_mouse', 0)
1529 %bw!
1530endfunc
1531
Bram Moolenaar66761db2019-06-05 22:07:51 +02001532" This only checks if the sequence is recognized.
Bram Moolenaar66761db2019-06-05 22:07:51 +02001533func Test_term_rgb_response()
1534 set t_RF=x
1535 set t_RB=y
1536
1537 " response to t_RF, 4 digits
1538 let red = 0x12
1539 let green = 0x34
1540 let blue = 0x56
1541 let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
1542 call feedkeys(seq, 'Lx!')
1543 call assert_equal(seq, v:termrfgresp)
1544
1545 " response to t_RF, 2 digits
1546 let red = 0x78
1547 let green = 0x9a
1548 let blue = 0xbc
1549 let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
1550 call feedkeys(seq, 'Lx!')
1551 call assert_equal(seq, v:termrfgresp)
1552
Bram Moolenaar32e19772019-06-05 22:57:04 +02001553 " response to t_RB, 4 digits, dark
1554 set background=light
Bram Moolenaarce90e362019-09-08 18:58:44 +02001555 eval 'background'->test_option_not_set()
Bram Moolenaar32e19772019-06-05 22:57:04 +02001556 let red = 0x29
1557 let green = 0x4a
1558 let blue = 0x6b
1559 let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
1560 call feedkeys(seq, 'Lx!')
1561 call assert_equal(seq, v:termrbgresp)
1562 call assert_equal('dark', &background)
1563
1564 " response to t_RB, 4 digits, light
1565 set background=dark
1566 call test_option_not_set('background')
1567 let red = 0x81
1568 let green = 0x63
Bram Moolenaar66761db2019-06-05 22:07:51 +02001569 let blue = 0x65
1570 let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
1571 call feedkeys(seq, 'Lx!')
1572 call assert_equal(seq, v:termrbgresp)
Bram Moolenaar32e19772019-06-05 22:57:04 +02001573 call assert_equal('light', &background)
Bram Moolenaar66761db2019-06-05 22:07:51 +02001574
Bram Moolenaar32e19772019-06-05 22:57:04 +02001575 " response to t_RB, 2 digits, dark
1576 set background=light
1577 call test_option_not_set('background')
1578 let red = 0x47
1579 let green = 0x59
1580 let blue = 0x5b
Bram Moolenaar66761db2019-06-05 22:07:51 +02001581 let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
1582 call feedkeys(seq, 'Lx!')
1583 call assert_equal(seq, v:termrbgresp)
Bram Moolenaar32e19772019-06-05 22:57:04 +02001584 call assert_equal('dark', &background)
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001585
Bram Moolenaar32e19772019-06-05 22:57:04 +02001586 " response to t_RB, 2 digits, light
1587 set background=dark
1588 call test_option_not_set('background')
1589 let red = 0x83
1590 let green = 0xa4
1591 let blue = 0xc2
1592 let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
1593 call feedkeys(seq, 'Lx!')
1594 call assert_equal(seq, v:termrbgresp)
1595 call assert_equal('light', &background)
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001596
Bram Moolenaar66761db2019-06-05 22:07:51 +02001597 set t_RF= t_RB=
1598endfunc
1599
1600" This only checks if the sequence is recognized.
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001601" This must be after other tests, because it has side effects to xterm
1602" properties.
1603func Test_xx01_term_style_response()
Bram Moolenaar66761db2019-06-05 22:07:51 +02001604 " Termresponse is only parsed when t_RV is not empty.
1605 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001606 call test_override('term_props', 1)
Bram Moolenaar66761db2019-06-05 22:07:51 +02001607
1608 " send the termresponse to trigger requesting the XT codes
1609 let seq = "\<Esc>[>41;337;0c"
1610 call feedkeys(seq, 'Lx!')
1611 call assert_equal(seq, v:termresponse)
1612
1613 let seq = "\<Esc>P1$r2 q\<Esc>\\"
1614 call feedkeys(seq, 'Lx!')
1615 call assert_equal(seq, v:termstyleresp)
1616
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001617 call assert_equal(#{
1618 \ cursor_style: 'u',
1619 \ cursor_blink_mode: 'u',
1620 \ underline_rgb: 'u',
1621 \ mouse: 's'
1622 \ }, terminalprops())
1623
Bram Moolenaar66761db2019-06-05 22:07:51 +02001624 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001625 call test_override('term_props', 0)
Bram Moolenaar66761db2019-06-05 22:07:51 +02001626endfunc
Bram Moolenaarde6dbb42019-06-06 11:59:18 +02001627
Bram Moolenaar89577b32019-10-18 21:26:05 +02001628" This checks the iTerm2 version response.
1629" This must be after other tests, because it has side effects to xterm
1630" properties.
1631func Test_xx02_iTerm2_response()
1632 " Termresponse is only parsed when t_RV is not empty.
1633 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001634 call test_override('term_props', 1)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001635
1636 " Old versions of iTerm2 used a different style term response.
1637 set ttymouse=xterm
1638 call test_option_not_set('ttymouse')
1639 let seq = "\<Esc>[>0;95;c"
1640 call feedkeys(seq, 'Lx!')
1641 call assert_equal(seq, v:termresponse)
1642 call assert_equal('xterm', &ttymouse)
1643
1644 set ttymouse=xterm
1645 call test_option_not_set('ttymouse')
1646 let seq = "\<Esc>[>0;95;0c"
1647 call feedkeys(seq, 'Lx!')
1648 call assert_equal(seq, v:termresponse)
1649 call assert_equal('sgr', &ttymouse)
1650
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001651 call assert_equal(#{
1652 \ cursor_style: 'n',
1653 \ cursor_blink_mode: 'u',
1654 \ underline_rgb: 'u',
1655 \ mouse: 's'
1656 \ }, terminalprops())
1657
Bram Moolenaar89577b32019-10-18 21:26:05 +02001658 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001659 call test_override('term_props', 0)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001660endfunc
1661
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001662" This checks the libvterm version response.
1663" This must be after other tests, because it has side effects to xterm
1664" properties.
Bram Moolenaar89577b32019-10-18 21:26:05 +02001665func Test_xx03_libvterm_response()
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001666 " Termresponse is only parsed when t_RV is not empty.
1667 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001668 call test_override('term_props', 1)
Bram Moolenaar03b00472019-10-14 22:22:03 +02001669
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001670 set ttymouse=xterm
1671 call test_option_not_set('ttymouse')
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001672 let seq = "\<Esc>[>0;100;0c"
1673 call feedkeys(seq, 'Lx!')
1674 call assert_equal(seq, v:termresponse)
1675 call assert_equal('sgr', &ttymouse)
1676
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001677 call assert_equal(#{
1678 \ cursor_style: 'n',
1679 \ cursor_blink_mode: 'u',
1680 \ underline_rgb: 'u',
1681 \ mouse: 's'
1682 \ }, terminalprops())
1683
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001684 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001685 call test_override('term_props', 0)
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001686endfunc
1687
Bram Moolenaar89577b32019-10-18 21:26:05 +02001688" This checks the Mac Terminal.app version response.
1689" This must be after other tests, because it has side effects to xterm
1690" properties.
1691func Test_xx04_Mac_Terminal_response()
1692 " Termresponse is only parsed when t_RV is not empty.
1693 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001694 call test_override('term_props', 1)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001695
1696 set ttymouse=xterm
Bram Moolenaar8dff4cb2020-06-14 14:34:16 +02001697 " t_8u is not reset
1698 let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
Bram Moolenaar89577b32019-10-18 21:26:05 +02001699 call test_option_not_set('ttymouse')
1700 let seq = "\<Esc>[>1;95;0c"
1701 call feedkeys(seq, 'Lx!')
1702 call assert_equal(seq, v:termresponse)
1703 call assert_equal('sgr', &ttymouse)
1704
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001705 call assert_equal(#{
1706 \ cursor_style: 'n',
1707 \ cursor_blink_mode: 'u',
1708 \ underline_rgb: 'y',
1709 \ mouse: 's'
1710 \ }, terminalprops())
Bram Moolenaar8dff4cb2020-06-14 14:34:16 +02001711 call assert_equal("\<Esc>[58;2;%lu;%lu;%lum", &t_8u)
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001712
Bram Moolenaar89577b32019-10-18 21:26:05 +02001713 " Reset is_not_xterm and is_mac_terminal.
1714 set t_RV=
1715 set term=xterm
1716 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001717 call test_override('term_props', 0)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001718endfunc
1719
1720" This checks the mintty version response.
1721" This must be after other tests, because it has side effects to xterm
1722" properties.
1723func Test_xx05_mintty_response()
1724 " Termresponse is only parsed when t_RV is not empty.
1725 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001726 call test_override('term_props', 1)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001727
1728 set ttymouse=xterm
1729 call test_option_not_set('ttymouse')
1730 let seq = "\<Esc>[>77;20905;0c"
1731 call feedkeys(seq, 'Lx!')
1732 call assert_equal(seq, v:termresponse)
1733 call assert_equal('sgr', &ttymouse)
1734
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001735 call assert_equal(#{
1736 \ cursor_style: 'n',
1737 \ cursor_blink_mode: 'u',
1738 \ underline_rgb: 'y',
1739 \ mouse: 's'
1740 \ }, terminalprops())
1741
Bram Moolenaar89577b32019-10-18 21:26:05 +02001742 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001743 call test_override('term_props', 0)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001744endfunc
1745
1746" This checks the screen version response.
1747" This must be after other tests, because it has side effects to xterm
1748" properties.
1749func Test_xx06_screen_response()
1750 " Termresponse is only parsed when t_RV is not empty.
1751 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001752 call test_override('term_props', 1)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001753
1754 " Old versions of screen don't support SGR mouse mode.
1755 set ttymouse=xterm
1756 call test_option_not_set('ttymouse')
1757 let seq = "\<Esc>[>83;40500;0c"
1758 call feedkeys(seq, 'Lx!')
1759 call assert_equal(seq, v:termresponse)
1760 call assert_equal('xterm', &ttymouse)
1761
1762 " screen supports SGR mouse mode starting in version 4.7.
1763 set ttymouse=xterm
1764 call test_option_not_set('ttymouse')
1765 let seq = "\<Esc>[>83;40700;0c"
1766 call feedkeys(seq, 'Lx!')
1767 call assert_equal(seq, v:termresponse)
1768 call assert_equal('sgr', &ttymouse)
1769
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001770 call assert_equal(#{
1771 \ cursor_style: 'n',
1772 \ cursor_blink_mode: 'n',
1773 \ underline_rgb: 'y',
1774 \ mouse: 's'
1775 \ }, terminalprops())
1776
Bram Moolenaar89577b32019-10-18 21:26:05 +02001777 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001778 call test_override('term_props', 0)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001779endfunc
1780
Bram Moolenaar03b00472019-10-14 22:22:03 +02001781" This checks the xterm version response.
1782" This must be after other tests, because it has side effects to xterm
1783" properties.
Bram Moolenaar89577b32019-10-18 21:26:05 +02001784func Test_xx07_xterm_response()
Bram Moolenaar03b00472019-10-14 22:22:03 +02001785 " Termresponse is only parsed when t_RV is not empty.
1786 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001787 call test_override('term_props', 1)
Bram Moolenaar03b00472019-10-14 22:22:03 +02001788
Bram Moolenaar3cea8a92019-10-17 21:55:24 +02001789 " Do Terminal.app first to check that is_mac_terminal is reset.
1790 set ttymouse=xterm
1791 call test_option_not_set('ttymouse')
1792 let seq = "\<Esc>[>1;95;0c"
1793 call feedkeys(seq, 'Lx!')
1794 call assert_equal(seq, v:termresponse)
1795 call assert_equal('sgr', &ttymouse)
1796
Bram Moolenaar03b00472019-10-14 22:22:03 +02001797 " xterm < 95: "xterm" (actually unmodified)
Bram Moolenaar3cea8a92019-10-17 21:55:24 +02001798 set t_RV=
1799 set term=xterm
1800 set t_RV=x
Bram Moolenaar03b00472019-10-14 22:22:03 +02001801 set ttymouse=xterm
1802 call test_option_not_set('ttymouse')
1803 let seq = "\<Esc>[>0;94;0c"
1804 call feedkeys(seq, 'Lx!')
1805 call assert_equal(seq, v:termresponse)
1806 call assert_equal('xterm', &ttymouse)
1807
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001808 call assert_equal(#{
1809 \ cursor_style: 'n',
1810 \ cursor_blink_mode: 'u',
1811 \ underline_rgb: 'y',
1812 \ mouse: 'u'
1813 \ }, terminalprops())
1814
Bram Moolenaar03b00472019-10-14 22:22:03 +02001815 " xterm >= 95 < 277 "xterm2"
1816 set ttymouse=xterm
1817 call test_option_not_set('ttymouse')
1818 let seq = "\<Esc>[>0;267;0c"
1819 call feedkeys(seq, 'Lx!')
1820 call assert_equal(seq, v:termresponse)
1821 call assert_equal('xterm2', &ttymouse)
1822
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001823 call assert_equal(#{
1824 \ cursor_style: 'n',
1825 \ cursor_blink_mode: 'u',
1826 \ underline_rgb: 'u',
1827 \ mouse: '2'
1828 \ }, terminalprops())
1829
Bram Moolenaar03b00472019-10-14 22:22:03 +02001830 " xterm >= 277: "sgr"
1831 set ttymouse=xterm
1832 call test_option_not_set('ttymouse')
1833 let seq = "\<Esc>[>0;277;0c"
1834 call feedkeys(seq, 'Lx!')
1835 call assert_equal(seq, v:termresponse)
1836 call assert_equal('sgr', &ttymouse)
1837
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001838 call assert_equal(#{
1839 \ cursor_style: 'n',
1840 \ cursor_blink_mode: 'u',
1841 \ underline_rgb: 'u',
1842 \ mouse: 's'
1843 \ }, terminalprops())
1844
Bram Moolenaar8dff4cb2020-06-14 14:34:16 +02001845 " xterm >= 279: "sgr" and cursor_style not reset; also check t_8u reset
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001846 set ttymouse=xterm
1847 call test_option_not_set('ttymouse')
Bram Moolenaar8dff4cb2020-06-14 14:34:16 +02001848 let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001849 let seq = "\<Esc>[>0;279;0c"
1850 call feedkeys(seq, 'Lx!')
1851 call assert_equal(seq, v:termresponse)
1852 call assert_equal('sgr', &ttymouse)
1853
1854 call assert_equal(#{
1855 \ cursor_style: 'u',
1856 \ cursor_blink_mode: 'u',
1857 \ underline_rgb: 'u',
1858 \ mouse: 's'
1859 \ }, terminalprops())
Bram Moolenaar8dff4cb2020-06-14 14:34:16 +02001860 call assert_equal('', &t_8u)
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001861
Bram Moolenaar03b00472019-10-14 22:22:03 +02001862 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001863 call test_override('term_props', 0)
Bram Moolenaar03b00472019-10-14 22:22:03 +02001864endfunc
1865
Bram Moolenaarde6dbb42019-06-06 11:59:18 +02001866func Test_get_termcode()
Bram Moolenaareb663282019-10-06 12:02:15 +02001867 try
1868 let k1 = &t_k1
1869 catch /E113/
1870 throw 'Skipped: Unable to query termcodes'
1871 endtry
Bram Moolenaarde6dbb42019-06-06 11:59:18 +02001872 set t_k1=
1873 set t_k1&
1874 call assert_equal(k1, &t_k1)
Bram Moolenaar9aeb3362019-06-06 12:36:15 +02001875
1876 " use external termcap first
1877 set nottybuiltin
1878 set t_k1=
1879 set t_k1&
1880 " when using external termcap may get something else, but it must not be
1881 " empty, since we would fallback to the builtin one.
1882 call assert_notequal('', &t_k1)
1883
1884 if &term =~ 'xterm'
1885 " use internal termcap first
1886 let term_save = &term
1887 let &term = 'builtin_' .. &term
1888 set t_k1=
1889 set t_k1&
1890 call assert_equal(k1, &t_k1)
1891 let &term = term_save
1892 endif
1893
1894 set ttybuiltin
Bram Moolenaarde6dbb42019-06-06 11:59:18 +02001895endfunc
Bram Moolenaar18a79a62019-10-12 15:36:11 +02001896
Bram Moolenaarecd34bf2020-08-04 20:17:31 +02001897func Test_list_builtin_terminals()
Bram Moolenaare46a2ed2020-08-04 21:04:57 +02001898 CheckRunVimInTerminal
Bram Moolenaarecd34bf2020-08-04 20:17:31 +02001899 let buf = RunVimInTerminal('', #{rows: 14})
1900 call term_sendkeys(buf, ":set cmdheight=3\<CR>")
Bram Moolenaar733d2592020-08-20 18:59:06 +02001901 call TermWait(buf, 100)
Bram Moolenaarecd34bf2020-08-04 20:17:31 +02001902 call term_sendkeys(buf, ":set term=xxx\<CR>")
Bram Moolenaar733d2592020-08-20 18:59:06 +02001903 call TermWait(buf, 100)
Bram Moolenaarecd34bf2020-08-04 20:17:31 +02001904 call assert_match('builtin_dumb', term_getline(buf, 11))
1905 call assert_match('Not found in termcap', term_getline(buf, 12))
1906 call StopVimInTerminal(buf)
1907endfunc
1908
Bram Moolenaar18a79a62019-10-12 15:36:11 +02001909func GetEscCodeCSI27(key, modifier)
1910 let key = printf("%d", char2nr(a:key))
1911 let mod = printf("%d", a:modifier)
1912 return "\<Esc>[27;" .. mod .. ';' .. key .. '~'
1913endfunc
1914
1915func GetEscCodeCSIu(key, modifier)
1916 let key = printf("%d", char2nr(a:key))
1917 let mod = printf("%d", a:modifier)
1918 return "\<Esc>[" .. key .. ';' .. mod .. 'u'
1919endfunc
1920
1921" This checks the CSI sequences when in modifyOtherKeys mode.
1922" The mode doesn't need to be enabled, the codes are always detected.
1923func RunTest_modifyOtherKeys(func)
1924 new
Bram Moolenaar459fd782019-10-13 16:43:39 +02001925 set timeoutlen=10
Bram Moolenaar18a79a62019-10-12 15:36:11 +02001926
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001927 " Shift-X is sent as 'X' with the shift modifier
Bram Moolenaar18a79a62019-10-12 15:36:11 +02001928 call feedkeys('a' .. a:func('X', 2) .. "\<Esc>", 'Lx!')
1929 call assert_equal('X', getline(1))
1930
1931 " Ctrl-i is Tab
1932 call setline(1, '')
1933 call feedkeys('a' .. a:func('i', 5) .. "\<Esc>", 'Lx!')
1934 call assert_equal("\t", getline(1))
1935
1936 " Ctrl-I is also Tab
1937 call setline(1, '')
1938 call feedkeys('a' .. a:func('I', 5) .. "\<Esc>", 'Lx!')
1939 call assert_equal("\t", getline(1))
1940
1941 " Alt-x is ø
1942 call setline(1, '')
1943 call feedkeys('a' .. a:func('x', 3) .. "\<Esc>", 'Lx!')
1944 call assert_equal("ø", getline(1))
1945
1946 " Meta-x is also ø
1947 call setline(1, '')
1948 call feedkeys('a' .. a:func('x', 9) .. "\<Esc>", 'Lx!')
1949 call assert_equal("ø", getline(1))
1950
1951 " Alt-X is Ø
1952 call setline(1, '')
1953 call feedkeys('a' .. a:func('X', 3) .. "\<Esc>", 'Lx!')
1954 call assert_equal("Ø", getline(1))
1955
1956 " Meta-X is ø
1957 call setline(1, '')
1958 call feedkeys('a' .. a:func('X', 9) .. "\<Esc>", 'Lx!')
1959 call assert_equal("Ø", getline(1))
1960
Bram Moolenaar828ffd52019-11-21 23:24:00 +01001961 " Ctrl-6 is Ctrl-^
1962 split aaa
1963 edit bbb
1964 call feedkeys(a:func('6', 5), 'Lx!')
1965 call assert_equal("aaa", bufname())
1966 bwipe aaa
1967 bwipe bbb
1968
Bram Moolenaar18a79a62019-10-12 15:36:11 +02001969 bwipe!
1970 set timeoutlen&
1971endfunc
1972
Bram Moolenaar459fd782019-10-13 16:43:39 +02001973func Test_modifyOtherKeys_basic()
Bram Moolenaar18a79a62019-10-12 15:36:11 +02001974 call RunTest_modifyOtherKeys(function('GetEscCodeCSI27'))
Bram Moolenaar18a79a62019-10-12 15:36:11 +02001975 call RunTest_modifyOtherKeys(function('GetEscCodeCSIu'))
1976endfunc
Bram Moolenaard1e2f392019-10-12 18:22:50 +02001977
Bram Moolenaar38571a02019-11-26 14:28:15 +01001978func Test_modifyOtherKeys_no_mapping()
1979 set timeoutlen=10
1980
1981 let @a = 'aaa'
1982 call feedkeys(":let x = '" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a'\<CR>", 'Lx!')
1983 call assert_equal("let x = 'aaa'", @:)
1984
1985 new
1986 call feedkeys("a" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a\<Esc>", 'Lx!')
1987 call assert_equal("aaa", getline(1))
1988 bwipe!
1989
1990 new
1991 call feedkeys("axx\<CR>yy" .. GetEscCodeCSI27('G', 5) .. GetEscCodeCSI27('K', 5) .. "a\<Esc>", 'Lx!')
1992 call assert_equal("axx", getline(1))
1993 call assert_equal("yy", getline(2))
1994 bwipe!
1995
1996 set timeoutlen&
1997endfunc
1998
Bram Moolenaard1e2f392019-10-12 18:22:50 +02001999func RunTest_mapping_shift(key, func)
2000 call setline(1, '')
2001 if a:key == '|'
2002 exe 'inoremap \| xyz'
2003 else
2004 exe 'inoremap ' .. a:key .. ' xyz'
2005 endif
2006 call feedkeys('a' .. a:func(a:key, 2) .. "\<Esc>", 'Lx!')
2007 call assert_equal("xyz", getline(1))
2008 if a:key == '|'
2009 exe 'iunmap \|'
2010 else
2011 exe 'iunmap ' .. a:key
2012 endif
2013endfunc
2014
Bram Moolenaar975a8802020-06-06 22:36:24 +02002015func Test_modifyOtherKeys_mapped()
2016 set timeoutlen=10
2017 imap ' <C-W>
2018 imap <C-W><C-A> c-a
2019 call setline(1, '')
2020
2021 " single quote is turned into single byte CTRL-W
2022 " CTRL-A is added with a separate modifier, and needs to be simplified before
2023 " the mapping can match.
2024 call feedkeys("a'" .. GetEscCodeCSI27('A', 5) .. "\<Esc>", 'Lx!')
2025 call assert_equal('c-a', getline(1))
2026
2027 iunmap '
2028 iunmap <C-W><C-A>
2029 set timeoutlen&
2030endfunc
2031
Bram Moolenaard1e2f392019-10-12 18:22:50 +02002032func RunTest_mapping_works_with_shift(func)
2033 new
Bram Moolenaar459fd782019-10-13 16:43:39 +02002034 set timeoutlen=10
Bram Moolenaard1e2f392019-10-12 18:22:50 +02002035
2036 call RunTest_mapping_shift('@', a:func)
2037 call RunTest_mapping_shift('A', a:func)
2038 call RunTest_mapping_shift('Z', a:func)
2039 call RunTest_mapping_shift('^', a:func)
2040 call RunTest_mapping_shift('_', a:func)
2041 call RunTest_mapping_shift('{', a:func)
2042 call RunTest_mapping_shift('|', a:func)
2043 call RunTest_mapping_shift('}', a:func)
2044 call RunTest_mapping_shift('~', a:func)
2045
2046 bwipe!
2047 set timeoutlen&
2048endfunc
2049
Bram Moolenaar459fd782019-10-13 16:43:39 +02002050func Test_mapping_works_with_shift_plain()
Bram Moolenaard1e2f392019-10-12 18:22:50 +02002051 call RunTest_mapping_works_with_shift(function('GetEscCodeCSI27'))
2052 call RunTest_mapping_works_with_shift(function('GetEscCodeCSIu'))
2053endfunc
Bram Moolenaar459fd782019-10-13 16:43:39 +02002054
2055func RunTest_mapping_mods(map, key, func, code)
2056 call setline(1, '')
2057 exe 'inoremap ' .. a:map .. ' xyz'
2058 call feedkeys('a' .. a:func(a:key, a:code) .. "\<Esc>", 'Lx!')
2059 call assert_equal("xyz", getline(1))
2060 exe 'iunmap ' .. a:map
2061endfunc
2062
2063func RunTest_mapping_works_with_mods(func, mods, code)
2064 new
2065 set timeoutlen=10
2066
2067 if a:mods !~ 'S'
2068 " Shift by itself has no effect
2069 call RunTest_mapping_mods('<' .. a:mods .. '-@>', '@', a:func, a:code)
2070 endif
2071 call RunTest_mapping_mods('<' .. a:mods .. '-A>', 'A', a:func, a:code)
2072 call RunTest_mapping_mods('<' .. a:mods .. '-Z>', 'Z', a:func, a:code)
2073 if a:mods !~ 'S'
2074 " with Shift code is always upper case
2075 call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'a', a:func, a:code)
2076 call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'z', a:func, a:code)
2077 endif
2078 if a:mods != 'A'
2079 " with Alt code is not in upper case
2080 call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'A', a:func, a:code)
2081 call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'Z', a:func, a:code)
2082 endif
2083 call RunTest_mapping_mods('<' .. a:mods .. '-á>', 'á', a:func, a:code)
2084 if a:mods !~ 'S'
2085 " Shift by itself has no effect
2086 call RunTest_mapping_mods('<' .. a:mods .. '-^>', '^', a:func, a:code)
2087 call RunTest_mapping_mods('<' .. a:mods .. '-_>', '_', a:func, a:code)
2088 call RunTest_mapping_mods('<' .. a:mods .. '-{>', '{', a:func, a:code)
2089 call RunTest_mapping_mods('<' .. a:mods .. '-\|>', '|', a:func, a:code)
2090 call RunTest_mapping_mods('<' .. a:mods .. '-}>', '}', a:func, a:code)
2091 call RunTest_mapping_mods('<' .. a:mods .. '-~>', '~', a:func, a:code)
2092 endif
2093
2094 bwipe!
2095 set timeoutlen&
2096endfunc
2097
2098func Test_mapping_works_with_shift()
2099 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S', 2)
2100 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S', 2)
2101endfunc
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01002102
Bram Moolenaar459fd782019-10-13 16:43:39 +02002103func Test_mapping_works_with_ctrl()
2104 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C', 5)
2105 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C', 5)
Bram Moolenaar4e2114e2020-10-07 16:12:37 +02002106
2107 new
2108 set timeoutlen=10
2109
2110 " CTRL-@ actually produces the code for CTRL-2, which is converted
2111 call RunTest_mapping_mods('<C-@>', '2', function('GetEscCodeCSI27'), 5)
2112 call RunTest_mapping_mods('<C-@>', '2', function('GetEscCodeCSIu'), 5)
2113
2114 " CTRL-^ actually produces the code for CTRL-6, which is converted
2115 call RunTest_mapping_mods('<C-^>', '6', function('GetEscCodeCSI27'), 5)
2116 call RunTest_mapping_mods('<C-^>', '6', function('GetEscCodeCSIu'), 5)
2117
2118 " CTRL-_ actually produces the code for CTRL--, which is converted
2119 call RunTest_mapping_mods('<C-_>', '-', function('GetEscCodeCSI27'), 5)
2120 call RunTest_mapping_mods('<C-_>', '-', function('GetEscCodeCSIu'), 5)
2121
2122 bwipe!
2123 set timeoutlen&
Bram Moolenaar459fd782019-10-13 16:43:39 +02002124endfunc
2125
2126func Test_mapping_works_with_shift_ctrl()
2127 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S', 6)
2128 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S', 6)
2129endfunc
2130
2131" Below we also test the "u" code with Alt, This works, but libvterm would not
2132" send the Alt key like this but by prefixing an Esc.
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01002133
Bram Moolenaar459fd782019-10-13 16:43:39 +02002134func Test_mapping_works_with_alt()
2135 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'A', 3)
2136 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'A', 3)
2137endfunc
2138
2139func Test_mapping_works_with_shift_alt()
2140 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S-A', 4)
2141 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S-A', 4)
2142endfunc
2143
Bram Moolenaardaff0fb2020-09-27 13:16:46 +02002144func Test_mapping_works_with_alt_and_shift()
2145 new
2146 set timeoutlen=10
2147
2148 " mapping <A-?> works even though the code is A-S-?
2149 for c in ['!', '$', '+', ':', '?', '^', '~']
2150 call RunTest_mapping_mods('<A-' .. c .. '>', c, function('GetEscCodeCSI27'), 4)
2151 call RunTest_mapping_mods('<A-' .. c .. '>', c, function('GetEscCodeCSIu'), 4)
2152 endfor
2153
2154 bwipe!
2155 set timeoutlen&
2156endfunc
2157
Bram Moolenaar459fd782019-10-13 16:43:39 +02002158func Test_mapping_works_with_ctrl_alt()
2159 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-A', 7)
2160 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-A', 7)
2161endfunc
2162
2163func Test_mapping_works_with_shift_ctrl_alt()
2164 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S-A', 8)
2165 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S-A', 8)
2166endfunc
Bram Moolenaarfc4ea2a2019-11-26 19:33:22 +01002167
2168func Test_insert_literal()
2169 set timeoutlen=10
2170 new
2171 " CTRL-V CTRL-X inserts a ^X
2172 call feedkeys('a' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
2173 call assert_equal("\<C-X>", getline(1))
2174
2175 call setline(1, '')
2176 call feedkeys('a' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
2177 call assert_equal("\<C-X>", getline(1))
2178
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01002179 " CTRL-SHIFT-V CTRL-X inserts escape sequence
Bram Moolenaarfc4ea2a2019-11-26 19:33:22 +01002180 call setline(1, '')
2181 call feedkeys('a' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
2182 call assert_equal("\<Esc>[88;5u", getline(1))
2183
2184 call setline(1, '')
2185 call feedkeys('a' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
2186 call assert_equal("\<Esc>[27;5;88~", getline(1))
2187
2188 bwipe!
2189 set timeoutlen&
2190endfunc
2191
2192func Test_cmdline_literal()
2193 set timeoutlen=10
2194
2195 " CTRL-V CTRL-Y inserts a ^Y
2196 call feedkeys(':' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2197 call assert_equal("\"\<C-Y>", @:)
2198
2199 call feedkeys(':' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2200 call assert_equal("\"\<C-Y>", @:)
2201
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01002202 " CTRL-SHIFT-V CTRL-Y inserts escape sequence
Bram Moolenaarfc4ea2a2019-11-26 19:33:22 +01002203 call feedkeys(':' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2204 call assert_equal("\"\<Esc>[89;5u", @:)
2205
2206 call setline(1, '')
2207 call feedkeys(':' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2208 call assert_equal("\"\<Esc>[27;5;89~", @:)
2209
2210 set timeoutlen&
2211endfunc
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01002212
Bram Moolenaar0ff5ded2020-05-07 18:43:44 +02002213" Test for translation of special key codes (<xF1>, <xF2>, etc.)
2214func Test_Keycode_Tranlsation()
2215 let keycodes = [
2216 \ ["<xUp>", "<Up>"],
2217 \ ["<xDown>", "<Down>"],
2218 \ ["<xLeft>", "<Left>"],
2219 \ ["<xRight>", "<Right>"],
2220 \ ["<xHome>", "<Home>"],
2221 \ ["<xEnd>", "<End>"],
2222 \ ["<zHome>", "<Home>"],
2223 \ ["<zEnd>", "<End>"],
2224 \ ["<xF1>", "<F1>"],
2225 \ ["<xF2>", "<F2>"],
2226 \ ["<xF3>", "<F3>"],
2227 \ ["<xF4>", "<F4>"],
2228 \ ["<S-xF1>", "<S-F1>"],
2229 \ ["<S-xF2>", "<S-F2>"],
2230 \ ["<S-xF3>", "<S-F3>"],
2231 \ ["<S-xF4>", "<S-F4>"]]
2232 for [k1, k2] in keycodes
2233 exe "nnoremap " .. k1 .. " 2wx"
2234 call assert_true(maparg(k1, 'n', 0, 1).lhs == k2)
2235 exe "nunmap " .. k1
2236 endfor
2237endfunc
2238
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01002239" vim: shiftwidth=2 sts=2 expandtab