blob: ef597ada18d4fd2f200740ba069d5b44595c4a62 [file] [log] [blame]
Bram Moolenaar515545e2020-03-22 14:08:59 +01001" Test for modeless selection
2
3" This only works for Unix in a terminal
Bram Moolenaar515545e2020-03-22 14:08:59 +01004CheckNotGui
5CheckUnix
6
Christian Brabandteb380b92025-07-07 20:53:55 +02007source util/mouse.vim
Bram Moolenaar515545e2020-03-22 14:08:59 +01008
9" Test for modeless characterwise selection (single click)
10func Test_modeless_characterwise_selection()
11 CheckFeature clipboard_working
12 let save_mouse = &mouse
13 let save_term = &term
14 let save_ttymouse = &ttymouse
15 call test_override('no_query_mouse', 1)
16 set mouse=a term=xterm mousetime=200
Bram Moolenaarc255b782022-11-26 19:16:48 +000017 call WaitForResponses()
18
Bram Moolenaar515545e2020-03-22 14:08:59 +010019 new
20 call setline(1, ['one two three', 'foo bar baz'])
21 redraw!
22
Bram Moolenaarc255b782022-11-26 19:16:48 +000023 " Wait a bit for any terminal responses to get processed.
24 sleep 50m
25
Bram Moolenaar515545e2020-03-22 14:08:59 +010026 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
27 let msg = 'ttymouse=' .. ttymouse_val
28 exe 'set ttymouse=' .. ttymouse_val
29
30 " select multiple characters within a line
Bram Moolenaar91689ea2020-05-11 22:04:53 +020031 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +010032 call MouseRightClick(1, 1)
33 call MouseRightRelease(1, 1)
34 let keys = ":"
35 let keys ..= MouseLeftClickCode(1, 6)
36 let keys ..= MouseLeftDragCode(1, 10)
37 let keys ..= MouseLeftReleaseCode(1, 10)
38 let keys ..= "\<C-Y>\<CR>"
39 call feedkeys(keys, "x")
40 call assert_equal("wo th", @*, msg)
41
42 " select multiple characters including the end of line
Bram Moolenaar91689ea2020-05-11 22:04:53 +020043 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +010044 call MouseRightClick(1, 1)
45 call MouseRightRelease(1, 1)
46 let keys = ":"
47 let keys ..= MouseLeftClickCode(1, 11)
48 let keys ..= MouseLeftDragCode(1, 16)
49 let keys ..= MouseLeftReleaseCode(1, 16)
50 let keys ..= "\<C-Y>\<CR>"
51 call feedkeys(keys, "x")
52 call assert_equal("ree\n", @*, msg)
53
54 " extend a selection using right mouse click
Bram Moolenaar91689ea2020-05-11 22:04:53 +020055 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +010056 call MouseRightClick(1, 1)
57 call MouseRightRelease(1, 1)
58 set mousemodel=extend
59 let keys = ":"
60 let keys ..= MouseLeftClickCode(1, 2)
61 let keys ..= MouseLeftDragCode(1, 5)
62 let keys ..= MouseLeftReleaseCode(1, 5)
63 let keys ..= MouseRightClickCode(1, 10)
64 let keys ..= MouseRightReleaseCode(1, 10)
65 let keys ..= "\<C-Y>\<CR>"
66 call feedkeys(keys, "x")
67 call assert_equal("ne two th", @*, msg)
68 set mousemodel&
69
70 " extend a selection backwards using right mouse click
Bram Moolenaar91689ea2020-05-11 22:04:53 +020071 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +010072 call MouseRightClick(1, 1)
73 call MouseRightRelease(1, 1)
74 set mousemodel=extend
75 let keys = ":"
76 let keys ..= MouseLeftClickCode(1, 7)
77 let keys ..= MouseLeftDragCode(1, 11)
78 let keys ..= MouseLeftReleaseCode(1, 11)
79 let keys ..= MouseRightClickCode(1, 3)
80 let keys ..= MouseRightReleaseCode(1, 3)
81 let keys ..= "\<C-Y>\<CR>"
82 call feedkeys(keys, "x")
83 call assert_equal("e two thr", @*, msg)
84 set mousemodel&
85
86 " select multiple characters within a line backwards
Bram Moolenaar91689ea2020-05-11 22:04:53 +020087 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +010088 call MouseRightClick(1, 1)
89 call MouseRightRelease(1, 1)
90 let keys = ":"
91 let keys ..= MouseLeftClickCode(1, 9)
92 let keys ..= MouseLeftDragCode(1, 3)
93 let keys ..= MouseLeftReleaseCode(1, 3)
94 let keys ..= "\<C-Y>\<CR>"
95 call feedkeys(keys, "x")
96 call assert_equal("e two t", @*, msg)
97
98 " select multiple characters across lines with (end row > start row) and
99 " (end column < start column)
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200100 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100101 call MouseRightClick(1, 1)
102 call MouseRightRelease(1, 1)
103 let keys = ":"
104 let keys ..= MouseLeftClickCode(1, 9)
105 let keys ..= MouseLeftDragCode(2, 3)
106 let keys ..= MouseLeftReleaseCode(2, 3)
107 let keys ..= "\<C-Y>\<CR>"
108 call feedkeys(keys, "x")
109 call assert_equal("three\nfoo", @*, msg)
110
111 " select multiple characters across lines with (end row > start row) and
112 " (end column > start column)
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200113 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100114 call MouseRightClick(1, 1)
115 call MouseRightRelease(1, 1)
116 let keys = ":"
117 let keys ..= MouseLeftClickCode(1, 4)
118 let keys ..= MouseLeftDragCode(2, 8)
119 let keys ..= MouseLeftReleaseCode(2, 8)
120 let keys ..= "\<C-Y>\<CR>"
121 call feedkeys(keys, "x")
122 call assert_equal(" two three\nfoo bar ", @*, msg)
123
124 " select multiple characters across lines with (end row < start row) and
125 " (end column < start column)
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200126 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100127 call MouseRightClick(1, 1)
128 call MouseRightRelease(1, 1)
129 let keys = ":"
130 let keys ..= MouseLeftClickCode(2, 7)
131 let keys ..= MouseLeftDragCode(1, 5)
132 let keys ..= MouseLeftReleaseCode(1, 5)
133 let keys ..= "\<C-Y>\<CR>"
134 call feedkeys(keys, "x")
135 call assert_equal("two three\nfoo bar", @*, msg)
136
137 " select multiple characters across lines with (end row < start row) and
138 " (end column > start column)
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200139 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100140 call MouseRightClick(1, 1)
141 call MouseRightRelease(1, 1)
142 let keys = ":"
143 let keys ..= MouseLeftClickCode(2, 11)
144 let keys ..= MouseLeftDragCode(1, 13)
145 let keys ..= MouseLeftReleaseCode(1, 13)
146 let keys ..= "\<C-Y>\<CR>"
147 call feedkeys(keys, "x")
148 call assert_equal("e\nfoo bar baz", @*, msg)
149
150 " select multiple characters across lines with (end row < start row) and
151 " the end column is greater than the line length
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200152 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100153 call MouseRightClick(1, 1)
154 call MouseRightRelease(1, 1)
155 let keys = ":"
156 let keys ..= MouseLeftClickCode(2, 7)
157 let keys ..= MouseLeftDragCode(1, 16)
158 let keys ..= MouseLeftReleaseCode(1, 16)
159 let keys ..= "\<C-Y>\<CR>"
160 call feedkeys(keys, "x")
161 call assert_equal("\nfoo bar", @*, msg)
162
163 " select multiple characters across lines with start/end row and start/end
164 " column outside the lines in the buffer
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200165 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100166 call MouseRightClick(1, 1)
167 call MouseRightRelease(1, 1)
168 let keys = ":"
169 let keys ..= MouseLeftClickCode(4, 3)
170 let keys ..= MouseLeftDragCode(3, 2)
171 let keys ..= MouseLeftReleaseCode(3, 2)
172 let keys ..= "\<C-Y>\<CR>"
173 call feedkeys(keys, "x")
174 call assert_equal("\n~ ", @*, msg)
175
176 " change selection using right mouse click within the selected text
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200177 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100178 call MouseRightClick(1, 1)
179 call MouseRightRelease(1, 1)
180 set mousemodel=extend
181 let keys = ":"
182 let keys ..= MouseLeftClickCode(1, 5)
183 let keys ..= MouseLeftDragCode(1, 13)
184 let keys ..= MouseLeftReleaseCode(1, 13)
185 let keys ..= MouseRightClickCode(1, 7)
186 let keys ..= MouseRightReleaseCode(1, 7)
187 let keys ..= MouseRightClickCode(1, 11)
188 let keys ..= MouseRightReleaseCode(1, 11)
189 let keys ..= "\<C-Y>\<CR>"
190 call feedkeys(keys, "x")
191 call assert_equal("o thr", @*, msg)
192 set mousemodel&
193
194 " select text multiple times at different places
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200195 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100196 call MouseRightClick(1, 1)
197 call MouseRightRelease(1, 1)
198 let keys = ":"
199 let keys ..= MouseLeftClickCode(1, 3)
200 let keys ..= MouseLeftDragCode(1, 5)
201 let keys ..= MouseLeftReleaseCode(1, 5)
202 let keys ..= MouseLeftClickCode(2, 7)
203 let keys ..= MouseLeftDragCode(2, 9)
204 let keys ..= MouseLeftReleaseCode(2, 9)
205 let keys ..= "\<C-Y>\<CR>"
206 call feedkeys(keys, "x")
207 call assert_equal("r b", @*, msg)
208
209 " Test for 'clipboard' set to 'autoselectml' to automatically copy the
210 " modeless selection to the clipboard
211 set clipboard=autoselectml
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200212 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100213 let keys = ":"
214 let keys ..= MouseLeftClickCode(2, 5)
215 let keys ..= MouseLeftDragCode(2, 7)
216 let keys ..= MouseLeftReleaseCode(2, 7)
217 let keys ..= "\<CR>"
218 call feedkeys(keys, "x")
219 call assert_equal("bar", @*)
220 set clipboard&
221
222 " quadruple click should start characterwise selectmode
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200223 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100224 call MouseRightClick(1, 1)
225 call MouseRightRelease(1, 1)
226 let keys = ":"
227 let keys ..= MouseLeftClickCode(1, 10)
228 let keys ..= MouseLeftReleaseCode(1, 10)
229 let keys ..= MouseLeftClickCode(1, 10)
230 let keys ..= MouseLeftReleaseCode(1, 10)
231 let keys ..= MouseLeftClickCode(1, 10)
232 let keys ..= MouseLeftReleaseCode(1, 10)
233 let keys ..= MouseLeftClickCode(1, 10)
234 let keys ..= MouseLeftDragCode(1, 11)
235 let keys ..= MouseLeftReleaseCode(1, 11)
236 let keys ..= "\<C-Y>\<CR>"
237 call feedkeys(keys, "x")
238 call assert_equal("hree", @*, msg)
239 endfor
240
241 let &mouse = save_mouse
242 let &term = save_term
243 let &ttymouse = save_ttymouse
244 set mousetime&
245 call test_override('no_query_mouse', 0)
246 close!
247endfunc
248
249" Test for modeless word selection (double click)
250func Test_modeless_word_selection()
251 CheckFeature clipboard_working
252 let save_mouse = &mouse
253 let save_term = &term
254 let save_ttymouse = &ttymouse
255 call test_override('no_query_mouse', 1)
256 set mouse=a term=xterm mousetime=200
Bram Moolenaarc255b782022-11-26 19:16:48 +0000257 call WaitForResponses()
258
Bram Moolenaar515545e2020-03-22 14:08:59 +0100259 new
260 call setline(1, ['one two three', 'foo bar baz'])
261 redraw!
262
263 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
264 let msg = 'ttymouse=' .. ttymouse_val
265 exe 'set ttymouse=' .. ttymouse_val
266
267 " select multiple words within a line
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200268 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100269 call MouseRightClick(1, 1)
270 call MouseRightRelease(1, 1)
271 let keys = ":"
272 let keys ..= MouseLeftClickCode(1, 6)
273 let keys ..= MouseLeftReleaseCode(1, 6)
274 let keys ..= MouseLeftClickCode(1, 6)
275 let keys ..= MouseLeftDragCode(1, 10)
276 let keys ..= MouseLeftReleaseCode(1, 10)
277 let keys ..= "\<C-Y>\<CR>"
278 call feedkeys(keys, "x")
279 call assert_equal("two three", @*, msg)
280
281 " select a single word
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200282 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100283 call MouseRightClick(1, 1)
284 call MouseRightRelease(1, 1)
285 let keys = ":"
286 let keys ..= MouseLeftClickCode(2, 6)
287 let keys ..= MouseLeftReleaseCode(2, 6)
288 let keys ..= MouseLeftClickCode(2, 6)
289 let keys ..= MouseLeftReleaseCode(2, 6)
290 let keys ..= "\<C-Y>\<CR>"
291 call feedkeys(keys, "x")
292 call assert_equal("bar", @*, msg)
293
294 " select multiple words backwards within a line
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200295 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100296 call MouseRightClick(1, 1)
297 call MouseRightRelease(1, 1)
298 let keys = ":"
299 let keys ..= MouseLeftClickCode(2, 11)
300 let keys ..= MouseLeftReleaseCode(2, 11)
301 let keys ..= MouseLeftClickCode(2, 11)
302 let keys ..= MouseLeftDragCode(2, 7)
303 let keys ..= MouseLeftReleaseCode(2, 7)
304 let keys ..= "\<C-Y>\<CR>"
305 call feedkeys(keys, "x")
306 call assert_equal("bar baz", @*, msg)
307
308 " select multiple words backwards across lines
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200309 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100310 call MouseRightClick(1, 1)
311 call MouseRightRelease(1, 1)
312 let keys = ":"
313 let keys ..= MouseLeftClickCode(2, 7)
314 let keys ..= MouseLeftReleaseCode(2, 7)
315 let keys ..= MouseLeftClickCode(2, 7)
316 let keys ..= MouseLeftDragCode(1, 6)
317 let keys ..= MouseLeftReleaseCode(1, 6)
318 let keys ..= "\<C-Y>\<CR>"
319 call feedkeys(keys, "x")
320 call assert_equal("two three\nfoo bar", @*, msg)
321 endfor
322
323 let &mouse = save_mouse
324 let &term = save_term
325 let &ttymouse = save_ttymouse
326 set mousetime&
327 call test_override('no_query_mouse', 0)
328 close!
329endfunc
330
331" Test for modeless line selection (triple click)
332func Test_modeless_line_selection()
333 CheckFeature clipboard_working
334 let save_mouse = &mouse
335 let save_term = &term
336 let save_ttymouse = &ttymouse
337 call test_override('no_query_mouse', 1)
338 set mouse=a term=xterm mousetime=200
Bram Moolenaarc255b782022-11-26 19:16:48 +0000339 call WaitForResponses()
340
Bram Moolenaar515545e2020-03-22 14:08:59 +0100341 new
342 call setline(1, ['one two three', 'foo bar baz'])
343 redraw!
344
345 for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
346 let msg = 'ttymouse=' .. ttymouse_val
347 exe 'set ttymouse=' .. ttymouse_val
348
349 " select single line
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200350 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100351 call MouseRightClick(1, 1)
352 call MouseRightRelease(1, 1)
353 let keys = ":"
354 let keys ..= MouseLeftClickCode(2, 6)
355 let keys ..= MouseLeftReleaseCode(2, 6)
356 let keys ..= MouseLeftClickCode(2, 6)
357 let keys ..= MouseLeftReleaseCode(2, 6)
358 let keys ..= MouseLeftClickCode(2, 6)
359 let keys ..= MouseLeftReleaseCode(2, 6)
360 let keys ..= "\<C-Y>\<CR>"
361 call feedkeys(keys, "x")
362 call assert_equal("foo bar baz\n", @*, msg)
363
364 " select multiple lines
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200365 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100366 call MouseRightClick(1, 1)
367 call MouseRightRelease(1, 1)
368 let keys = ":"
369 let keys ..= MouseLeftClickCode(1, 6)
370 let keys ..= MouseLeftReleaseCode(1, 6)
371 let keys ..= MouseLeftClickCode(1, 6)
372 let keys ..= MouseLeftReleaseCode(1, 6)
373 let keys ..= MouseLeftClickCode(1, 6)
374 let keys ..= MouseLeftDragCode(2, 12)
375 let keys ..= MouseLeftReleaseCode(2, 12)
376 let keys ..= "\<C-Y>\<CR>"
377 call feedkeys(keys, "x")
378 call assert_equal("one two three\nfoo bar baz\n", @*, msg)
379
380 " select multiple lines backwards
Bram Moolenaar91689ea2020-05-11 22:04:53 +0200381 let @* = 'clean'
Bram Moolenaar515545e2020-03-22 14:08:59 +0100382 call MouseRightClick(1, 1)
383 call MouseRightRelease(1, 1)
384 let keys = ":"
385 let keys ..= MouseLeftClickCode(2, 10)
386 let keys ..= MouseLeftReleaseCode(2, 10)
387 let keys ..= MouseLeftClickCode(2, 10)
388 let keys ..= MouseLeftReleaseCode(2, 10)
389 let keys ..= MouseLeftClickCode(2, 10)
390 let keys ..= MouseLeftDragCode(1, 3)
391 let keys ..= MouseLeftReleaseCode(1, 3)
392 let keys ..= "\<C-Y>\<CR>"
393 call feedkeys(keys, "x")
394 call assert_equal("one two three\nfoo bar baz\n", @*, msg)
395 endfor
396
397 let &mouse = save_mouse
398 let &term = save_term
399 let &ttymouse = save_ttymouse
400 set mousetime&
401 call test_override('no_query_mouse', 0)
402 close!
403endfunc
404
405" vim: shiftwidth=2 sts=2 expandtab