blob: 8cab98b778e75ded3b6a63185a0daf6402c6eaee [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
Dominique Pelle923dce22021-11-21 11:36:04 +0000317 " Middle-click in insert mode doesn't move the cursor but inserts the
318 " contents of a register
Bram Moolenaar297bec02020-07-14 22:11:04 +0200319 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
Dominique Pelle923dce22021-11-21 11:36:04 +0000368" Test for using the mouse to increase the height of the cmdline window
Bram Moolenaar297bec02020-07-14 22:11:04 +0200369func 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)
zeertzjq8e0ccb62022-11-01 18:35:27 +0000565 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
zeertzjq8e0ccb62022-11-01 18:35:27 +0000778 " Switch to tab1
779 tabnext
780 let a = split(execute(':tabs'), "\n")
781 call assert_equal(['Tab page 1',
782 \ ' Xtab2',
783 \ 'Tab page 2',
784 \ '> Xtab1'], a, msg)
785
786 " Click in tab2 and drag it to tab1.
787 " This time it is non-current tab.
788 call MouseLeftClick(row, 6)
789 call assert_equal(0, getcharmod(), msg)
790 for col in [7, 8, 9, 10]
791 call MouseLeftDrag(row, col)
792 endfor
793 call MouseLeftRelease(row, col)
794 let a = split(execute(':tabs'), "\n")
795 call assert_equal(['Tab page 1',
796 \ ' Xtab1',
797 \ 'Tab page 2',
798 \ '> Xtab2'], a, msg)
799
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100800 " Click elsewhere so that click in next iteration is not
801 " interpreted as unwanted double-click.
802 call MouseLeftClick(row, 11)
803 call MouseLeftRelease(row, 11)
804
Bram Moolenaare3e38282019-04-15 20:55:31 +0200805 %bwipe!
806 endfor
807
808 let &mouse = save_mouse
809 let &term = save_term
810 let &ttymouse = save_ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200811 call test_override('no_query_mouse', 0)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200812 set mousetime&
813endfunc
814
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200815func Test_term_mouse_double_click_to_create_tab()
Bram Moolenaare3e38282019-04-15 20:55:31 +0200816 let save_mouse = &mouse
817 let save_term = &term
818 let save_ttymouse = &ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200819 call test_override('no_query_mouse', 1)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200820 " Set 'mousetime' to a small value, so that double-click works but we don't
821 " have to wait long to avoid a triple-click.
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100822 set mouse=a term=xterm mousetime=200
Bram Moolenaare3e38282019-04-15 20:55:31 +0200823 let row = 1
824 let col = 10
825
Bram Moolenaar515545e2020-03-22 14:08:59 +0100826 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaar49452192019-04-17 16:27:02 +0200827 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar1ee36d62019-05-01 23:13:56 +0200828 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaare3e38282019-04-15 20:55:31 +0200829 e Xtab1
830 tabnew Xtab2
831
832 let a = split(execute(':tabs'), "\n")
833 call assert_equal(['Tab page 1',
834 \ ' Xtab1',
835 \ 'Tab page 2',
Bram Moolenaar49452192019-04-17 16:27:02 +0200836 \ '> Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200837
838 redraw
839 call MouseLeftClick(row, col)
840 " Check getcharmod() to verify that first click is not
841 " interpreted as a spurious double-click.
Bram Moolenaar49452192019-04-17 16:27:02 +0200842 call assert_equal(0, getcharmod(), msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200843 call MouseLeftRelease(row, col)
844 call MouseLeftClick(row, col)
Bram Moolenaar49452192019-04-17 16:27:02 +0200845 call assert_equal(32, getcharmod(), msg) " double-click
Bram Moolenaare3e38282019-04-15 20:55:31 +0200846 call MouseLeftRelease(row, col)
847 let a = split(execute(':tabs'), "\n")
848 call assert_equal(['Tab page 1',
849 \ ' Xtab1',
850 \ 'Tab page 2',
851 \ '> [No Name]',
852 \ 'Tab page 3',
Bram Moolenaar49452192019-04-17 16:27:02 +0200853 \ ' Xtab2'], a, msg)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200854
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100855 " Click elsewhere so that click in next iteration is not
856 " interpreted as unwanted double click.
857 call MouseLeftClick(row, col + 1)
858 call MouseLeftRelease(row, col + 1)
859
Bram Moolenaare3e38282019-04-15 20:55:31 +0200860 %bwipe!
861 endfor
862
863 let &mouse = save_mouse
864 let &term = save_term
865 let &ttymouse = save_ttymouse
Bram Moolenaar92fd5992019-05-02 23:00:22 +0200866 call test_override('no_query_mouse', 0)
Bram Moolenaare3e38282019-04-15 20:55:31 +0200867 set mousetime&
868endfunc
Bram Moolenaar696d6372019-04-17 16:33:46 +0200869
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100870" Test double/triple/quadruple click in normal mode to visually select.
871func Test_term_mouse_multiple_clicks_to_visually_select()
872 let save_mouse = &mouse
873 let save_term = &term
874 let save_ttymouse = &ttymouse
875 call test_override('no_query_mouse', 1)
Bram Moolenaar2a5c61a2020-12-30 14:59:23 +0100876
877 " 'mousetime' must be sufficiently large, or else the test is flaky when
878 " using a ssh connection with X forwarding; i.e. ssh -X (issue #7563).
879 set mouse=a term=xterm mousetime=600
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100880 new
881
Bram Moolenaar515545e2020-03-22 14:08:59 +0100882 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100883 let msg = 'ttymouse=' .. ttymouse_val
884 exe 'set ttymouse=' .. ttymouse_val
885 call setline(1, ['foo [foo bar] foo', 'foo'])
886
887 " Double-click on word should visually select the word.
888 call MouseLeftClick(1, 2)
889 call assert_equal(0, getcharmod(), msg)
890 call MouseLeftRelease(1, 2)
891 call MouseLeftClick(1, 2)
892 call assert_equal(32, getcharmod(), msg) " double-click
893 call MouseLeftRelease(1, 2)
894 call assert_equal('v', mode(), msg)
895 norm! r1
896 call assert_equal(['111 [foo bar] foo', 'foo'], getline(1, '$'), msg)
897
898 " Double-click on opening square bracket should visually
899 " select the whole [foo bar].
900 call MouseLeftClick(1, 5)
901 call assert_equal(0, getcharmod(), msg)
902 call MouseLeftRelease(1, 5)
903 call MouseLeftClick(1, 5)
904 call assert_equal(32, getcharmod(), msg) " double-click
905 call MouseLeftRelease(1, 5)
906 call assert_equal('v', mode(), msg)
907 norm! r2
908 call assert_equal(['111 222222222 foo', 'foo'], getline(1, '$'), msg)
909
910 " Triple-click should visually select the whole line.
911 call MouseLeftClick(1, 3)
912 call assert_equal(0, getcharmod(), msg)
913 call MouseLeftRelease(1, 3)
914 call MouseLeftClick(1, 3)
915 call assert_equal(32, getcharmod(), msg) " double-click
916 call MouseLeftRelease(1, 3)
917 call MouseLeftClick(1, 3)
918 call assert_equal(64, getcharmod(), msg) " triple-click
919 call MouseLeftRelease(1, 3)
920 call assert_equal('V', mode(), msg)
921 norm! r3
922 call assert_equal(['33333333333333333', 'foo'], getline(1, '$'), msg)
923
924 " Quadruple-click should start visual block select.
925 call MouseLeftClick(1, 2)
926 call assert_equal(0, getcharmod(), msg)
927 call MouseLeftRelease(1, 2)
928 call MouseLeftClick(1, 2)
929 call assert_equal(32, getcharmod(), msg) " double-click
930 call MouseLeftRelease(1, 2)
931 call MouseLeftClick(1, 2)
932 call assert_equal(64, getcharmod(), msg) " triple-click
933 call MouseLeftRelease(1, 2)
934 call MouseLeftClick(1, 2)
935 call assert_equal(96, getcharmod(), msg) " quadruple-click
936 call MouseLeftRelease(1, 2)
937 call assert_equal("\<c-v>", mode(), msg)
938 norm! r4
939 call assert_equal(['34333333333333333', 'foo'], getline(1, '$'), msg)
Bram Moolenaar2764d062020-07-18 12:59:19 +0200940
941 " Double-click on a space character should visually select all the
942 " consecutive space characters.
943 %d
944 call setline(1, ' one two')
945 call MouseLeftClick(1, 2)
946 call MouseLeftRelease(1, 2)
947 call MouseLeftClick(1, 2)
948 call MouseLeftRelease(1, 2)
949 call assert_equal('v', mode(), msg)
950 norm! r1
951 call assert_equal(['1111one two'], getline(1, '$'), msg)
952
953 " Double-click on a word with exclusive selection
954 set selection=exclusive
955 let @" = ''
956 call MouseLeftClick(1, 10)
957 call MouseLeftRelease(1, 10)
958 call MouseLeftClick(1, 10)
959 call MouseLeftRelease(1, 10)
960 norm! y
961 call assert_equal('two', @", msg)
962
963 " Double click to select a block of text with exclusive selection
964 %d
965 call setline(1, 'one (two) three')
966 call MouseLeftClick(1, 5)
967 call MouseLeftRelease(1, 5)
968 call MouseLeftClick(1, 5)
969 call MouseLeftRelease(1, 5)
970 norm! y
971 call assert_equal(5, col("'<"), msg)
972 call assert_equal(10, col("'>"), msg)
973
974 call MouseLeftClick(1, 9)
975 call MouseLeftRelease(1, 9)
976 call MouseLeftClick(1, 9)
977 call MouseLeftRelease(1, 9)
978 norm! y
979 call assert_equal(5, col("'<"), msg)
980 call assert_equal(10, col("'>"), msg)
981 set selection&
982
983 " Click somewhere else so that the clicks above is not combined with the
984 " clicks in the next iteration.
985 call MouseRightClick(3, 10)
986 call MouseRightRelease(3, 10)
Bram Moolenaarf36a2c72019-11-16 18:57:16 +0100987 endfor
988
989 let &mouse = save_mouse
990 let &term = save_term
991 let &ttymouse = save_ttymouse
992 set mousetime&
993 call test_override('no_query_mouse', 0)
994 bwipe!
995endfunc
996
Bram Moolenaar2764d062020-07-18 12:59:19 +0200997" Test for selecting text in visual blockwise mode using Alt-LeftClick
998func Test_mouse_alt_leftclick()
999 let save_mouse = &mouse
1000 let save_term = &term
1001 let save_ttymouse = &ttymouse
1002 call test_override('no_query_mouse', 1)
1003 set mouse=a term=xterm mousetime=200
1004 set mousemodel=popup
1005 new
1006 call setline(1, 'one (two) three')
1007
1008 for ttymouse_val in g:Ttymouse_values
1009 let msg = 'ttymouse=' .. ttymouse_val
1010 exe 'set ttymouse=' .. ttymouse_val
1011
1012 " Left click with the Alt modifier key should extend the selection in
1013 " blockwise visual mode.
1014 let @" = ''
1015 call MouseLeftClick(1, 3)
1016 call MouseLeftRelease(1, 3)
1017 call MouseAltLeftClick(1, 11)
1018 call MouseLeftRelease(1, 11)
1019 call assert_equal("\<C-V>", mode(), msg)
1020 normal! y
1021 call assert_equal('e (two) t', @")
1022 endfor
1023
1024 let &mouse = save_mouse
1025 let &term = save_term
1026 let &ttymouse = save_ttymouse
1027 set mousetime& mousemodel&
1028 call test_override('no_query_mouse', 0)
1029 close!
1030endfunc
1031
Bram Moolenaar696d6372019-04-17 16:33:46 +02001032func Test_xterm_mouse_click_in_fold_columns()
1033 new
1034 let save_mouse = &mouse
1035 let save_term = &term
1036 let save_ttymouse = &ttymouse
1037 let save_foldcolumn = &foldcolumn
Bram Moolenaar2b00b9b2019-04-17 17:08:27 +02001038 set mouse=a term=xterm foldcolumn=3 ttymouse=xterm2
Bram Moolenaar696d6372019-04-17 16:33:46 +02001039
1040 " Create 2 nested folds.
1041 call setline(1, range(1, 7))
1042 2,6fold
1043 norm! zR
1044 4,5fold
1045 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
1046 \ map(range(1, 7), 'foldclosed(v:val)'))
1047
1048 " Click in "+" of inner fold in foldcolumn should open it.
1049 redraw
1050 let row = 4
1051 let col = 2
1052 call MouseLeftClick(row, col)
1053 call MouseLeftRelease(row, col)
1054 call assert_equal([-1, -1, -1, -1, -1, -1, -1],
1055 \ map(range(1, 7), 'foldclosed(v:val)'))
1056
1057 " Click in "-" of outer fold in foldcolumn should close it.
1058 redraw
1059 let row = 2
1060 let col = 1
1061 call MouseLeftClick(row, col)
1062 call MouseLeftRelease(row, col)
1063 call assert_equal([-1, 2, 2, 2, 2, 2, -1],
1064 \ map(range(1, 7), 'foldclosed(v:val)'))
1065 norm! zR
1066
1067 " Click in "|" of inner fold in foldcolumn should close it.
1068 redraw
1069 let row = 5
1070 let col = 2
1071 call MouseLeftClick(row, col)
1072 call MouseLeftRelease(row, col)
1073 call assert_equal([-1, -1, -1, 4, 4, -1, -1],
1074 \ map(range(1, 7), 'foldclosed(v:val)'))
1075
1076 let &foldcolumn = save_foldcolumn
1077 let &ttymouse = save_ttymouse
1078 let &term = save_term
1079 let &mouse = save_mouse
1080 bwipe!
1081endfunc
Bram Moolenaar66761db2019-06-05 22:07:51 +02001082
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001083" Left or right click in Ex command line sets position of the cursor.
1084func Test_term_mouse_click_in_cmdline_to_set_pos()
1085 let save_mouse = &mouse
1086 let save_term = &term
1087 let save_ttymouse = &ttymouse
1088 call test_override('no_query_mouse', 1)
1089 set mouse=a term=xterm
1090 let row = &lines
1091
Bram Moolenaar515545e2020-03-22 14:08:59 +01001092 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaarab505b12020-03-23 19:28:44 +01001093 " When 'ttymouse' is 'xterm2', row/col bigger than 223 are not supported.
1094 if ttymouse_val !=# 'xterm2' || row <= 223
1095 let msg = 'ttymouse=' .. ttymouse_val
1096 exe 'set ttymouse=' .. ttymouse_val
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001097
Bram Moolenaarab505b12020-03-23 19:28:44 +01001098
1099 call feedkeys(':"3456789'
1100 \ .. MouseLeftClickCode(row, 7)
1101 \ .. MouseLeftReleaseCode(row, 7) .. 'L'
1102 \ .. MouseRightClickCode(row, 4)
1103 \ .. MouseRightReleaseCode(row, 4) .. 'R'
1104 \ .. "\<CR>", 'Lx!')
1105 call assert_equal('"3R456L789', @:, msg)
1106 endif
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001107 endfor
1108
1109 let &mouse = save_mouse
1110 let &term = save_term
1111 let &ttymouse = save_ttymouse
1112 set mousetime&
1113 call test_override('no_query_mouse', 0)
1114endfunc
1115
1116" Middle click in command line pastes at position of cursor.
1117func Test_term_mouse_middle_click_in_cmdline_to_paste()
1118 CheckFeature clipboard_working
1119 let save_mouse = &mouse
1120 let save_term = &term
1121 let save_ttymouse = &ttymouse
1122 call test_override('no_query_mouse', 1)
1123 set mouse=a term=xterm
1124 let row = &lines
1125 " Column values does not matter, paste is done at position of cursor.
1126 let col = 1
1127 let @* = 'paste'
1128
Bram Moolenaar515545e2020-03-22 14:08:59 +01001129 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001130 let msg = 'ttymouse=' .. ttymouse_val
1131 exe 'set ttymouse=' .. ttymouse_val
1132
1133 call feedkeys(":\"->"
1134 \ .. MouseMiddleReleaseCode(row, col)
1135 \ .. MouseMiddleClickCode(row, col)
1136 \ .. "<-"
1137 \ .. MouseMiddleReleaseCode(row, col)
1138 \ .. MouseMiddleClickCode(row, col)
1139 \ .. "\<CR>", 'Lx!')
1140 call assert_equal('"->paste<-paste', @:, msg)
1141 endfor
1142
1143 let &mouse = save_mouse
1144 let &term = save_term
1145 let &ttymouse = save_ttymouse
1146 let @* = ''
1147 call test_override('no_query_mouse', 0)
1148endfunc
1149
Bram Moolenaar297bec02020-07-14 22:11:04 +02001150" Test for making sure S-Middlemouse doesn't do anything
1151func Test_term_mouse_shift_middle_click()
1152 new
1153 let save_mouse = &mouse
1154 let save_term = &term
1155 let save_ttymouse = &ttymouse
1156 call test_override('no_query_mouse', 1)
1157 set mouse=a term=xterm ttymouse=xterm2 mousemodel=
1158
1159 call test_setmouse(1, 1)
1160 exe "normal \<S-MiddleMouse>"
1161 call assert_equal([''], getline(1, '$'))
1162 call assert_equal(1, winnr())
1163
1164 let &mouse = save_mouse
1165 let &term = save_term
1166 let &ttymouse = save_ttymouse
1167 set mousemodel&
1168 call test_override('no_query_mouse', 0)
1169 close!
1170endfunc
1171
1172" Test for using mouse in visual mode
1173func Test_term_mouse_visual_mode()
1174 new
1175 let save_mouse = &mouse
1176 let save_term = &term
1177 let save_ttymouse = &ttymouse
1178 call test_override('no_query_mouse', 1)
1179 set term=xterm ttymouse=xterm2
1180
1181 " If visual mode is not present in 'mouse', then left click should not
1182 " do anything in visal mode.
1183 call setline(1, ['one two three four'])
1184 set mouse=nci
1185 call cursor(1, 5)
1186 let @" = ''
1187 call feedkeys("ve"
1188 \ .. MouseLeftClickCode(1, 15) .. MouseLeftReleaseCode(1, 15)
1189 \ .. 'y', 'Lx!')
1190 call assert_equal(5, col('.'))
1191 call assert_equal('two', @")
1192
1193 " Pressing right click in visual mode should change the visual selection
1194 " if 'mousemodel' doesn't contain popup.
1195 " Right click after the visual selection
1196 set mousemodel=
1197 set mouse=a
1198 call test_setmouse(1, 13)
1199 exe "normal 5|ve\<RightMouse>y"
1200 call assert_equal('two three', @")
1201 call assert_equal(5, col('.'))
1202
1203 " Right click before the visual selection
1204 call test_setmouse(1, 9)
1205 exe "normal 15|ve\<RightMouse>y"
1206 call assert_equal('three four', @")
1207 call assert_equal(9, col('.'))
1208
Bram Moolenaar2764d062020-07-18 12:59:19 +02001209 " Right click inside the selection closer to the start of the selection
1210 call test_setmouse(1, 7)
1211 exe "normal 5|vee\<RightMouse>lly"
1212 call assert_equal('three', @")
1213 call assert_equal(9, col('.'))
1214 call assert_equal(9, col("'<"))
1215 call assert_equal(13, col("'>"))
1216
1217 " Right click inside the selection closer to the end of the selection
1218 call test_setmouse(1, 11)
1219 exe "normal 5|vee\<RightMouse>ly"
1220 call assert_equal('two thre', @")
1221 call assert_equal(5, col('.'))
1222 call assert_equal(5, col("'<"))
1223 call assert_equal(12, col("'>"))
1224
dundargocc57b5bc2022-11-02 13:30:51 +00001225 " Multi-line selection. Right click inside the selection.
Bram Moolenaar2764d062020-07-18 12:59:19 +02001226 call setline(1, repeat(['aaaaaa'], 7))
Bram Moolenaar297bec02020-07-14 22:11:04 +02001227 call test_setmouse(3, 1)
1228 exe "normal ggVG\<RightMouse>y"
1229 call assert_equal(3, line("'<"))
Bram Moolenaar2764d062020-07-18 12:59:19 +02001230 call test_setmouse(5, 1)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001231 exe "normal ggVG\<RightMouse>y"
Bram Moolenaar2764d062020-07-18 12:59:19 +02001232 call assert_equal(5, line("'>"))
1233
1234 " Click right in the middle line of the selection
1235 call test_setmouse(4, 3)
1236 exe "normal ggVG$\<RightMouse>y"
1237 call assert_equal(4, line("'<"))
1238 call test_setmouse(4, 4)
1239 exe "normal ggVG$\<RightMouse>y"
Bram Moolenaar297bec02020-07-14 22:11:04 +02001240 call assert_equal(4, line("'>"))
1241
1242 set mousemodel&
1243 let &mouse = save_mouse
1244 let &term = save_term
1245 let &ttymouse = save_ttymouse
1246 call test_override('no_query_mouse', 0)
1247 close!
1248endfunc
1249
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001250" Test for displaying the popup menu using the right mouse click
Bram Moolenaar297bec02020-07-14 22:11:04 +02001251func Test_term_mouse_popup_menu()
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001252 CheckFeature menu
1253 new
1254 call setline(1, 'popup menu test')
1255 let save_mouse = &mouse
1256 let save_term = &term
1257 let save_ttymouse = &ttymouse
1258 let save_mousemodel = &mousemodel
1259 call test_override('no_query_mouse', 1)
1260 set mouse=a term=xterm mousemodel=popup
1261
1262 menu PopUp.foo :let g:menustr = 'foo'<CR>
1263 menu PopUp.bar :let g:menustr = 'bar'<CR>
1264 menu PopUp.baz :let g:menustr = 'baz'<CR>
1265
Bram Moolenaar515545e2020-03-22 14:08:59 +01001266 for ttymouse_val in g:Ttymouse_values
Bram Moolenaar2764d062020-07-18 12:59:19 +02001267 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001268 exe 'set ttymouse=' .. ttymouse_val
1269 let g:menustr = ''
1270 call feedkeys(MouseRightClickCode(1, 4)
1271 \ .. MouseRightReleaseCode(1, 4) .. "\<Down>\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001272 call assert_equal('bar', g:menustr, msg)
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01001273 endfor
1274
1275 unmenu PopUp
1276 let &mouse = save_mouse
1277 let &term = save_term
1278 let &ttymouse = save_ttymouse
1279 let &mousemodel = save_mousemodel
1280 call test_override('no_query_mouse', 0)
1281 close!
1282endfunc
1283
Bram Moolenaar297bec02020-07-14 22:11:04 +02001284" Test for 'mousemodel' set to popup_setpos to move the cursor where the popup
1285" menu is displayed.
1286func Test_term_mouse_popup_menu_setpos()
1287 CheckFeature menu
1288 5new
1289 call setline(1, ['the dish ran away with the spoon',
1290 \ 'the cow jumped over the moon' ])
1291 let save_mouse = &mouse
1292 let save_term = &term
1293 let save_ttymouse = &ttymouse
1294 let save_mousemodel = &mousemodel
1295 call test_override('no_query_mouse', 1)
1296 set mouse=a term=xterm mousemodel=popup_setpos
1297
1298 nmenu PopUp.foo :let g:menustr = 'foo'<CR>
1299 nmenu PopUp.bar :let g:menustr = 'bar'<CR>
1300 nmenu PopUp.baz :let g:menustr = 'baz'<CR>
1301 vmenu PopUp.foo y:<C-U>let g:menustr = 'foo'<CR>
1302 vmenu PopUp.bar y:<C-U>let g:menustr = 'bar'<CR>
1303 vmenu PopUp.baz y:<C-U>let g:menustr = 'baz'<CR>
1304
1305 for ttymouse_val in g:Ttymouse_values
Bram Moolenaar2764d062020-07-18 12:59:19 +02001306 let msg = 'ttymouse=' .. ttymouse_val
Bram Moolenaar297bec02020-07-14 22:11:04 +02001307 exe 'set ttymouse=' .. ttymouse_val
1308 let g:menustr = ''
1309 call cursor(1, 1)
1310 call feedkeys(MouseRightClickCode(1, 5)
1311 \ .. MouseRightReleaseCode(1, 5) .. "\<Down>\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001312 call assert_equal('bar', g:menustr, msg)
1313 call assert_equal([1, 5], [line('.'), col('.')], msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001314
1315 " Test for right click in visual mode inside the selection
1316 let @" = ''
1317 call cursor(1, 10)
1318 call feedkeys('vee' .. MouseRightClickCode(1, 12)
1319 \ .. MouseRightReleaseCode(1, 12) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001320 call assert_equal([1, 10], [line('.'), col('.')], msg)
1321 call assert_equal('ran away', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001322
Yee Cheng Chin17822c52022-10-13 13:17:40 +01001323 " Test for right click in visual mode right before the selection
Bram Moolenaar297bec02020-07-14 22:11:04 +02001324 let @" = ''
1325 call cursor(1, 10)
Yee Cheng Chin17822c52022-10-13 13:17:40 +01001326 call feedkeys('vee' .. MouseRightClickCode(1, 9)
1327 \ .. MouseRightReleaseCode(1, 9) .. "\<Down>\<CR>", "x")
1328 call assert_equal([1, 9], [line('.'), col('.')], msg)
Bram Moolenaar2764d062020-07-18 12:59:19 +02001329 call assert_equal('', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001330
Yee Cheng Chin17822c52022-10-13 13:17:40 +01001331 " Test for right click in visual mode right after the selection
Bram Moolenaar297bec02020-07-14 22:11:04 +02001332 let @" = ''
1333 call cursor(1, 10)
Yee Cheng Chin17822c52022-10-13 13:17:40 +01001334 call feedkeys('vee' .. MouseRightClickCode(1, 18)
1335 \ .. MouseRightReleaseCode(1, 18) .. "\<Down>\<CR>", "x")
1336 call assert_equal([1, 18], [line('.'), col('.')], msg)
Bram Moolenaar2764d062020-07-18 12:59:19 +02001337 call assert_equal('', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001338
1339 " Test for right click in block-wise visual mode inside the selection
1340 let @" = ''
1341 call cursor(1, 16)
1342 call feedkeys("\<C-V>j3l" .. MouseRightClickCode(2, 17)
1343 \ .. MouseRightReleaseCode(2, 17) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001344 call assert_equal([1, 16], [line('.'), col('.')], msg)
1345 call assert_equal("\<C-V>4", getregtype('"'), msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001346
1347 " Test for right click in block-wise visual mode outside the selection
1348 let @" = ''
1349 call cursor(1, 16)
1350 call feedkeys("\<C-V>j3l" .. MouseRightClickCode(2, 2)
1351 \ .. MouseRightReleaseCode(2, 2) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001352 call assert_equal([2, 2], [line('.'), col('.')], msg)
1353 call assert_equal('v', getregtype('"'), msg)
1354 call assert_equal('', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001355
Yee Cheng Chin17822c52022-10-13 13:17:40 +01001356 " Test for right click in line-wise visual mode inside the selection
1357 let @" = ''
1358 call cursor(1, 16)
1359 call feedkeys("V" .. MouseRightClickCode(1, 10)
1360 \ .. MouseRightReleaseCode(1, 10) .. "\<Down>\<CR>", "x")
1361 call assert_equal([1, 1], [line('.'), col('.')], msg) " After yanking, the cursor goes to 1,1
1362 call assert_equal("V", getregtype('"'), msg)
zeertzjqdf63f052022-10-19 15:12:54 +01001363 call assert_equal(1, len(getreg('"', 1, v:true)), msg)
Yee Cheng Chin17822c52022-10-13 13:17:40 +01001364
1365 " Test for right click in multi-line line-wise visual mode inside the selection
1366 let @" = ''
1367 call cursor(1, 16)
1368 call feedkeys("Vj" .. MouseRightClickCode(2, 20)
1369 \ .. MouseRightReleaseCode(2, 20) .. "\<Down>\<CR>", "x")
1370 call assert_equal([1, 1], [line('.'), col('.')], msg) " After yanking, the cursor goes to 1,1
1371 call assert_equal("V", getregtype('"'), msg)
zeertzjqdf63f052022-10-19 15:12:54 +01001372 call assert_equal(2, len(getreg('"', 1, v:true)), msg)
Yee Cheng Chin17822c52022-10-13 13:17:40 +01001373
1374 " Test for right click in line-wise visual mode outside the selection
1375 let @" = ''
1376 call cursor(1, 16)
1377 call feedkeys("V" .. MouseRightClickCode(2, 10)
1378 \ .. MouseRightReleaseCode(2, 10) .. "\<Down>\<CR>", "x")
1379 call assert_equal([2, 10], [line('.'), col('.')], msg)
1380 call assert_equal("", @", msg)
1381
Bram Moolenaar297bec02020-07-14 22:11:04 +02001382 " Try clicking on the status line
1383 let @" = ''
1384 call cursor(1, 10)
1385 call feedkeys('vee' .. MouseRightClickCode(6, 2)
1386 \ .. MouseRightReleaseCode(6, 2) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001387 call assert_equal([1, 10], [line('.'), col('.')], msg)
1388 call assert_equal('ran away', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001389
1390 " Try clicking outside the window
1391 let @" = ''
zeertzjqdf63f052022-10-19 15:12:54 +01001392 call cursor(2, 2)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001393 call feedkeys('vee' .. MouseRightClickCode(7, 2)
1394 \ .. MouseRightReleaseCode(7, 2) .. "\<Down>\<CR>", "x")
Bram Moolenaar2764d062020-07-18 12:59:19 +02001395 call assert_equal(2, winnr(), msg)
1396 call assert_equal('', @", msg)
Bram Moolenaar297bec02020-07-14 22:11:04 +02001397 wincmd w
1398 endfor
1399
1400 unmenu PopUp
1401 let &mouse = save_mouse
1402 let &term = save_term
1403 let &ttymouse = save_ttymouse
1404 let &mousemodel = save_mousemodel
1405 call test_override('no_query_mouse', 0)
1406 close!
1407endfunc
1408
1409" Test for searching for the word under the cursor using Shift-Right or
1410" Shift-Left click.
1411func Test_term_mouse_search()
1412 new
1413 let save_mouse = &mouse
1414 let save_term = &term
1415 let save_ttymouse = &ttymouse
1416 call test_override('no_query_mouse', 1)
1417 set mouse=a term=xterm ttymouse=xterm2
1418 set mousemodel=
1419
1420 " In normal mode, Shift-Left or Shift-Right click should search for the word
1421 " under the cursor.
1422 call setline(1, ['one two three four', 'four three two one'])
1423 call test_setmouse(1, 4)
1424 exe "normal \<S-LeftMouse>"
1425 call assert_equal([2, 12], [line('.'), col('.')])
1426 call test_setmouse(2, 16)
1427 exe "normal \<S-RightMouse>"
1428 call assert_equal([1, 1], [line('.'), col('.')])
1429
1430 " In visual mode, Shift-Left or Shift-Right click should search for the word
1431 " under the cursor and extend the selection.
1432 call test_setmouse(1, 4)
1433 exe "normal 4|ve\<S-LeftMouse>y"
1434 call assert_equal([2, 12], [line("'>"), col("'>")])
1435 call test_setmouse(2, 16)
1436 exe "normal 2G16|ve\<S-RightMouse>y"
1437 call assert_equal([1, 1], [line("'<"), col("'<")])
1438
1439 set mousemodel&
1440 let &mouse = save_mouse
1441 let &term = save_term
1442 let &ttymouse = save_ttymouse
1443 call test_override('no_query_mouse', 0)
1444 close!
1445endfunc
1446
1447" Test for selecting an entry in the quickfix/location list window using the
1448" mouse.
1449func Test_term_mouse_quickfix_window()
1450 let save_mouse = &mouse
1451 let save_term = &term
1452 let save_ttymouse = &ttymouse
1453 call test_override('no_query_mouse', 1)
1454 set mouse=a term=xterm ttymouse=xterm2
1455 set mousemodel=
1456
1457 cgetexpr "Xfile1:1:L1"
1458 copen 5
1459 call test_setmouse(&lines - 7, 1)
1460 exe "normal \<2-LeftMouse>"
1461 call assert_equal('Xfile1', @%)
1462 %bw!
1463
1464 lgetexpr "Xfile2:1:L1"
1465 lopen 5
1466 call test_setmouse(&lines - 7, 1)
1467 exe "normal \<2-LeftMouse>"
1468 call assert_equal('Xfile2', @%)
1469 %bw!
1470
1471 set mousemodel&
1472 let &mouse = save_mouse
1473 let &term = save_term
1474 let &ttymouse = save_ttymouse
1475 call test_override('no_query_mouse', 0)
1476endfunc
1477
Bram Moolenaar2764d062020-07-18 12:59:19 +02001478" Test for the 'h' flag in the 'mouse' option. Using mouse in the help window.
1479func Test_term_mouse_help_window()
1480 let save_mouse = &mouse
1481 let save_term = &term
1482 let save_ttymouse = &ttymouse
1483 call test_override('no_query_mouse', 1)
1484 set mouse=h term=xterm mousetime=200
1485
1486 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
1487 let msg = 'ttymouse=' .. ttymouse_val
1488 exe 'set ttymouse=' .. ttymouse_val
1489 help
1490 let @" = ''
1491 call MouseLeftClick(2, 5)
1492 call MouseLeftRelease(2, 5)
1493 call MouseLeftClick(1, 1)
1494 call MouseLeftDrag(1, 10)
1495 call MouseLeftRelease(1, 10)
1496 norm! y
1497 call assert_equal('*help.txt*', @", msg)
1498 helpclose
1499
1500 " Click somewhere else to make sure the left click above is not combined
1501 " with the next left click and treated as a double click
1502 call MouseRightClick(5, 10)
1503 call MouseRightRelease(5, 10)
1504 endfor
1505
1506 let &mouse = save_mouse
1507 let &term = save_term
1508 let &ttymouse = save_ttymouse
1509 set mousetime&
1510 call test_override('no_query_mouse', 0)
1511 %bw!
1512endfunc
1513
1514" Test for the translation of various mouse terminal codes
1515func Test_mouse_termcodes()
1516 let save_mouse = &mouse
1517 let save_term = &term
1518 let save_ttymouse = &ttymouse
1519 call test_override('no_query_mouse', 1)
1520 set mouse=a term=xterm mousetime=200
1521
1522 new
1523 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec + g:Ttymouse_netterm
1524 let msg = 'ttymouse=' .. ttymouse_val
1525 exe 'set ttymouse=' .. ttymouse_val
1526
1527 let mouse_codes = [
1528 \ ["\<LeftMouse>", "<LeftMouse>"],
1529 \ ["\<MiddleMouse>", "<MiddleMouse>"],
1530 \ ["\<RightMouse>", "<RightMouse>"],
1531 \ ["\<S-LeftMouse>", "<S-LeftMouse>"],
1532 \ ["\<S-MiddleMouse>", "<S-MiddleMouse>"],
1533 \ ["\<S-RightMouse>", "<S-RightMouse>"],
1534 \ ["\<C-LeftMouse>", "<C-LeftMouse>"],
1535 \ ["\<C-MiddleMouse>", "<C-MiddleMouse>"],
1536 \ ["\<C-RightMouse>", "<C-RightMouse>"],
1537 \ ["\<M-LeftMouse>", "<M-LeftMouse>"],
1538 \ ["\<M-MiddleMouse>", "<M-MiddleMouse>"],
1539 \ ["\<M-RightMouse>", "<M-RightMouse>"],
1540 \ ["\<2-LeftMouse>", "<2-LeftMouse>"],
1541 \ ["\<2-MiddleMouse>", "<2-MiddleMouse>"],
1542 \ ["\<2-RightMouse>", "<2-RightMouse>"],
1543 \ ["\<3-LeftMouse>", "<3-LeftMouse>"],
1544 \ ["\<3-MiddleMouse>", "<3-MiddleMouse>"],
1545 \ ["\<3-RightMouse>", "<3-RightMouse>"],
1546 \ ["\<4-LeftMouse>", "<4-LeftMouse>"],
1547 \ ["\<4-MiddleMouse>", "<4-MiddleMouse>"],
1548 \ ["\<4-RightMouse>", "<4-RightMouse>"],
1549 \ ["\<LeftDrag>", "<LeftDrag>"],
1550 \ ["\<MiddleDrag>", "<MiddleDrag>"],
1551 \ ["\<RightDrag>", "<RightDrag>"],
1552 \ ["\<LeftRelease>", "<LeftRelease>"],
1553 \ ["\<MiddleRelease>", "<MiddleRelease>"],
1554 \ ["\<RightRelease>", "<RightRelease>"],
1555 \ ["\<ScrollWheelUp>", "<ScrollWheelUp>"],
1556 \ ["\<S-ScrollWheelUp>", "<S-ScrollWheelUp>"],
1557 \ ["\<C-ScrollWheelUp>", "<C-ScrollWheelUp>"],
1558 \ ["\<ScrollWheelDown>", "<ScrollWheelDown>"],
1559 \ ["\<S-ScrollWheelDown>", "<S-ScrollWheelDown>"],
1560 \ ["\<C-ScrollWheelDown>", "<C-ScrollWheelDown>"],
1561 \ ["\<ScrollWheelLeft>", "<ScrollWheelLeft>"],
1562 \ ["\<S-ScrollWheelLeft>", "<S-ScrollWheelLeft>"],
1563 \ ["\<C-ScrollWheelLeft>", "<C-ScrollWheelLeft>"],
1564 \ ["\<ScrollWheelRight>", "<ScrollWheelRight>"],
1565 \ ["\<S-ScrollWheelRight>", "<S-ScrollWheelRight>"],
1566 \ ["\<C-ScrollWheelRight>", "<C-ScrollWheelRight>"]
1567 \ ]
1568
1569 for [code, outstr] in mouse_codes
1570 exe "normal ggC\<C-K>" . code
1571 call assert_equal(outstr, getline(1), msg)
1572 endfor
1573 endfor
1574
1575 let &mouse = save_mouse
1576 let &term = save_term
1577 let &ttymouse = save_ttymouse
1578 set mousetime&
1579 call test_override('no_query_mouse', 0)
1580 %bw!
1581endfunc
1582
Bram Moolenaar66761db2019-06-05 22:07:51 +02001583" This only checks if the sequence is recognized.
Bram Moolenaar66761db2019-06-05 22:07:51 +02001584func Test_term_rgb_response()
1585 set t_RF=x
1586 set t_RB=y
1587
1588 " response to t_RF, 4 digits
1589 let red = 0x12
1590 let green = 0x34
1591 let blue = 0x56
1592 let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
1593 call feedkeys(seq, 'Lx!')
1594 call assert_equal(seq, v:termrfgresp)
1595
1596 " response to t_RF, 2 digits
1597 let red = 0x78
1598 let green = 0x9a
1599 let blue = 0xbc
1600 let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
1601 call feedkeys(seq, 'Lx!')
1602 call assert_equal(seq, v:termrfgresp)
1603
Bram Moolenaar32e19772019-06-05 22:57:04 +02001604 " response to t_RB, 4 digits, dark
1605 set background=light
Bram Moolenaarce90e362019-09-08 18:58:44 +02001606 eval 'background'->test_option_not_set()
Bram Moolenaar32e19772019-06-05 22:57:04 +02001607 let red = 0x29
1608 let green = 0x4a
1609 let blue = 0x6b
1610 let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
1611 call feedkeys(seq, 'Lx!')
1612 call assert_equal(seq, v:termrbgresp)
1613 call assert_equal('dark', &background)
1614
1615 " response to t_RB, 4 digits, light
1616 set background=dark
1617 call test_option_not_set('background')
1618 let red = 0x81
1619 let green = 0x63
Bram Moolenaar66761db2019-06-05 22:07:51 +02001620 let blue = 0x65
1621 let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
1622 call feedkeys(seq, 'Lx!')
1623 call assert_equal(seq, v:termrbgresp)
Bram Moolenaar32e19772019-06-05 22:57:04 +02001624 call assert_equal('light', &background)
Bram Moolenaar66761db2019-06-05 22:07:51 +02001625
Bram Moolenaar32e19772019-06-05 22:57:04 +02001626 " response to t_RB, 2 digits, dark
1627 set background=light
1628 call test_option_not_set('background')
1629 let red = 0x47
1630 let green = 0x59
1631 let blue = 0x5b
Bram Moolenaar66761db2019-06-05 22:07:51 +02001632 let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
1633 call feedkeys(seq, 'Lx!')
1634 call assert_equal(seq, v:termrbgresp)
Bram Moolenaar32e19772019-06-05 22:57:04 +02001635 call assert_equal('dark', &background)
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001636
Bram Moolenaar32e19772019-06-05 22:57:04 +02001637 " response to t_RB, 2 digits, light
1638 set background=dark
1639 call test_option_not_set('background')
1640 let red = 0x83
1641 let green = 0xa4
1642 let blue = 0xc2
1643 let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
1644 call feedkeys(seq, 'Lx!')
1645 call assert_equal(seq, v:termrbgresp)
1646 call assert_equal('light', &background)
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01001647
Bram Moolenaar66761db2019-06-05 22:07:51 +02001648 set t_RF= t_RB=
1649endfunc
1650
1651" This only checks if the sequence is recognized.
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001652" This must be after other tests, because it has side effects to xterm
1653" properties.
1654func Test_xx01_term_style_response()
Bram Moolenaar66761db2019-06-05 22:07:51 +02001655 " Termresponse is only parsed when t_RV is not empty.
1656 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001657 call test_override('term_props', 1)
Bram Moolenaar66761db2019-06-05 22:07:51 +02001658
1659 " send the termresponse to trigger requesting the XT codes
1660 let seq = "\<Esc>[>41;337;0c"
1661 call feedkeys(seq, 'Lx!')
1662 call assert_equal(seq, v:termresponse)
1663
1664 let seq = "\<Esc>P1$r2 q\<Esc>\\"
1665 call feedkeys(seq, 'Lx!')
1666 call assert_equal(seq, v:termstyleresp)
1667
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001668 call assert_equal(#{
1669 \ cursor_style: 'u',
1670 \ cursor_blink_mode: 'u',
1671 \ underline_rgb: 'u',
Bram Moolenaar4bc85f22022-10-21 14:17:24 +01001672 \ mouse: 's',
1673 \ kitty: 'u',
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001674 \ }, terminalprops())
1675
Bram Moolenaar66761db2019-06-05 22:07:51 +02001676 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001677 call test_override('term_props', 0)
Bram Moolenaar66761db2019-06-05 22:07:51 +02001678endfunc
Bram Moolenaarde6dbb42019-06-06 11:59:18 +02001679
Bram Moolenaar89577b32019-10-18 21:26:05 +02001680" This checks the iTerm2 version response.
1681" This must be after other tests, because it has side effects to xterm
1682" properties.
1683func Test_xx02_iTerm2_response()
1684 " Termresponse is only parsed when t_RV is not empty.
1685 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001686 call test_override('term_props', 1)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001687
1688 " Old versions of iTerm2 used a different style term response.
1689 set ttymouse=xterm
1690 call test_option_not_set('ttymouse')
1691 let seq = "\<Esc>[>0;95;c"
1692 call feedkeys(seq, 'Lx!')
1693 call assert_equal(seq, v:termresponse)
1694 call assert_equal('xterm', &ttymouse)
1695
1696 set ttymouse=xterm
1697 call test_option_not_set('ttymouse')
1698 let seq = "\<Esc>[>0;95;0c"
1699 call feedkeys(seq, 'Lx!')
1700 call assert_equal(seq, v:termresponse)
1701 call assert_equal('sgr', &ttymouse)
1702
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001703 call assert_equal(#{
1704 \ cursor_style: 'n',
1705 \ cursor_blink_mode: 'u',
1706 \ underline_rgb: 'u',
Bram Moolenaar4bc85f22022-10-21 14:17:24 +01001707 \ mouse: 's',
1708 \ kitty: 'u',
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001709 \ }, terminalprops())
1710
Bram Moolenaar89577b32019-10-18 21:26:05 +02001711 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001712 call test_override('term_props', 0)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001713endfunc
1714
Bram Moolenaard55f9ef2022-08-26 12:26:07 +01001715func Run_libvterm_konsole_response(code)
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001716 set ttymouse=xterm
1717 call test_option_not_set('ttymouse')
Bram Moolenaard55f9ef2022-08-26 12:26:07 +01001718 let seq = "\<Esc>[>0;" .. a:code .. ";0c"
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001719 call feedkeys(seq, 'Lx!')
1720 call assert_equal(seq, v:termresponse)
1721 call assert_equal('sgr', &ttymouse)
1722
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001723 call assert_equal(#{
1724 \ cursor_style: 'n',
1725 \ cursor_blink_mode: 'u',
1726 \ underline_rgb: 'u',
Bram Moolenaar4bc85f22022-10-21 14:17:24 +01001727 \ mouse: 's',
1728 \ kitty: 'u',
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001729 \ }, terminalprops())
Bram Moolenaard55f9ef2022-08-26 12:26:07 +01001730endfunc
1731
1732" This checks the libvterm version response.
1733" This must be after other tests, because it has side effects to xterm
1734" properties.
1735func Test_xx03_libvterm_konsole_response()
1736 " Termresponse is only parsed when t_RV is not empty.
1737 set t_RV=x
1738 call test_override('term_props', 1)
1739
1740 " libvterm
1741 call Run_libvterm_konsole_response(100)
1742 " Konsole
1743 call Run_libvterm_konsole_response(115)
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001744
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001745 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001746 call test_override('term_props', 0)
Bram Moolenaar1a4cbb12019-10-12 13:25:44 +02001747endfunc
1748
Bram Moolenaar89577b32019-10-18 21:26:05 +02001749" This checks the Mac Terminal.app version response.
1750" This must be after other tests, because it has side effects to xterm
1751" properties.
1752func Test_xx04_Mac_Terminal_response()
1753 " Termresponse is only parsed when t_RV is not empty.
1754 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001755 call test_override('term_props', 1)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001756
1757 set ttymouse=xterm
Bram Moolenaar8dff4cb2020-06-14 14:34:16 +02001758 " t_8u is not reset
1759 let &t_8u = "\<Esc>[58;2;%lu;%lu;%lum"
Bram Moolenaar89577b32019-10-18 21:26:05 +02001760 call test_option_not_set('ttymouse')
1761 let seq = "\<Esc>[>1;95;0c"
1762 call feedkeys(seq, 'Lx!')
1763 call assert_equal(seq, v:termresponse)
1764 call assert_equal('sgr', &ttymouse)
1765
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001766 call assert_equal(#{
1767 \ cursor_style: 'n',
1768 \ cursor_blink_mode: 'u',
1769 \ underline_rgb: 'y',
Bram Moolenaar4bc85f22022-10-21 14:17:24 +01001770 \ mouse: 's',
1771 \ kitty: 'u',
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001772 \ }, terminalprops())
Bram Moolenaar8dff4cb2020-06-14 14:34:16 +02001773 call assert_equal("\<Esc>[58;2;%lu;%lu;%lum", &t_8u)
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001774
Bram Moolenaar89577b32019-10-18 21:26:05 +02001775 " Reset is_not_xterm and is_mac_terminal.
1776 set t_RV=
1777 set term=xterm
1778 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001779 call test_override('term_props', 0)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001780endfunc
1781
1782" This checks the mintty version response.
1783" This must be after other tests, because it has side effects to xterm
1784" properties.
1785func Test_xx05_mintty_response()
1786 " Termresponse is only parsed when t_RV is not empty.
1787 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001788 call test_override('term_props', 1)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001789
1790 set ttymouse=xterm
1791 call test_option_not_set('ttymouse')
1792 let seq = "\<Esc>[>77;20905;0c"
1793 call feedkeys(seq, 'Lx!')
1794 call assert_equal(seq, v:termresponse)
1795 call assert_equal('sgr', &ttymouse)
1796
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001797 call assert_equal(#{
1798 \ cursor_style: 'n',
1799 \ cursor_blink_mode: 'u',
1800 \ underline_rgb: 'y',
Bram Moolenaar4bc85f22022-10-21 14:17:24 +01001801 \ mouse: 's',
1802 \ kitty: 'u',
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001803 \ }, terminalprops())
1804
Bram Moolenaar89577b32019-10-18 21:26:05 +02001805 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001806 call test_override('term_props', 0)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001807endfunc
1808
1809" This checks the screen version response.
1810" This must be after other tests, because it has side effects to xterm
1811" properties.
1812func Test_xx06_screen_response()
1813 " Termresponse is only parsed when t_RV is not empty.
1814 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001815 call test_override('term_props', 1)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001816
1817 " Old versions of screen don't support SGR mouse mode.
1818 set ttymouse=xterm
1819 call test_option_not_set('ttymouse')
1820 let seq = "\<Esc>[>83;40500;0c"
1821 call feedkeys(seq, 'Lx!')
1822 call assert_equal(seq, v:termresponse)
1823 call assert_equal('xterm', &ttymouse)
1824
1825 " screen supports SGR mouse mode starting in version 4.7.
1826 set ttymouse=xterm
1827 call test_option_not_set('ttymouse')
1828 let seq = "\<Esc>[>83;40700;0c"
1829 call feedkeys(seq, 'Lx!')
1830 call assert_equal(seq, v:termresponse)
1831 call assert_equal('sgr', &ttymouse)
1832
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001833 call assert_equal(#{
1834 \ cursor_style: 'n',
1835 \ cursor_blink_mode: 'n',
1836 \ underline_rgb: 'y',
Bram Moolenaar4bc85f22022-10-21 14:17:24 +01001837 \ mouse: 's',
1838 \ kitty: 'u',
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001839 \ }, terminalprops())
1840
Bram Moolenaar89577b32019-10-18 21:26:05 +02001841 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001842 call test_override('term_props', 0)
Bram Moolenaar89577b32019-10-18 21:26:05 +02001843endfunc
1844
Bram Moolenaard0eaf672022-04-20 19:55:37 +01001845func Do_check_t_8u_set_reset(set_by_user)
1846 set ttymouse=xterm
1847 call test_option_not_set('ttymouse')
1848 let default_value = "\<Esc>[58;2;%lu;%lu;%lum"
1849 let &t_8u = default_value
1850 if !a:set_by_user
1851 call test_option_not_set('t_8u')
1852 endif
1853 let seq = "\<Esc>[>0;279;0c"
1854 call feedkeys(seq, 'Lx!')
1855 call assert_equal(seq, v:termresponse)
1856 call assert_equal('sgr', &ttymouse)
1857
1858 call assert_equal(#{
1859 \ cursor_style: 'u',
1860 \ cursor_blink_mode: 'u',
1861 \ underline_rgb: 'u',
Bram Moolenaar4bc85f22022-10-21 14:17:24 +01001862 \ mouse: 's',
1863 \ kitty: 'u',
Bram Moolenaard0eaf672022-04-20 19:55:37 +01001864 \ }, terminalprops())
1865 call assert_equal(a:set_by_user ? default_value : '', &t_8u)
1866endfunc
1867
Bram Moolenaar03b00472019-10-14 22:22:03 +02001868" This checks the xterm version response.
1869" This must be after other tests, because it has side effects to xterm
1870" properties.
Bram Moolenaar89577b32019-10-18 21:26:05 +02001871func Test_xx07_xterm_response()
Bram Moolenaar03b00472019-10-14 22:22:03 +02001872 " Termresponse is only parsed when t_RV is not empty.
1873 set t_RV=x
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001874 call test_override('term_props', 1)
Bram Moolenaar03b00472019-10-14 22:22:03 +02001875
Bram Moolenaar3cea8a92019-10-17 21:55:24 +02001876 " Do Terminal.app first to check that is_mac_terminal is reset.
1877 set ttymouse=xterm
1878 call test_option_not_set('ttymouse')
1879 let seq = "\<Esc>[>1;95;0c"
1880 call feedkeys(seq, 'Lx!')
1881 call assert_equal(seq, v:termresponse)
1882 call assert_equal('sgr', &ttymouse)
1883
Bram Moolenaar03b00472019-10-14 22:22:03 +02001884 " xterm < 95: "xterm" (actually unmodified)
Bram Moolenaar3cea8a92019-10-17 21:55:24 +02001885 set t_RV=
1886 set term=xterm
1887 set t_RV=x
Bram Moolenaar03b00472019-10-14 22:22:03 +02001888 set ttymouse=xterm
1889 call test_option_not_set('ttymouse')
1890 let seq = "\<Esc>[>0;94;0c"
1891 call feedkeys(seq, 'Lx!')
1892 call assert_equal(seq, v:termresponse)
1893 call assert_equal('xterm', &ttymouse)
1894
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001895 call assert_equal(#{
1896 \ cursor_style: 'n',
1897 \ cursor_blink_mode: 'u',
1898 \ underline_rgb: 'y',
Bram Moolenaar4bc85f22022-10-21 14:17:24 +01001899 \ mouse: 'u',
1900 \ kitty: 'u',
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001901 \ }, terminalprops())
1902
Bram Moolenaar03b00472019-10-14 22:22:03 +02001903 " xterm >= 95 < 277 "xterm2"
1904 set ttymouse=xterm
1905 call test_option_not_set('ttymouse')
1906 let seq = "\<Esc>[>0;267;0c"
1907 call feedkeys(seq, 'Lx!')
1908 call assert_equal(seq, v:termresponse)
1909 call assert_equal('xterm2', &ttymouse)
1910
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001911 call assert_equal(#{
1912 \ cursor_style: 'n',
1913 \ cursor_blink_mode: 'u',
1914 \ underline_rgb: 'u',
Bram Moolenaar4bc85f22022-10-21 14:17:24 +01001915 \ mouse: '2',
1916 \ kitty: 'u',
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001917 \ }, terminalprops())
1918
Bram Moolenaar03b00472019-10-14 22:22:03 +02001919 " xterm >= 277: "sgr"
1920 set ttymouse=xterm
1921 call test_option_not_set('ttymouse')
1922 let seq = "\<Esc>[>0;277;0c"
1923 call feedkeys(seq, 'Lx!')
1924 call assert_equal(seq, v:termresponse)
1925 call assert_equal('sgr', &ttymouse)
1926
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001927 call assert_equal(#{
1928 \ cursor_style: 'n',
1929 \ cursor_blink_mode: 'u',
1930 \ underline_rgb: 'u',
Bram Moolenaar4bc85f22022-10-21 14:17:24 +01001931 \ mouse: 's',
1932 \ kitty: 'u',
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001933 \ }, terminalprops())
1934
Bram Moolenaard0eaf672022-04-20 19:55:37 +01001935 " xterm >= 279: "sgr" and cursor_style not reset; also check t_8u reset,
1936 " except when it was set by the user
1937 call Do_check_t_8u_set_reset(0)
1938 call Do_check_t_8u_set_reset(1)
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001939
Bram Moolenaar03b00472019-10-14 22:22:03 +02001940 set t_RV=
Bram Moolenaar0c0eddd2020-06-13 15:47:25 +02001941 call test_override('term_props', 0)
Bram Moolenaar03b00472019-10-14 22:22:03 +02001942endfunc
1943
Bram Moolenaar4bc85f22022-10-21 14:17:24 +01001944func Test_xx08_kitty_response()
1945 " Termresponse is only parsed when t_RV is not empty.
1946 set t_RV=x
1947 call test_override('term_props', 1)
1948
1949 set ttymouse=xterm
1950 call test_option_not_set('ttymouse')
1951 let seq = "\<Esc>[>1;4001;12c"
1952 call feedkeys(seq, 'Lx!')
1953 call assert_equal(seq, v:termresponse)
1954 call assert_equal('sgr', &ttymouse)
1955
1956 call assert_equal(#{
1957 \ cursor_style: 'u',
1958 \ cursor_blink_mode: 'u',
1959 \ underline_rgb: 'y',
1960 \ mouse: 's',
1961 \ kitty: 'y',
1962 \ }, terminalprops())
1963
1964 set t_RV=
1965 call test_override('term_props', 0)
1966endfunc
1967
Bram Moolenaar92e5df82021-01-30 15:39:47 +01001968func Test_focus_events()
1969 let save_term = &term
1970 let save_ttymouse = &ttymouse
1971 set term=xterm ttymouse=xterm2
1972
1973 au FocusGained * let g:focus_gained += 1
1974 au FocusLost * let g:focus_lost += 1
1975 let g:focus_gained = 0
1976 let g:focus_lost = 0
1977
1978 call feedkeys("\<Esc>[O", "Lx!")
1979 call assert_equal(1, g:focus_lost)
1980 call feedkeys("\<Esc>[I", "Lx!")
1981 call assert_equal(1, g:focus_gained)
1982
1983 " still works when 'ttymouse' is empty
1984 set ttymouse=
1985 call feedkeys("\<Esc>[O", "Lx!")
1986 call assert_equal(2, g:focus_lost)
1987 call feedkeys("\<Esc>[I", "Lx!")
1988 call assert_equal(2, g:focus_gained)
1989
1990 au! FocusGained
1991 au! FocusLost
1992 let &term = save_term
1993 let &ttymouse = save_ttymouse
1994endfunc
1995
Bram Moolenaarde6dbb42019-06-06 11:59:18 +02001996func Test_get_termcode()
Bram Moolenaareb663282019-10-06 12:02:15 +02001997 try
1998 let k1 = &t_k1
1999 catch /E113/
2000 throw 'Skipped: Unable to query termcodes'
2001 endtry
Bram Moolenaarde6dbb42019-06-06 11:59:18 +02002002 set t_k1=
2003 set t_k1&
2004 call assert_equal(k1, &t_k1)
Bram Moolenaar9aeb3362019-06-06 12:36:15 +02002005
2006 " use external termcap first
2007 set nottybuiltin
2008 set t_k1=
2009 set t_k1&
2010 " when using external termcap may get something else, but it must not be
2011 " empty, since we would fallback to the builtin one.
2012 call assert_notequal('', &t_k1)
2013
2014 if &term =~ 'xterm'
2015 " use internal termcap first
2016 let term_save = &term
2017 let &term = 'builtin_' .. &term
2018 set t_k1=
2019 set t_k1&
2020 call assert_equal(k1, &t_k1)
2021 let &term = term_save
2022 endif
2023
2024 set ttybuiltin
Bram Moolenaarde6dbb42019-06-06 11:59:18 +02002025endfunc
Bram Moolenaar18a79a62019-10-12 15:36:11 +02002026
Bram Moolenaarecd34bf2020-08-04 20:17:31 +02002027func Test_list_builtin_terminals()
Bram Moolenaare46a2ed2020-08-04 21:04:57 +02002028 CheckRunVimInTerminal
Bram Moolenaar4654d632022-11-17 22:05:12 +00002029
Bram Moolenaar4d05af02020-11-27 20:55:00 +01002030 call RunVimInTerminal('', #{rows: 14})
2031 call term_sendkeys('', ":set cmdheight=3\<CR>")
2032 call TermWait('', 100)
2033 call term_sendkeys('', ":set term=xxx\<CR>")
2034 call TermWait('', 100)
Bram Moolenaar4654d632022-11-17 22:05:12 +00002035
2036 " Check that the list ends in "builtin_dumb" and "builtin_debug".
2037 let dumb_idx = 0
2038 for n in range(8, 12)
2039 if term_getline('', n) =~ 'builtin_dumb'
2040 let dumb_idx = n
2041 break
2042 endif
2043 endfor
2044 call assert_notequal(0, dumb_idx, 'builtin_dumb not found')
2045
2046 call assert_match('builtin_dumb', term_getline('', dumb_idx))
2047 call assert_match('builtin_debug', term_getline('', dumb_idx + 1))
2048 call assert_match('Not found in termcap', term_getline('', dumb_idx + 2))
2049
Bram Moolenaar4d05af02020-11-27 20:55:00 +01002050 call StopVimInTerminal('')
Bram Moolenaarecd34bf2020-08-04 20:17:31 +02002051endfunc
2052
Bram Moolenaar18a79a62019-10-12 15:36:11 +02002053func GetEscCodeCSI27(key, modifier)
2054 let key = printf("%d", char2nr(a:key))
2055 let mod = printf("%d", a:modifier)
2056 return "\<Esc>[27;" .. mod .. ';' .. key .. '~'
2057endfunc
2058
2059func GetEscCodeCSIu(key, modifier)
2060 let key = printf("%d", char2nr(a:key))
2061 let mod = printf("%d", a:modifier)
2062 return "\<Esc>[" .. key .. ';' .. mod .. 'u'
2063endfunc
2064
Trygve Aabergeb9c09c12022-10-14 12:08:24 +01002065func GetEscCodeCSIuWithoutModifier(key)
2066 let key = printf("%d", char2nr(a:key))
2067 return "\<Esc>[" .. key .. 'u'
2068endfunc
2069
Bram Moolenaar18a79a62019-10-12 15:36:11 +02002070" This checks the CSI sequences when in modifyOtherKeys mode.
2071" The mode doesn't need to be enabled, the codes are always detected.
2072func RunTest_modifyOtherKeys(func)
2073 new
Bram Moolenaar459fd782019-10-13 16:43:39 +02002074 set timeoutlen=10
Bram Moolenaar18a79a62019-10-12 15:36:11 +02002075
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01002076 " Shift-X is sent as 'X' with the shift modifier
Bram Moolenaar18a79a62019-10-12 15:36:11 +02002077 call feedkeys('a' .. a:func('X', 2) .. "\<Esc>", 'Lx!')
2078 call assert_equal('X', getline(1))
2079
2080 " Ctrl-i is Tab
2081 call setline(1, '')
2082 call feedkeys('a' .. a:func('i', 5) .. "\<Esc>", 'Lx!')
2083 call assert_equal("\t", getline(1))
2084
2085 " Ctrl-I is also Tab
2086 call setline(1, '')
2087 call feedkeys('a' .. a:func('I', 5) .. "\<Esc>", 'Lx!')
2088 call assert_equal("\t", getline(1))
2089
2090 " Alt-x is ø
2091 call setline(1, '')
2092 call feedkeys('a' .. a:func('x', 3) .. "\<Esc>", 'Lx!')
2093 call assert_equal("ø", getline(1))
2094
2095 " Meta-x is also ø
2096 call setline(1, '')
2097 call feedkeys('a' .. a:func('x', 9) .. "\<Esc>", 'Lx!')
2098 call assert_equal("ø", getline(1))
2099
2100 " Alt-X is Ø
2101 call setline(1, '')
2102 call feedkeys('a' .. a:func('X', 3) .. "\<Esc>", 'Lx!')
2103 call assert_equal("Ø", getline(1))
2104
2105 " Meta-X is ø
2106 call setline(1, '')
2107 call feedkeys('a' .. a:func('X', 9) .. "\<Esc>", 'Lx!')
2108 call assert_equal("Ø", getline(1))
2109
Bram Moolenaar828ffd52019-11-21 23:24:00 +01002110 " Ctrl-6 is Ctrl-^
2111 split aaa
2112 edit bbb
2113 call feedkeys(a:func('6', 5), 'Lx!')
2114 call assert_equal("aaa", bufname())
2115 bwipe aaa
2116 bwipe bbb
2117
Bram Moolenaar0684e362020-12-03 19:54:42 +01002118 " Ctrl-V X 33 is 3
2119 call setline(1, '')
2120 call feedkeys("a\<C-V>" .. a:func('X', 2) .. "33\<Esc>", 'Lx!')
2121 call assert_equal("3", getline(1))
2122
2123 " Ctrl-V U 12345 is Unicode 12345
2124 call setline(1, '')
2125 call feedkeys("a\<C-V>" .. a:func('U', 2) .. "12345\<Esc>", 'Lx!')
2126 call assert_equal("\U12345", getline(1))
2127
Bram Moolenaar18a79a62019-10-12 15:36:11 +02002128 bwipe!
2129 set timeoutlen&
2130endfunc
2131
Bram Moolenaar459fd782019-10-13 16:43:39 +02002132func Test_modifyOtherKeys_basic()
Bram Moolenaar18a79a62019-10-12 15:36:11 +02002133 call RunTest_modifyOtherKeys(function('GetEscCodeCSI27'))
Bram Moolenaar18a79a62019-10-12 15:36:11 +02002134 call RunTest_modifyOtherKeys(function('GetEscCodeCSIu'))
2135endfunc
Bram Moolenaard1e2f392019-10-12 18:22:50 +02002136
Bram Moolenaar38571a02019-11-26 14:28:15 +01002137func Test_modifyOtherKeys_no_mapping()
2138 set timeoutlen=10
2139
2140 let @a = 'aaa'
2141 call feedkeys(":let x = '" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a'\<CR>", 'Lx!')
2142 call assert_equal("let x = 'aaa'", @:)
2143
2144 new
2145 call feedkeys("a" .. GetEscCodeCSI27('R', 5) .. GetEscCodeCSI27('R', 5) .. "a\<Esc>", 'Lx!')
2146 call assert_equal("aaa", getline(1))
2147 bwipe!
2148
2149 new
2150 call feedkeys("axx\<CR>yy" .. GetEscCodeCSI27('G', 5) .. GetEscCodeCSI27('K', 5) .. "a\<Esc>", 'Lx!')
2151 call assert_equal("axx", getline(1))
2152 call assert_equal("yy", getline(2))
2153 bwipe!
2154
2155 set timeoutlen&
2156endfunc
2157
Trygve Aabergeb9c09c12022-10-14 12:08:24 +01002158func Test_CSIu_keys_without_modifiers()
2159 " Escape sent as `CSI 27 u` should act as normal escape and not undo
2160 call setline(1, 'a')
2161 call feedkeys('a' .. GetEscCodeCSIuWithoutModifier("\e"), 'Lx!')
2162 call assert_equal('n', mode())
2163 call assert_equal('a', getline(1))
2164
2165 " Tab sent as `CSI 9 u` should work
2166 call setline(1, '')
2167 call feedkeys('a' .. GetEscCodeCSIuWithoutModifier("\t") .. "\<Esc>", 'Lx!')
2168 call assert_equal("\t", getline(1))
2169endfunc
2170
Bram Moolenaarc14b57c2021-12-03 13:20:29 +00002171" Check that when DEC mouse codes are recognized a special key is handled.
2172func Test_ignore_dec_mouse()
Dominique Pellef589fd32021-12-05 12:39:21 +00002173 silent !infocmp gnome >/dev/null 2>&1
2174 if v:shell_error != 0
2175 throw 'Skipped: gnome entry missing in the terminfo db'
2176 endif
Bram Moolenaarc14b57c2021-12-03 13:20:29 +00002177
2178 new
2179 let save_mouse = &mouse
2180 let save_term = &term
2181 let save_ttymouse = &ttymouse
2182 call test_override('no_query_mouse', 1)
2183 set mouse=a term=gnome ttymouse=
2184
2185 execute "set <xF1>=\<Esc>[1;*P"
2186 nnoremap <S-F1> agot it<Esc>
2187 call feedkeys("\<Esc>[1;2P", 'Lx!')
2188 call assert_equal('got it', getline(1))
2189
2190 let &mouse = save_mouse
2191 let &term = save_term
2192 let &ttymouse = save_ttymouse
2193 call test_override('no_query_mouse', 0)
2194 bwipe!
2195endfunc
2196
Bram Moolenaard1e2f392019-10-12 18:22:50 +02002197func RunTest_mapping_shift(key, func)
2198 call setline(1, '')
2199 if a:key == '|'
2200 exe 'inoremap \| xyz'
2201 else
2202 exe 'inoremap ' .. a:key .. ' xyz'
2203 endif
2204 call feedkeys('a' .. a:func(a:key, 2) .. "\<Esc>", 'Lx!')
2205 call assert_equal("xyz", getline(1))
2206 if a:key == '|'
2207 exe 'iunmap \|'
2208 else
2209 exe 'iunmap ' .. a:key
2210 endif
2211endfunc
2212
Bram Moolenaar975a8802020-06-06 22:36:24 +02002213func Test_modifyOtherKeys_mapped()
2214 set timeoutlen=10
2215 imap ' <C-W>
2216 imap <C-W><C-A> c-a
2217 call setline(1, '')
2218
2219 " single quote is turned into single byte CTRL-W
2220 " CTRL-A is added with a separate modifier, and needs to be simplified before
2221 " the mapping can match.
2222 call feedkeys("a'" .. GetEscCodeCSI27('A', 5) .. "\<Esc>", 'Lx!')
2223 call assert_equal('c-a', getline(1))
2224
2225 iunmap '
2226 iunmap <C-W><C-A>
2227 set timeoutlen&
2228endfunc
2229
Bram Moolenaar196c3852022-03-04 19:22:36 +00002230func Test_modifyOtherKeys_ambiguous_mapping()
2231 new
2232 set timeoutlen=10
2233 map <C-J> a
2234 map <C-J>x <Nop>
2235 call setline(1, 'x')
2236
2237 " CTRL-J b should have trigger the <C-J> mapping and then insert "b"
2238 call feedkeys(GetEscCodeCSI27('J', 5) .. "b\<Esc>", 'Lx!')
2239 call assert_equal('xb', getline(1))
2240
2241 unmap <C-J>
2242 unmap <C-J>x
Bram Moolenaarf35fd8e2022-03-18 15:41:17 +00002243
2244 " if a special character is following there should be a check for a termcode
2245 nnoremap s aX<Esc>
2246 nnoremap s<BS> aY<Esc>
2247 set t_kb=
2248 call setline(1, 'x')
2249 call feedkeys("s\x08", 'Lx!')
2250 call assert_equal('xY', getline(1))
2251
Bram Moolenaar196c3852022-03-04 19:22:36 +00002252 set timeoutlen&
2253 bwipe!
2254endfunc
2255
Bram Moolenaar749bc952020-10-31 16:33:47 +01002256" Whether Shift-Tab sends "ESC [ Z" or "ESC [ 27 ; 2 ; 9 ~" is unpredictable,
2257" both should work.
2258func Test_modifyOtherKeys_shift_tab()
2259 set timeoutlen=10
2260
2261 call setline(1, '')
2262 call feedkeys("a\<C-K>" .. GetEscCodeCSI27("\t", '2') .. "\<Esc>", 'Lx!')
2263 eval getline(1)->assert_equal('<S-Tab>')
2264
2265 call setline(1, '')
2266 call feedkeys("a\<C-K>\<Esc>[Z\<Esc>", 'Lx!')
2267 eval getline(1)->assert_equal('<S-Tab>')
2268
2269 set timeoutlen&
2270 bwipe!
2271endfunc
2272
Bram Moolenaard1e2f392019-10-12 18:22:50 +02002273func RunTest_mapping_works_with_shift(func)
2274 new
Bram Moolenaar459fd782019-10-13 16:43:39 +02002275 set timeoutlen=10
Bram Moolenaard1e2f392019-10-12 18:22:50 +02002276
2277 call RunTest_mapping_shift('@', a:func)
2278 call RunTest_mapping_shift('A', a:func)
2279 call RunTest_mapping_shift('Z', a:func)
2280 call RunTest_mapping_shift('^', a:func)
2281 call RunTest_mapping_shift('_', a:func)
2282 call RunTest_mapping_shift('{', a:func)
2283 call RunTest_mapping_shift('|', a:func)
2284 call RunTest_mapping_shift('}', a:func)
2285 call RunTest_mapping_shift('~', a:func)
2286
2287 bwipe!
2288 set timeoutlen&
2289endfunc
2290
Bram Moolenaar459fd782019-10-13 16:43:39 +02002291func Test_mapping_works_with_shift_plain()
Bram Moolenaard1e2f392019-10-12 18:22:50 +02002292 call RunTest_mapping_works_with_shift(function('GetEscCodeCSI27'))
2293 call RunTest_mapping_works_with_shift(function('GetEscCodeCSIu'))
2294endfunc
Bram Moolenaar459fd782019-10-13 16:43:39 +02002295
2296func RunTest_mapping_mods(map, key, func, code)
2297 call setline(1, '')
2298 exe 'inoremap ' .. a:map .. ' xyz'
2299 call feedkeys('a' .. a:func(a:key, a:code) .. "\<Esc>", 'Lx!')
2300 call assert_equal("xyz", getline(1))
2301 exe 'iunmap ' .. a:map
2302endfunc
2303
2304func RunTest_mapping_works_with_mods(func, mods, code)
2305 new
2306 set timeoutlen=10
2307
2308 if a:mods !~ 'S'
2309 " Shift by itself has no effect
2310 call RunTest_mapping_mods('<' .. a:mods .. '-@>', '@', a:func, a:code)
2311 endif
2312 call RunTest_mapping_mods('<' .. a:mods .. '-A>', 'A', a:func, a:code)
2313 call RunTest_mapping_mods('<' .. a:mods .. '-Z>', 'Z', a:func, a:code)
2314 if a:mods !~ 'S'
2315 " with Shift code is always upper case
2316 call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'a', a:func, a:code)
2317 call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'z', a:func, a:code)
2318 endif
2319 if a:mods != 'A'
2320 " with Alt code is not in upper case
2321 call RunTest_mapping_mods('<' .. a:mods .. '-a>', 'A', a:func, a:code)
2322 call RunTest_mapping_mods('<' .. a:mods .. '-z>', 'Z', a:func, a:code)
2323 endif
2324 call RunTest_mapping_mods('<' .. a:mods .. '-á>', 'á', a:func, a:code)
2325 if a:mods !~ 'S'
2326 " Shift by itself has no effect
2327 call RunTest_mapping_mods('<' .. a:mods .. '-^>', '^', a:func, a:code)
2328 call RunTest_mapping_mods('<' .. a:mods .. '-_>', '_', a:func, a:code)
2329 call RunTest_mapping_mods('<' .. a:mods .. '-{>', '{', a:func, a:code)
2330 call RunTest_mapping_mods('<' .. a:mods .. '-\|>', '|', a:func, a:code)
2331 call RunTest_mapping_mods('<' .. a:mods .. '-}>', '}', a:func, a:code)
2332 call RunTest_mapping_mods('<' .. a:mods .. '-~>', '~', a:func, a:code)
2333 endif
2334
2335 bwipe!
2336 set timeoutlen&
2337endfunc
2338
2339func Test_mapping_works_with_shift()
2340 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S', 2)
2341 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S', 2)
2342endfunc
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01002343
Bram Moolenaar459fd782019-10-13 16:43:39 +02002344func Test_mapping_works_with_ctrl()
2345 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C', 5)
2346 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C', 5)
Bram Moolenaar4e2114e2020-10-07 16:12:37 +02002347
2348 new
2349 set timeoutlen=10
2350
2351 " CTRL-@ actually produces the code for CTRL-2, which is converted
2352 call RunTest_mapping_mods('<C-@>', '2', function('GetEscCodeCSI27'), 5)
2353 call RunTest_mapping_mods('<C-@>', '2', function('GetEscCodeCSIu'), 5)
2354
2355 " CTRL-^ actually produces the code for CTRL-6, which is converted
2356 call RunTest_mapping_mods('<C-^>', '6', function('GetEscCodeCSI27'), 5)
2357 call RunTest_mapping_mods('<C-^>', '6', function('GetEscCodeCSIu'), 5)
2358
2359 " CTRL-_ actually produces the code for CTRL--, which is converted
2360 call RunTest_mapping_mods('<C-_>', '-', function('GetEscCodeCSI27'), 5)
2361 call RunTest_mapping_mods('<C-_>', '-', function('GetEscCodeCSIu'), 5)
2362
2363 bwipe!
2364 set timeoutlen&
Bram Moolenaar459fd782019-10-13 16:43:39 +02002365endfunc
2366
2367func Test_mapping_works_with_shift_ctrl()
2368 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S', 6)
2369 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S', 6)
Bram Moolenaar9a033d72020-10-07 17:29:48 +02002370
2371 new
2372 set timeoutlen=10
2373
2374 " Ctrl-Shift-[ actually produces CTRL-Shift-{ which is mapped as <C-{>
2375 call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSI27'), 6)
2376 call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSIu'), 6)
2377
2378 " Ctrl-Shift-] actually produces CTRL-Shift-} which is mapped as <C-}>
2379 call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSI27'), 6)
2380 call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSIu'), 6)
2381
2382 " Ctrl-Shift-\ actually produces CTRL-Shift-| which is mapped as <C-|>
2383 call RunTest_mapping_mods('<C-\|>', '|', function('GetEscCodeCSI27'), 6)
2384 call RunTest_mapping_mods('<C-\|>', '|', function('GetEscCodeCSIu'), 6)
2385
2386 bwipe!
2387 set timeoutlen&
Bram Moolenaar459fd782019-10-13 16:43:39 +02002388endfunc
2389
2390" Below we also test the "u" code with Alt, This works, but libvterm would not
2391" send the Alt key like this but by prefixing an Esc.
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01002392
Bram Moolenaar459fd782019-10-13 16:43:39 +02002393func Test_mapping_works_with_alt()
2394 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'A', 3)
2395 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'A', 3)
2396endfunc
2397
2398func Test_mapping_works_with_shift_alt()
2399 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'S-A', 4)
2400 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'S-A', 4)
2401endfunc
2402
Bram Moolenaardaff0fb2020-09-27 13:16:46 +02002403func Test_mapping_works_with_alt_and_shift()
2404 new
2405 set timeoutlen=10
2406
2407 " mapping <A-?> works even though the code is A-S-?
2408 for c in ['!', '$', '+', ':', '?', '^', '~']
2409 call RunTest_mapping_mods('<A-' .. c .. '>', c, function('GetEscCodeCSI27'), 4)
2410 call RunTest_mapping_mods('<A-' .. c .. '>', c, function('GetEscCodeCSIu'), 4)
2411 endfor
2412
2413 bwipe!
2414 set timeoutlen&
2415endfunc
2416
Bram Moolenaar459fd782019-10-13 16:43:39 +02002417func Test_mapping_works_with_ctrl_alt()
2418 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-A', 7)
2419 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-A', 7)
2420endfunc
2421
2422func Test_mapping_works_with_shift_ctrl_alt()
2423 call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S-A', 8)
2424 call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S-A', 8)
2425endfunc
Bram Moolenaarfc4ea2a2019-11-26 19:33:22 +01002426
2427func Test_insert_literal()
2428 set timeoutlen=10
2429 new
2430 " CTRL-V CTRL-X inserts a ^X
2431 call feedkeys('a' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
2432 call assert_equal("\<C-X>", getline(1))
2433
2434 call setline(1, '')
2435 call feedkeys('a' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
2436 call assert_equal("\<C-X>", getline(1))
2437
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01002438 " CTRL-SHIFT-V CTRL-X inserts escape sequence
Bram Moolenaarfc4ea2a2019-11-26 19:33:22 +01002439 call setline(1, '')
2440 call feedkeys('a' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('X', '5') .. "\<Esc>", 'Lx!')
2441 call assert_equal("\<Esc>[88;5u", getline(1))
2442
2443 call setline(1, '')
2444 call feedkeys('a' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('X', '5') .. "\<Esc>", 'Lx!')
2445 call assert_equal("\<Esc>[27;5;88~", getline(1))
2446
2447 bwipe!
2448 set timeoutlen&
2449endfunc
2450
2451func Test_cmdline_literal()
2452 set timeoutlen=10
2453
2454 " CTRL-V CTRL-Y inserts a ^Y
2455 call feedkeys(':' .. GetEscCodeCSIu('V', '5') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2456 call assert_equal("\"\<C-Y>", @:)
2457
2458 call feedkeys(':' .. GetEscCodeCSI27('V', '5') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2459 call assert_equal("\"\<C-Y>", @:)
2460
Bram Moolenaarf19f8d12019-12-18 19:36:23 +01002461 " CTRL-SHIFT-V CTRL-Y inserts escape sequence
Bram Moolenaarfc4ea2a2019-11-26 19:33:22 +01002462 call feedkeys(':' .. GetEscCodeCSIu('V', '6') .. GetEscCodeCSIu('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2463 call assert_equal("\"\<Esc>[89;5u", @:)
2464
2465 call setline(1, '')
2466 call feedkeys(':' .. GetEscCodeCSI27('V', '6') .. GetEscCodeCSI27('Y', '5') .. "\<C-B>\"\<CR>", 'Lx!')
2467 call assert_equal("\"\<Esc>[27;5;89~", @:)
2468
2469 set timeoutlen&
2470endfunc
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01002471
Bram Moolenaarbbf84e22022-03-12 13:48:39 +00002472func Test_mapping_esc()
2473 set timeoutlen=10
2474
2475 new
2476 nnoremap <Up> iHello<Esc>
2477 nnoremap <Esc> <Nop>
2478
2479 call feedkeys(substitute(&t_ku, '\*', '', 'g'), 'Lx!')
2480 call assert_equal("Hello", getline(1))
2481
2482 bwipe!
2483 nunmap <Up>
2484 nunmap <Esc>
2485 set timeoutlen&
2486endfunc
2487
Bram Moolenaar0ff5ded2020-05-07 18:43:44 +02002488" Test for translation of special key codes (<xF1>, <xF2>, etc.)
Bram Moolenaar92e5df82021-01-30 15:39:47 +01002489func Test_Keycode_Translation()
Bram Moolenaar0ff5ded2020-05-07 18:43:44 +02002490 let keycodes = [
2491 \ ["<xUp>", "<Up>"],
2492 \ ["<xDown>", "<Down>"],
2493 \ ["<xLeft>", "<Left>"],
2494 \ ["<xRight>", "<Right>"],
2495 \ ["<xHome>", "<Home>"],
2496 \ ["<xEnd>", "<End>"],
2497 \ ["<zHome>", "<Home>"],
2498 \ ["<zEnd>", "<End>"],
2499 \ ["<xF1>", "<F1>"],
2500 \ ["<xF2>", "<F2>"],
2501 \ ["<xF3>", "<F3>"],
2502 \ ["<xF4>", "<F4>"],
2503 \ ["<S-xF1>", "<S-F1>"],
2504 \ ["<S-xF2>", "<S-F2>"],
2505 \ ["<S-xF3>", "<S-F3>"],
2506 \ ["<S-xF4>", "<S-F4>"]]
2507 for [k1, k2] in keycodes
2508 exe "nnoremap " .. k1 .. " 2wx"
2509 call assert_true(maparg(k1, 'n', 0, 1).lhs == k2)
2510 exe "nunmap " .. k1
2511 endfor
2512endfunc
2513
Bram Moolenaar1f448d92021-03-22 19:37:06 +01002514" Test for terminal keycodes that doesn't have termcap entries
2515func Test_special_term_keycodes()
2516 new
2517 " Test for <xHome>, <S-xHome> and <C-xHome>
2518 " send <K_SPECIAL> <KS_EXTRA> keycode
2519 call feedkeys("i\<C-K>\x80\xfd\x3f\n", 'xt')
2520 " send <K_SPECIAL> <KS_MODIFIER> bitmap <K_SPECIAL> <KS_EXTRA> keycode
2521 call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3f\n", 'xt')
2522 call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3f\n", 'xt')
2523 " Test for <xEnd>, <S-xEnd> and <C-xEnd>
2524 call feedkeys("i\<C-K>\x80\xfd\x3d\n", 'xt')
2525 call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3d\n", 'xt')
2526 call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3d\n", 'xt')
2527 " Test for <zHome>, <S-zHome> and <C-zHome>
2528 call feedkeys("i\<C-K>\x80\xfd\x40\n", 'xt')
2529 call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x40\n", 'xt')
2530 call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x40\n", 'xt')
2531 " Test for <zEnd>, <S-zEnd> and <C-zEnd>
2532 call feedkeys("i\<C-K>\x80\xfd\x3e\n", 'xt')
2533 call feedkeys("i\<C-K>\x80\xfc\x2\x80\xfd\x3e\n", 'xt')
2534 call feedkeys("i\<C-K>\x80\xfc\x4\x80\xfd\x3e\n", 'xt')
2535 " Test for <xUp>, <xDown>, <xLeft> and <xRight>
2536 call feedkeys("i\<C-K>\x80\xfd\x41\n", 'xt')
2537 call feedkeys("i\<C-K>\x80\xfd\x42\n", 'xt')
2538 call feedkeys("i\<C-K>\x80\xfd\x43\n", 'xt')
2539 call feedkeys("i\<C-K>\x80\xfd\x44\n", 'xt')
2540 call assert_equal(['<Home>', '<S-Home>', '<C-Home>',
2541 \ '<End>', '<S-End>', '<C-End>',
2542 \ '<Home>', '<S-Home>', '<C-Home>',
2543 \ '<End>', '<S-End>', '<C-End>',
2544 \ '<Up>', '<Down>', '<Left>', '<Right>', ''], getline(1, '$'))
2545 bw!
2546endfunc
2547
Bram Moolenaar1573e732022-11-16 20:33:21 +00002548func Test_home_key_works()
2549 " The '@' character in K_HOME must only match "1" when followed by ";",
2550 " otherwise this code for Home is not recognized: "<Esc>[1~"
Bram Moolenaar1d8765d2022-11-17 16:43:35 +00002551 " Set termcap values like "xterm" uses them. Except using F2 for xHome,
2552 " because that termcap entry can't be set here.
2553 let save_K1 = exists('&t_K1') ? &t_K1 : ''
2554 let save_kh = exists('&t_kh') ? &t_kh : ''
2555 let save_k2 = exists('&t_k2') ? &t_k2 : ''
2556 let save_k3 = exists('&t_k3') ? &t_k3 : ''
2557 let save_end = exists('&t_@7') ? &t_@7 : ''
2558
Bram Moolenaar1573e732022-11-16 20:33:21 +00002559 let &t_K1 = "\<Esc>[1;*~" " <kHome>
2560 let &t_kh = "\<Esc>[@;*H" " <Home>
Bram Moolenaar1d8765d2022-11-17 16:43:35 +00002561 let &t_k2 = "\<Esc>O*H" " use <F2> for <xHome>
Bram Moolenaar1573e732022-11-16 20:33:21 +00002562 let &t_k3 = "\<Esc>[7;*~" " use <F3> for <zHome>
2563 let &t_@7 = "\<Esc>[@;*F" " <End>
2564
2565 new
2566 call feedkeys("i\<C-K>\<Esc>OH\n\<Esc>", 'tx')
2567 call feedkeys("i\<C-K>\<Esc>[1~\n\<Esc>", 'tx')
2568 call assert_equal([
Bram Moolenaar1d8765d2022-11-17 16:43:35 +00002569 \ '<F2>',
Bram Moolenaar1573e732022-11-16 20:33:21 +00002570 \ '<kHome>',
2571 \ ''], getline(1, '$'))
2572
2573 bwipe!
Bram Moolenaar1573e732022-11-16 20:33:21 +00002574 let &t_K1 = save_K1
Bram Moolenaar1d8765d2022-11-17 16:43:35 +00002575 let &t_kh = save_kh
Bram Moolenaar1573e732022-11-16 20:33:21 +00002576 let &t_k2 = save_k2
2577 let &t_k3 = save_k3
2578 let &t_@7 = save_end
2579endfunc
2580
Bram Moolenaar0f5575d2021-07-30 21:18:03 +02002581func Test_terminal_builtin_without_gui()
2582 CheckNotMSWindows
2583
2584 " builtin_gui should not be output by :set term=xxx
2585 let output = systemlist("TERM=dumb " .. v:progpath .. " --clean -c ':set t_ti= t_te=' -c 'set term=xxx' -c ':q!'")
2586 redraw!
2587 call map(output, {_, val -> trim(val)})
2588 call assert_equal(-1, index(output, 'builtin_gui'))
2589 call assert_notequal(-1, index(output, 'builtin_dumb'))
2590endfunc
2591
2592
Bram Moolenaar0eabd4d2020-03-15 16:13:53 +01002593" vim: shiftwidth=2 sts=2 expandtab