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