blob: 51ef5ae8126ff4dfdf361af504aa5839db3549d0 [file] [log] [blame]
Bram Moolenaar1f3e7d32019-12-06 20:43:36 +01001" Tests for various Visual modes.
Bram Moolenaarc3c766e2017-03-08 22:55:19 +01002
Bram Moolenaard1ad99b2020-10-04 16:16:54 +02003source shared.vim
4
Bram Moolenaar019b9c62016-03-05 17:26:00 +01005func Test_block_shift_multibyte()
Bram Moolenaarf8eb9c52017-01-02 17:31:24 +01006 " Uses double-wide character.
Bram Moolenaar019b9c62016-03-05 17:26:00 +01007 split
8 call setline(1, ['xヹxxx', 'ヹxxx'])
9 exe "normal 1G0l\<C-V>jl>"
10 call assert_equal('x ヹxxx', getline(1))
11 call assert_equal(' ヹxxx', getline(2))
12 q!
13endfunc
Bram Moolenaarf8eb9c52017-01-02 17:31:24 +010014
Bram Moolenaarbae5a172017-08-06 15:42:06 +020015func Test_block_shift_overflow()
16 " This used to cause a multiplication overflow followed by a crash.
17 new
18 normal ii
19 exe "normal \<C-V>876543210>"
20 q!
21endfunc
22
Bram Moolenaarf8eb9c52017-01-02 17:31:24 +010023func Test_dotregister_paste()
24 new
25 exe "norm! ihello world\<esc>"
26 norm! 0ve".p
27 call assert_equal('hello world world', getline(1))
28 q!
29endfunc
Bram Moolenaar23fa81d2017-02-01 21:50:21 +010030
31func Test_Visual_ctrl_o()
32 new
33 call setline(1, ['one', 'two', 'three'])
34 call cursor(1,2)
35 set noshowmode
36 set tw=0
37 call feedkeys("\<c-v>jjlIa\<c-\>\<c-o>:set tw=88\<cr>\<esc>", 'tx')
38 call assert_equal(['oane', 'tawo', 'tahree'], getline(1, 3))
39 call assert_equal(88, &tw)
40 set tw&
41 bw!
42endfu
Bram Moolenaar84b2a382017-02-17 11:40:00 +010043
44func Test_Visual_vapo()
45 new
46 normal oxx
47 normal vapo
48 bwipe!
49endfunc
Bram Moolenaar46522af2017-02-18 23:12:01 +010050
51func Test_Visual_inner_quote()
52 new
53 normal oxX
54 normal vki'
55 bwipe!
56endfunc
Bram Moolenaar75373f32017-08-07 22:02:30 +020057
58" Test for Visual mode not being reset causing E315 error.
59func TriggerTheProblem()
60 " At this point there is no visual selection because :call reset it.
61 " Let's restore the selection:
62 normal gv
63 '<,'>del _
64 try
65 exe "normal \<Esc>"
66 catch /^Vim\%((\a\+)\)\=:E315/
67 echom 'Snap! E315 error!'
Bram Moolenaar63e82db2018-03-06 12:10:48 +010068 let g:msg = 'Snap! E315 error!'
Bram Moolenaar75373f32017-08-07 22:02:30 +020069 endtry
70endfunc
71
72func Test_visual_mode_reset()
Bram Moolenaar75373f32017-08-07 22:02:30 +020073 enew
Bram Moolenaar63e82db2018-03-06 12:10:48 +010074 let g:msg = "Everything's fine."
Bram Moolenaar75373f32017-08-07 22:02:30 +020075 enew
76 setl buftype=nofile
77 call append(line('$'), 'Delete this line.')
78
79 " NOTE: this has to be done by a call to a function because executing :del
80 " the ex-way will require the colon operator which resets the visual mode
81 " thus preventing the problem:
82 exe "normal! GV:call TriggerTheProblem()\<CR>"
83 call assert_equal("Everything's fine.", g:msg)
Bram Moolenaar75373f32017-08-07 22:02:30 +020084endfunc
Bram Moolenaar67418d92017-10-15 22:07:39 +020085
Bram Moolenaar15993ce2017-10-26 20:21:44 +020086" Test for visual block shift and tab characters.
87func Test_block_shift_tab()
Bram Moolenaar3e72dca2021-05-29 16:30:12 +020088 new
Bram Moolenaar15993ce2017-10-26 20:21:44 +020089 call append(0, repeat(['one two three'], 5))
90 call cursor(1,1)
91 exe "normal i\<C-G>u"
92 exe "normal fe\<C-V>4jR\<Esc>ugvr1"
93 call assert_equal('on1 two three', getline(1))
94 call assert_equal('on1 two three', getline(2))
95 call assert_equal('on1 two three', getline(5))
96
Bram Moolenaar3e72dca2021-05-29 16:30:12 +020097 %d _
Bram Moolenaar15993ce2017-10-26 20:21:44 +020098 call append(0, repeat(['abcdefghijklmnopqrstuvwxyz'], 5))
99 call cursor(1,1)
100 exe "normal \<C-V>4jI \<Esc>j<<11|D"
101 exe "normal j7|a\<Tab>\<Tab>"
102 exe "normal j7|a\<Tab>\<Tab> "
103 exe "normal j7|a\<Tab> \<Tab>\<Esc>4k13|\<C-V>4j<"
104 call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1))
105 call assert_equal('abcdefghij', getline(2))
106 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3))
107 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(4))
108 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5))
109
110 %s/\s\+//g
111 call cursor(1,1)
112 exe "normal \<C-V>4jI \<Esc>j<<"
113 exe "normal j7|a\<Tab>\<Tab>"
114 exe "normal j7|a\<Tab>\<Tab>\<Tab>\<Tab>\<Tab>"
115 exe "normal j7|a\<Tab> \<Tab>\<Tab>\<Esc>4k13|\<C-V>4j3<"
116 call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1))
117 call assert_equal('abcdefghij', getline(2))
118 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3))
119 call assert_equal(" abc\<Tab>\<Tab>defghijklmnopqrstuvwxyz", getline(4))
120 call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5))
121
Bram Moolenaar3e72dca2021-05-29 16:30:12 +0200122 " Test for block shift with space characters at the beginning and with
123 " 'noexpandtab' and 'expandtab'
124 %d _
125 call setline(1, [" 1", " 2", " 3"])
126 setlocal shiftwidth=2 noexpandtab
127 exe "normal gg\<C-V>3j>"
128 call assert_equal(["\t1", "\t2", "\t3"], getline(1, '$'))
129 %d _
130 call setline(1, [" 1", " 2", " 3"])
131 setlocal shiftwidth=2 expandtab
132 exe "normal gg\<C-V>3j>"
133 call assert_equal([" 1", " 2", " 3"], getline(1, '$'))
134 setlocal shiftwidth&
135
136 bw!
Bram Moolenaar15993ce2017-10-26 20:21:44 +0200137endfunc
138
139" Tests Blockwise Visual when there are TABs before the text.
140func Test_blockwise_visual()
Bram Moolenaar3e72dca2021-05-29 16:30:12 +0200141 new
Bram Moolenaar15993ce2017-10-26 20:21:44 +0200142 call append(0, ['123456',
143 \ '234567',
144 \ '345678',
145 \ '',
146 \ 'test text test tex start here',
147 \ "\t\tsome text",
148 \ "\t\ttest text",
149 \ 'test text'])
150 call cursor(1,1)
151 exe "normal /start here$\<CR>"
152 exe 'normal "by$' . "\<C-V>jjlld"
153 exe "normal /456$\<CR>"
154 exe "normal \<C-V>jj" . '"bP'
155 call assert_equal(['123start here56',
156 \ '234start here67',
157 \ '345start here78',
158 \ '',
159 \ 'test text test tex rt here',
160 \ "\t\tsomext",
161 \ "\t\ttesext"], getline(1, 7))
162
Bram Moolenaar3e72dca2021-05-29 16:30:12 +0200163 bw!
Bram Moolenaar15993ce2017-10-26 20:21:44 +0200164endfunc
165
Bram Moolenaar2e949762018-05-20 14:06:38 +0200166" Test swapping corners in blockwise visual mode with o and O
167func Test_blockwise_visual_o_O()
Bram Moolenaar3e72dca2021-05-29 16:30:12 +0200168 new
Bram Moolenaar2e949762018-05-20 14:06:38 +0200169
170 exe "norm! 10i.\<Esc>Y4P3lj\<C-V>4l2jr "
171 exe "norm! gvO\<Esc>ra"
172 exe "norm! gvO\<Esc>rb"
173 exe "norm! gvo\<C-c>rc"
174 exe "norm! gvO\<C-c>rd"
Bram Moolenaar1671f442020-03-10 07:48:13 +0100175 set selection=exclusive
176 exe "norm! gvOo\<C-c>re"
177 call assert_equal('...a be.', getline(4))
178 exe "norm! gvOO\<C-c>rf"
179 set selection&
Bram Moolenaar2e949762018-05-20 14:06:38 +0200180
181 call assert_equal(['..........',
182 \ '...c d..',
183 \ '... ..',
Bram Moolenaar1671f442020-03-10 07:48:13 +0100184 \ '...a bf.',
Bram Moolenaar2e949762018-05-20 14:06:38 +0200185 \ '..........'], getline(1, '$'))
186
Bram Moolenaar3e72dca2021-05-29 16:30:12 +0200187 bw!
Bram Moolenaar2e949762018-05-20 14:06:38 +0200188endfun
189
Bram Moolenaar15993ce2017-10-26 20:21:44 +0200190" Test Virtual replace mode.
191func Test_virtual_replace()
Bram Moolenaardf0d24b2018-03-06 14:22:58 +0100192 if exists('&t_kD')
193 let save_t_kD = &t_kD
194 endif
195 if exists('&t_kb')
196 let save_t_kb = &t_kb
197 endif
Bram Moolenaar15993ce2017-10-26 20:21:44 +0200198 exe "set t_kD=\<C-V>x7f t_kb=\<C-V>x08"
199 enew!
200 exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz"
201 call cursor(1,1)
202 set ai bs=2
203 exe "normal gR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR"
204 call assert_equal([' 1',
205 \ ' A',
206 \ ' BCDEFGHIJ',
207 \ ' KL',
208 \ ' MNO',
209 \ ' PQR',
210 \ ], getline(1, 6))
211 normal G
212 mark a
213 exe "normal o0\<C-D>\nabcdefghi\njk\tlmn\n opq\trst\n\<C-D>uvwxyz\n"
214 exe "normal 'ajgR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" . repeat("\<BS>", 29)
215 call assert_equal([' 1',
216 \ 'abcdefghi',
217 \ 'jk lmn',
218 \ ' opq rst',
219 \ 'uvwxyz'], getline(7, 11))
220 normal G
221 exe "normal iab\tcdefghi\tjkl"
222 exe "normal 0gRAB......CDEFGHI.J\<Esc>o"
223 exe "normal iabcdefghijklmnopqrst\<Esc>0gRAB\tIJKLMNO\tQR"
224 call assert_equal(['AB......CDEFGHI.Jkl',
225 \ 'AB IJKLMNO QRst'], getline(12, 13))
Bram Moolenaar845e0ee2020-06-20 16:05:32 +0200226
227 " Test inserting Tab with 'noexpandtab' and 'softabstop' set to 4
228 %d
229 call setline(1, 'aaaaaaaaaaaaa')
230 set softtabstop=4
231 exe "normal gggR\<Tab>\<Tab>x"
232 call assert_equal("\txaaaa", getline(1))
233 set softtabstop&
234
Bram Moolenaar15993ce2017-10-26 20:21:44 +0200235 enew!
Bram Moolenaare7808482018-03-06 13:17:23 +0100236 set noai bs&vim
Bram Moolenaardf0d24b2018-03-06 14:22:58 +0100237 if exists('save_t_kD')
238 let &t_kD = save_t_kD
239 endif
240 if exists('save_t_kb')
241 let &t_kb = save_t_kb
242 endif
Bram Moolenaar63e82db2018-03-06 12:10:48 +0100243endfunc
244
245" Test Virtual replace mode.
246func Test_virtual_replace2()
247 enew!
248 set bs=2
249 exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz"
250 call cursor(1,1)
251 " Test 1: Test that del deletes the newline
252 exe "normal gR0\<del> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR"
253 call assert_equal(['0 1',
254 \ 'A',
255 \ 'BCDEFGHIJ',
256 \ ' KL',
257 \ 'MNO',
258 \ 'PQR',
259 \ ], getline(1, 6))
260 " Test 2:
261 " a newline is not deleted, if no newline has been added in virtual replace mode
262 %d_
263 call setline(1, ['abcd', 'efgh', 'ijkl'])
264 call cursor(2,1)
265 exe "norm! gR1234\<cr>5\<bs>\<bs>\<bs>"
266 call assert_equal(['abcd',
267 \ '123h',
268 \ 'ijkl'], getline(1, '$'))
269 " Test 3:
270 " a newline is deleted, if a newline has been inserted before in virtual replace mode
271 %d_
272 call setline(1, ['abcd', 'efgh', 'ijkl'])
273 call cursor(2,1)
274 exe "norm! gR1234\<cr>\<cr>56\<bs>\<bs>\<bs>"
275 call assert_equal(['abcd',
276 \ '1234',
277 \ 'ijkl'], getline(1, '$'))
278 " Test 4:
279 " delete add a newline, delete it, add it again and check undo
280 %d_
281 call setline(1, ['abcd', 'efgh', 'ijkl'])
282 call cursor(2,1)
283 " break undo sequence explicitly
284 let &ul = &ul
285 exe "norm! gR1234\<cr>\<bs>\<del>56\<cr>"
286 let &ul = &ul
287 call assert_equal(['abcd',
288 \ '123456',
289 \ ''], getline(1, '$'))
290 norm! u
291 call assert_equal(['abcd',
292 \ 'efgh',
293 \ 'ijkl'], getline(1, '$'))
Bram Moolenaarca68ae12020-03-30 19:32:53 +0200294
295 " Test for truncating spaces in a newly added line using 'autoindent' if
296 " characters are not added to that line.
297 %d_
298 call setline(1, [' app', ' bee', ' cat'])
299 setlocal autoindent
300 exe "normal gg$gRt\n\nr"
301 call assert_equal([' apt', '', ' rat'], getline(1, '$'))
302
Bram Moolenaar63e82db2018-03-06 12:10:48 +0100303 " clean up
304 %d_
305 set bs&vim
Bram Moolenaar15993ce2017-10-26 20:21:44 +0200306endfunc
Bram Moolenaar6d3a1942019-01-03 23:10:32 +0100307
Bram Moolenaar81b1ba42019-01-13 16:12:40 +0100308func Test_Visual_word_textobject()
309 new
310 call setline(1, ['First sentence. Second sentence.'])
311
312 " When start and end of visual area are identical, 'aw' or 'iw' select
313 " the whole word.
314 norm! 1go2fcvawy
315 call assert_equal('Second ', @")
316 norm! 1go2fcviwy
317 call assert_equal('Second', @")
318
319 " When start and end of visual area are not identical, 'aw' or 'iw'
320 " extend the word in direction of the end of the visual area.
321 norm! 1go2fcvlawy
322 call assert_equal('cond ', @")
323 norm! gv2awy
324 call assert_equal('cond sentence.', @")
325
326 norm! 1go2fcvliwy
327 call assert_equal('cond', @")
328 norm! gv2iwy
329 call assert_equal('cond sentence', @")
330
331 " Extend visual area in opposite direction.
332 norm! 1go2fcvhawy
333 call assert_equal(' Sec', @")
334 norm! gv2awy
335 call assert_equal(' sentence. Sec', @")
336
337 norm! 1go2fcvhiwy
338 call assert_equal('Sec', @")
339 norm! gv2iwy
340 call assert_equal('. Sec', @")
341
342 bwipe!
343endfunc
344
Bram Moolenaar6d3a1942019-01-03 23:10:32 +0100345func Test_Visual_sentence_textobject()
346 new
Bram Moolenaar81b1ba42019-01-13 16:12:40 +0100347 call setline(1, ['First sentence. Second sentence. Third', 'sentence. Fourth sentence'])
Bram Moolenaar6d3a1942019-01-03 23:10:32 +0100348
349 " When start and end of visual area are identical, 'as' or 'is' select
350 " the whole sentence.
351 norm! 1gofdvasy
352 call assert_equal('Second sentence. ', @")
353 norm! 1gofdvisy
354 call assert_equal('Second sentence.', @")
355
356 " When start and end of visual area are not identical, 'as' or 'is'
357 " extend the sentence in direction of the end of the visual area.
358 norm! 1gofdvlasy
359 call assert_equal('d sentence. ', @")
360 norm! gvasy
361 call assert_equal("d sentence. Third\nsentence. ", @")
362
363 norm! 1gofdvlisy
364 call assert_equal('d sentence.', @")
365 norm! gvisy
366 call assert_equal('d sentence. ', @")
367 norm! gvisy
368 call assert_equal("d sentence. Third\nsentence.", @")
369
370 " Extend visual area in opposite direction.
371 norm! 1gofdvhasy
372 call assert_equal(' Second', @")
373 norm! gvasy
374 call assert_equal("First sentence. Second", @")
375
376 norm! 1gofdvhisy
377 call assert_equal('Second', @")
378 norm! gvisy
379 call assert_equal(' Second', @")
380 norm! gvisy
381 call assert_equal('First sentence. Second', @")
382
383 bwipe!
384endfunc
Bram Moolenaar81b1ba42019-01-13 16:12:40 +0100385
386func Test_Visual_paragraph_textobject()
387 new
Bram Moolenaar8a9bc952020-10-02 18:48:07 +0200388 let lines =<< trim [END]
389 First line.
390
391 Second line.
392 Third line.
393 Fourth line.
394 Fifth line.
395
396 Sixth line.
397 [END]
398 call setline(1, lines)
Bram Moolenaar81b1ba42019-01-13 16:12:40 +0100399
400 " When start and end of visual area are identical, 'ap' or 'ip' select
401 " the whole paragraph.
402 norm! 4ggvapy
403 call assert_equal("Second line.\nThird line.\nFourth line.\nFifth line.\n\n", @")
404 norm! 4ggvipy
405 call assert_equal("Second line.\nThird line.\nFourth line.\nFifth line.\n", @")
406
407 " When start and end of visual area are not identical, 'ap' or 'ip'
408 " extend the sentence in direction of the end of the visual area.
409 " FIXME: actually, it is not sufficient to have different start and
410 " end of visual selection, the start line and end line have to differ,
411 " which is not consistent with the documentation.
412 norm! 4ggVjapy
413 call assert_equal("Third line.\nFourth line.\nFifth line.\n\n", @")
414 norm! gvapy
415 call assert_equal("Third line.\nFourth line.\nFifth line.\n\nSixth line.\n", @")
416 norm! 4ggVjipy
417 call assert_equal("Third line.\nFourth line.\nFifth line.\n", @")
418 norm! gvipy
419 call assert_equal("Third line.\nFourth line.\nFifth line.\n\n", @")
420 norm! gvipy
421 call assert_equal("Third line.\nFourth line.\nFifth line.\n\nSixth line.\n", @")
422
423 " Extend visual area in opposite direction.
424 norm! 5ggVkapy
425 call assert_equal("\nSecond line.\nThird line.\nFourth line.\n", @")
426 norm! gvapy
427 call assert_equal("First line.\n\nSecond line.\nThird line.\nFourth line.\n", @")
428 norm! 5ggVkipy
429 call assert_equal("Second line.\nThird line.\nFourth line.\n", @")
430 norma gvipy
431 call assert_equal("\nSecond line.\nThird line.\nFourth line.\n", @")
432 norm! gvipy
433 call assert_equal("First line.\n\nSecond line.\nThird line.\nFourth line.\n", @")
434
435 bwipe!
436endfunc
Bram Moolenaar19a66852019-03-07 11:25:32 +0100437
438func Test_curswant_not_changed()
439 new
440 call setline(1, ['one', 'two'])
441 au InsertLeave * call getcurpos()
442 call feedkeys("gg0\<C-V>jI123 \<Esc>j", 'xt')
443 call assert_equal([0, 2, 1, 0, 1], getcurpos())
444
445 bwipe!
446 au! InsertLeave
447endfunc
Bram Moolenaarc6b37db2019-04-27 18:00:34 +0200448
449" Tests for "vaBiB", end could be wrong.
450func Test_Visual_Block()
451 new
452 a
453- Bug in "vPPPP" on this text:
454 {
455 cmd;
456 {
457 cmd;\t/* <-- Start cursor here */
458 {
459 }
460 }
461 }
462.
463 normal gg
464 call search('Start cursor here')
465 normal vaBiBD
466 call assert_equal(['- Bug in "vPPPP" on this text:',
467 \ "\t{",
468 \ "\t}"], getline(1, '$'))
469
470 close!
471endfunc
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +0100472
473" Test for 'p'ut in visual block mode
474func Test_visual_block_put()
Bram Moolenaar3e72dca2021-05-29 16:30:12 +0200475 new
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +0100476 call append(0, ['One', 'Two', 'Three'])
477 normal gg
478 yank
479 call feedkeys("jl\<C-V>ljp", 'xt')
480 call assert_equal(['One', 'T', 'Tee', 'One', ''], getline(1, '$'))
Bram Moolenaar3e72dca2021-05-29 16:30:12 +0200481 bw!
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +0100482endfunc
483
Bram Moolenaar309976e2019-12-05 18:16:33 +0100484" Visual modes (v V CTRL-V) followed by an operator; count; repeating
485func Test_visual_mode_op()
486 new
487 call append(0, '')
488
489 call setline(1, 'apple banana cherry')
490 call cursor(1, 1)
491 normal lvld.l3vd.
492 call assert_equal('a y', getline(1))
493
494 call setline(1, ['line 1 line 1', 'line 2 line 2', 'line 3 line 3',
495 \ 'line 4 line 4', 'line 5 line 5', 'line 6 line 6'])
496 call cursor(1, 1)
497 exe "normal Vcnewline\<Esc>j.j2Vd."
498 call assert_equal(['newline', 'newline'], getline(1, '$'))
499
500 call deletebufline('', 1, '$')
501 call setline(1, ['xxxxxxxxxxxxx', 'xxxxxxxxxxxxx', 'xxxxxxxxxxxxx',
502 \ 'xxxxxxxxxxxxx'])
503 exe "normal \<C-V>jlc \<Esc>l.l2\<C-V>c----\<Esc>l."
504 call assert_equal([' --------x',
505 \ ' --------x',
506 \ 'xxxx--------x',
507 \ 'xxxx--------x'], getline(1, '$'))
508
509 bwipe!
510endfunc
511
512" Visual mode maps (movement and text object)
513" Visual mode maps; count; repeating
514" - Simple
515" - With an Ex command (custom text object)
516func Test_visual_mode_maps()
517 new
518 call append(0, '')
519
520 func SelectInCaps()
521 let [line1, col1] = searchpos('\u', 'bcnW')
522 let [line2, col2] = searchpos('.\u', 'nW')
523 call setpos("'<", [0, line1, col1, 0])
524 call setpos("'>", [0, line2, col2, 0])
525 normal! gv
526 endfunction
527
528 vnoremap W /\u/s-1<CR>
529 vnoremap iW :<C-U>call SelectInCaps()<CR>
530
531 call setline(1, 'KiwiRaspberryDateWatermelonPeach')
532 call cursor(1, 1)
533 exe "normal vWcNo\<Esc>l.fD2vd."
534 call assert_equal('NoNoberryach', getline(1))
535
536 call setline(1, 'JambuRambutanBananaTangerineMango')
537 call cursor(1, 1)
538 exe "normal llviWc-\<Esc>l.l2vdl."
539 call assert_equal('--ago', getline(1))
540
541 vunmap W
542 vunmap iW
543 bwipe!
544 delfunc SelectInCaps
545endfunc
546
547" Operator-pending mode maps (movement and text object)
548" - Simple
549" - With Ex command moving the cursor
550" - With Ex command and Visual selection (custom text object)
551func Test_visual_oper_pending_mode_maps()
552 new
553 call append(0, '')
554
555 func MoveToCap()
556 call search('\u', 'W')
557 endfunction
558
559 func SelectInCaps()
560 let [line1, col1] = searchpos('\u', 'bcnW')
561 let [line2, col2] = searchpos('.\u', 'nW')
562 call setpos("'<", [0, line1, col1, 0])
563 call setpos("'>", [0, line2, col2, 0])
564 normal! gv
565 endfunction
566
567 onoremap W /\u/<CR>
568 onoremap <Leader>W :<C-U>call MoveToCap()<CR>
569 onoremap iW :<C-U>call SelectInCaps()<CR>
570
571 call setline(1, 'PineappleQuinceLoganberryOrangeGrapefruitKiwiZ')
572 call cursor(1, 1)
573 exe "normal cW-\<Esc>l.l2.l."
574 call assert_equal('----Z', getline(1))
575
576 call setline(1, 'JuniperDurianZ')
577 call cursor(1, 1)
578 exe "normal g?\WfD."
579 call assert_equal('WhavcreQhevnaZ', getline(1))
580
581 call setline(1, 'LemonNectarineZ')
582 call cursor(1, 1)
583 exe "normal yiWPlciWNew\<Esc>fr."
584 call assert_equal('LemonNewNewZ', getline(1))
585
586 ounmap W
587 ounmap <Leader>W
588 ounmap iW
589 bwipe!
590 delfunc MoveToCap
591 delfunc SelectInCaps
592endfunc
593
594" Patch 7.3.879: Properly abort Operator-pending mode for "dv:<Esc>" etc.
595func Test_op_pend_mode_abort()
596 new
597 call append(0, '')
598
599 call setline(1, ['zzzz', 'zzzz'])
600 call cursor(1, 1)
601
602 exe "normal dV:\<CR>dv:\<CR>"
603 call assert_equal(['zzz'], getline(1, 2))
604 set nomodifiable
605 call assert_fails('exe "normal d:\<CR>"', 'E21:')
606 set modifiable
607 call feedkeys("dv:\<Esc>dV:\<Esc>", 'xt')
608 call assert_equal(['zzz'], getline(1, 2))
609 set nomodifiable
610 let v:errmsg = ''
611 call feedkeys("d:\<Esc>", 'xt')
612 call assert_true(v:errmsg !~# '^E21:')
613 set modifiable
614
615 bwipe!
616endfunc
617
618func Test_characterwise_visual_mode()
619 new
620
621 " characterwise visual mode: replace last line
622 $put ='a'
623 let @" = 'x'
624 normal v$p
625 call assert_equal('x', getline('$'))
626
627 " characterwise visual mode: delete middle line
628 call deletebufline('', 1, '$')
629 call append('$', ['a', 'b', 'c'])
630 normal G
631 normal kkv$d
632 call assert_equal(['', 'b', 'c'], getline(1, '$'))
633
634 " characterwise visual mode: delete middle two lines
635 call deletebufline('', 1, '$')
636 call append('$', ['a', 'b', 'c'])
637 normal Gkkvj$d
638 call assert_equal(['', 'c'], getline(1, '$'))
639
640 " characterwise visual mode: delete last line
641 call deletebufline('', 1, '$')
642 call append('$', ['a', 'b', 'c'])
643 normal Gv$d
644 call assert_equal(['', 'a', 'b', ''], getline(1, '$'))
645
646 " characterwise visual mode: delete last two lines
647 call deletebufline('', 1, '$')
648 call append('$', ['a', 'b', 'c'])
649 normal Gkvj$d
650 call assert_equal(['', 'a', ''], getline(1, '$'))
651
Bram Moolenaar8a9bc952020-10-02 18:48:07 +0200652 " characterwise visual mode: use a count with the visual mode from the last
653 " line in the buffer
654 %d _
655 call setline(1, ['one', 'two', 'three', 'four'])
656 norm! vj$y
657 norm! G1vy
658 call assert_equal('four', @")
659
Bram Moolenaar3e72dca2021-05-29 16:30:12 +0200660 " characterwise visual mode: replace a single character line and the eol
661 %d _
662 call setline(1, "a")
663 normal v$rx
664 call assert_equal(['x'], getline(1, '$'))
665
Bram Moolenaar309976e2019-12-05 18:16:33 +0100666 bwipe!
667endfunc
668
Bram Moolenaar309976e2019-12-05 18:16:33 +0100669func Test_visual_mode_put()
670 new
671
672 " v_p: replace last character with line register at middle line
673 call append('$', ['aaa', 'bbb', 'ccc'])
674 normal G
675 -2yank
676 normal k$vp
677 call assert_equal(['', 'aaa', 'bb', 'aaa', '', 'ccc'], getline(1, '$'))
678
679 " v_p: replace last character with line register at middle line selecting
680 " newline
681 call deletebufline('', 1, '$')
682 call append('$', ['aaa', 'bbb', 'ccc'])
683 normal G
684 -2yank
685 normal k$v$p
686 call assert_equal(['', 'aaa', 'bb', 'aaa', 'ccc'], getline(1, '$'))
687
688 " v_p: replace last character with line register at last line
689 call deletebufline('', 1, '$')
690 call append('$', ['aaa', 'bbb', 'ccc'])
691 normal G
692 -2yank
693 normal $vp
694 call assert_equal(['', 'aaa', 'bbb', 'cc', 'aaa', ''], getline(1, '$'))
695
696 " v_p: replace last character with line register at last line selecting
697 " newline
698 call deletebufline('', 1, '$')
699 call append('$', ['aaa', 'bbb', 'ccc'])
700 normal G
701 -2yank
702 normal $v$p
703 call assert_equal(['', 'aaa', 'bbb', 'cc', 'aaa', ''], getline(1, '$'))
704
705 bwipe!
706endfunc
707
Bram Moolenaar515545e2020-03-22 14:08:59 +0100708func Test_gv_with_exclusive_selection()
Bram Moolenaar309976e2019-12-05 18:16:33 +0100709 new
710
Bram Moolenaar515545e2020-03-22 14:08:59 +0100711 " gv with exclusive selection after an operation
Bram Moolenaar309976e2019-12-05 18:16:33 +0100712 call append('$', ['zzz ', 'äà '])
713 set selection=exclusive
714 normal Gkv3lyjv3lpgvcxxx
715 call assert_equal(['', 'zzz ', 'xxx '], getline(1, '$'))
716
Bram Moolenaar515545e2020-03-22 14:08:59 +0100717 " gv with exclusive selection without an operation
Bram Moolenaar309976e2019-12-05 18:16:33 +0100718 call deletebufline('', 1, '$')
719 call append('$', 'zzz ')
720 set selection=exclusive
721 exe "normal G0v3l\<Esc>gvcxxx"
722 call assert_equal(['', 'xxx '], getline(1, '$'))
723
724 set selection&vim
725 bwipe!
726endfunc
727
Bram Moolenaar1f3e7d32019-12-06 20:43:36 +0100728" Tests for the visual block mode commands
729func Test_visual_block_mode()
730 new
731 call append(0, '')
Bram Moolenaar1671f442020-03-10 07:48:13 +0100732 call setline(1, repeat(['abcdefghijklm'], 5))
Bram Moolenaar1f3e7d32019-12-06 20:43:36 +0100733 call cursor(1, 1)
734
735 " Test shift-right of a block
736 exe "normal jllll\<C-V>jj>wll\<C-V>jlll>"
737 " Test shift-left of a block
738 exe "normal G$hhhh\<C-V>kk<"
739 " Test block-insert
740 exe "normal Gkl\<C-V>kkkIxyz"
741 " Test block-replace
742 exe "normal Gllll\<C-V>kkklllrq"
743 " Test block-change
744 exe "normal G$khhh\<C-V>hhkkcmno"
745 call assert_equal(['axyzbcdefghijklm',
746 \ 'axyzqqqq mno ghijklm',
747 \ 'axyzqqqqef mno ghijklm',
748 \ 'axyzqqqqefgmnoklm',
749 \ 'abcdqqqqijklm'], getline(1, 5))
750
Bram Moolenaar1671f442020-03-10 07:48:13 +0100751 " Test 'C' to change till the end of the line
752 call cursor(3, 4)
753 exe "normal! \<C-V>j3lCooo"
754 call assert_equal(['axyooo', 'axyooo'], getline(3, 4))
755
756 " Test 'D' to delete till the end of the line
757 call cursor(3, 3)
758 exe "normal! \<C-V>j2lD"
759 call assert_equal(['ax', 'ax'], getline(3, 4))
760
Bram Moolenaar3e72dca2021-05-29 16:30:12 +0200761 " Test block insert with a short line that ends before the block
762 %d _
763 call setline(1, [" one", "a", " two"])
764 exe "normal gg\<C-V>2jIx"
765 call assert_equal([" xone", "a", " xtwo"], getline(1, '$'))
766
767 " Test block append at EOL with '$' and without '$'
768 %d _
769 call setline(1, ["one", "a", "two"])
770 exe "normal gg$\<C-V>2jAx"
771 call assert_equal(["onex", "ax", "twox"], getline(1, '$'))
772 %d _
773 call setline(1, ["one", "a", "two"])
774 exe "normal gg3l\<C-V>2jAx"
775 call assert_equal(["onex", "a x", "twox"], getline(1, '$'))
776
777 " Test block replace with an empty line in the middle and use $ to jump to
778 " the end of the line.
779 %d _
780 call setline(1, ['one', '', 'two'])
781 exe "normal gg$\<C-V>2jrx"
782 call assert_equal(["onx", "", "twx"], getline(1, '$'))
783
784 " Test block replace with an empty line in the middle and move cursor to the
785 " end of the line
786 %d _
787 call setline(1, ['one', '', 'two'])
788 exe "normal gg2l\<C-V>2jrx"
789 call assert_equal(["onx", "", "twx"], getline(1, '$'))
790
791 " Replace odd number of characters with a multibyte character
792 %d _
793 call setline(1, ['abcd', 'efgh'])
794 exe "normal ggl\<C-V>2ljr\u1100"
795 call assert_equal(["a\u1100 ", "e\u1100 "], getline(1, '$'))
796
797 " During visual block append, if the cursor moved outside of the selected
798 " range, then the edit should not be applied to the block.
799 %d _
800 call setline(1, ['aaa', 'bbb', 'ccc'])
801 exe "normal 2G\<C-V>jAx\<Up>"
802 call assert_equal(['aaa', 'bxbb', 'ccc'], getline(1, '$'))
803
804 " During visual block append, if the cursor is moved before the start of the
805 " block, then the new text should be appended there.
806 %d _
807 call setline(1, ['aaa', 'bbb', 'ccc'])
808 exe "normal $\<C-V>2jA\<Left>x"
809 " BUG: Instead of adding x as the third character in all the three lines,
810 " 'a' is added in the second and third lines at the end. This bug is not
811 " reproducible if this operation is performed manually.
812 "call assert_equal(['aaxa', 'bbxb', 'ccxc'], getline(1, '$'))
813 call assert_equal(['aaxa', 'bbba', 'ccca'], getline(1, '$'))
Yegappan Lakshmanan59b26232021-06-05 20:59:22 +0200814 " Repeat the previous test but use 'l' to move the cursor instead of '$'
815 call setline(1, ['aaa', 'bbb', 'ccc'])
816 exe "normal! gg2l\<C-V>2jA\<Left>x"
817 call assert_equal(['aaxa', 'bbxb', 'ccxc'], getline(1, '$'))
Bram Moolenaar3e72dca2021-05-29 16:30:12 +0200818
819 " Change a characterwise motion to a blockwise motion using CTRL-V
820 %d _
821 call setline(1, ['123', '456', '789'])
822 exe "normal ld\<C-V>j"
823 call assert_equal(['13', '46', '789'], getline(1, '$'))
824
Yegappan Lakshmanan2ac71842021-05-31 19:23:01 +0200825 " Test from ':help v_b_I_example'
826 %d _
827 setlocal tabstop=8 shiftwidth=4
828 let lines =<< trim END
829 abcdefghijklmnopqrstuvwxyz
830 abc defghijklmnopqrstuvwxyz
831 abcdef ghi jklmnopqrstuvwxyz
832 abcdefghijklmnopqrstuvwxyz
833 END
834 call setline(1, lines)
835 exe "normal ggfo\<C-V>3jISTRING"
836 let expected =<< trim END
837 abcdefghijklmnSTRINGopqrstuvwxyz
838 abc STRING defghijklmnopqrstuvwxyz
839 abcdef ghi STRING jklmnopqrstuvwxyz
840 abcdefghijklmnSTRINGopqrstuvwxyz
841 END
842 call assert_equal(expected, getline(1, '$'))
843
844 " Test from ':help v_b_A_example'
845 %d _
846 let lines =<< trim END
847 abcdefghijklmnopqrstuvwxyz
848 abc defghijklmnopqrstuvwxyz
849 abcdef ghi jklmnopqrstuvwxyz
850 abcdefghijklmnopqrstuvwxyz
851 END
852 call setline(1, lines)
853 exe "normal ggfo\<C-V>3j$ASTRING"
854 let expected =<< trim END
855 abcdefghijklmnopqrstuvwxyzSTRING
856 abc defghijklmnopqrstuvwxyzSTRING
857 abcdef ghi jklmnopqrstuvwxyzSTRING
858 abcdefghijklmnopqrstuvwxyzSTRING
859 END
860 call assert_equal(expected, getline(1, '$'))
861
862 " Test from ':help v_b_<_example'
863 %d _
864 let lines =<< trim END
865 abcdefghijklmnopqrstuvwxyz
866 abc defghijklmnopqrstuvwxyz
867 abcdef ghi jklmnopqrstuvwxyz
868 abcdefghijklmnopqrstuvwxyz
869 END
870 call setline(1, lines)
871 exe "normal ggfo\<C-V>3j3l<.."
872 let expected =<< trim END
873 abcdefghijklmnopqrstuvwxyz
874 abc defghijklmnopqrstuvwxyz
875 abcdef ghi jklmnopqrstuvwxyz
876 abcdefghijklmnopqrstuvwxyz
877 END
878 call assert_equal(expected, getline(1, '$'))
879
880 " Test from ':help v_b_>_example'
881 %d _
882 let lines =<< trim END
883 abcdefghijklmnopqrstuvwxyz
884 abc defghijklmnopqrstuvwxyz
885 abcdef ghi jklmnopqrstuvwxyz
886 abcdefghijklmnopqrstuvwxyz
887 END
888 call setline(1, lines)
889 exe "normal ggfo\<C-V>3j>.."
890 let expected =<< trim END
891 abcdefghijklmn opqrstuvwxyz
892 abc defghijklmnopqrstuvwxyz
893 abcdef ghi jklmnopqrstuvwxyz
894 abcdefghijklmn opqrstuvwxyz
895 END
896 call assert_equal(expected, getline(1, '$'))
897
898 " Test from ':help v_b_r_example'
899 %d _
900 let lines =<< trim END
901 abcdefghijklmnopqrstuvwxyz
902 abc defghijklmnopqrstuvwxyz
903 abcdef ghi jklmnopqrstuvwxyz
904 abcdefghijklmnopqrstuvwxyz
905 END
906 call setline(1, lines)
907 exe "normal ggfo\<C-V>5l3jrX"
908 let expected =<< trim END
909 abcdefghijklmnXXXXXXuvwxyz
910 abc XXXXXXhijklmnopqrstuvwxyz
911 abcdef ghi XXXXXX jklmnopqrstuvwxyz
912 abcdefghijklmnXXXXXXuvwxyz
913 END
914 call assert_equal(expected, getline(1, '$'))
915
Bram Moolenaar1f3e7d32019-12-06 20:43:36 +0100916 bwipe!
Yegappan Lakshmanan2ac71842021-05-31 19:23:01 +0200917 set tabstop& shiftwidth&
Bram Moolenaar1f3e7d32019-12-06 20:43:36 +0100918endfunc
919
Bram Moolenaar21492742021-06-04 21:57:57 +0200920func Test_visual_force_motion_feedkeys()
921 onoremap <expr> i- execute('let g:mode = mode(1)')->slice(0, 0)
922 call feedkeys('dvi-', 'x')
923 call assert_equal('nov', g:mode)
924 call feedkeys('di-', 'x')
925 call assert_equal('no', g:mode)
926 ounmap i-
927endfunc
928
Bram Moolenaar1f3e7d32019-12-06 20:43:36 +0100929" Test block-insert using cursor keys for movement
930func Test_visual_block_insert_cursor_keys()
931 new
932 call append(0, ['aaaaaa', 'bbbbbb', 'cccccc', 'dddddd'])
933 call cursor(1, 1)
934
935 exe "norm! l\<C-V>jjjlllI\<Right>\<Right> \<Esc>"
936 call assert_equal(['aaa aaa', 'bbb bbb', 'ccc ccc', 'ddd ddd'],
937 \ getline(1, 4))
938
939 call deletebufline('', 1, '$')
940 call setline(1, ['xaaa', 'bbbb', 'cccc', 'dddd'])
941 call cursor(1, 1)
942 exe "norm! \<C-V>jjjI<>\<Left>p\<Esc>"
943 call assert_equal(['<p>xaaa', '<p>bbbb', '<p>cccc', '<p>dddd'],
944 \ getline(1, 4))
945 bwipe!
946endfunc
947
948func Test_visual_block_create()
949 new
950 call append(0, '')
951 " Test for Visual block was created with the last <C-v>$
952 call setline(1, ['A23', '4567'])
953 call cursor(1, 1)
954 exe "norm! l\<C-V>j$Aab\<Esc>"
955 call assert_equal(['A23ab', '4567ab'], getline(1, 2))
956
957 " Test for Visual block was created with the middle <C-v>$ (1)
958 call deletebufline('', 1, '$')
959 call setline(1, ['B23', '4567'])
960 call cursor(1, 1)
961 exe "norm! l\<C-V>j$hAab\<Esc>"
962 call assert_equal(['B23 ab', '4567ab'], getline(1, 2))
963
964 " Test for Visual block was created with the middle <C-v>$ (2)
965 call deletebufline('', 1, '$')
966 call setline(1, ['C23', '4567'])
967 call cursor(1, 1)
968 exe "norm! l\<C-V>j$hhAab\<Esc>"
969 call assert_equal(['C23ab', '456ab7'], getline(1, 2))
970 bwipe!
971endfunc
972
973" Test for Visual block insert when virtualedit=all
974func Test_virtualedit_visual_block()
975 set ve=all
976 new
977 call append(0, ["\t\tline1", "\t\tline2", "\t\tline3"])
978 call cursor(1, 1)
979 exe "norm! 07l\<C-V>jjIx\<Esc>"
980 call assert_equal([" x \tline1",
981 \ " x \tline2",
982 \ " x \tline3"], getline(1, 3))
983
984 " Test for Visual block append when virtualedit=all
985 exe "norm! 012l\<C-v>jjAx\<Esc>"
986 call assert_equal([' x x line1',
987 \ ' x x line2',
988 \ ' x x line3'], getline(1, 3))
989 set ve=
990 bwipe!
991endfunc
992
993" Test for changing case
994func Test_visual_change_case()
995 new
996 " gUe must uppercase a whole word, also when ß changes to SS
997 exe "normal Gothe youtußeuu end\<Esc>Ypk0wgUe\r"
998 " gUfx must uppercase until x, inclusive.
999 exe "normal O- youßtußexu -\<Esc>0fogUfx\r"
1000 " VU must uppercase a whole line
1001 exe "normal YpkVU\r"
1002 " same, when it's the last line in the buffer
1003 exe "normal YPGi111\<Esc>VUddP\r"
1004 " Uppercase two lines
1005 exe "normal Oblah di\rdoh dut\<Esc>VkUj\r"
1006 " Uppercase part of two lines
1007 exe "normal ddppi333\<Esc>k0i222\<Esc>fyllvjfuUk"
1008 call assert_equal(['the YOUTUSSEUU end', '- yOUSSTUSSEXu -',
1009 \ 'THE YOUTUSSEUU END', '111THE YOUTUSSEUU END', 'BLAH DI', 'DOH DUT',
1010 \ '222the yoUTUSSEUU END', '333THE YOUTUßeuu end'], getline(2, '$'))
1011 bwipe!
1012endfunc
1013
1014" Test for Visual replace using Enter or NL
1015func Test_visual_replace_crnl()
1016 new
1017 exe "normal G3o123456789\e2k05l\<C-V>2jr\r"
1018 exe "normal G3o98765\e2k02l\<C-V>2jr\<C-V>\r\n"
1019 exe "normal G3o123456789\e2k05l\<C-V>2jr\n"
1020 exe "normal G3o98765\e2k02l\<C-V>2jr\<C-V>\n"
1021 call assert_equal(['12345', '789', '12345', '789', '12345', '789', "98\r65",
1022 \ "98\r65", "98\r65", '12345', '789', '12345', '789', '12345', '789',
1023 \ "98\n65", "98\n65", "98\n65"], getline(2, '$'))
1024 bwipe!
1025endfunc
1026
1027func Test_ve_block_curpos()
1028 new
1029 " Test cursor position. When ve=block and Visual block mode and $gj
1030 call append(0, ['12345', '789'])
1031 call cursor(1, 3)
1032 set virtualedit=block
1033 exe "norm! \<C-V>$gj\<Esc>"
1034 call assert_equal([0, 2, 4, 0], getpos("'>"))
1035 set virtualedit=
1036 bwipe!
1037endfunc
1038
1039" Test for block_insert when replacing spaces in front of the a with tabs
1040func Test_block_insert_replace_tabs()
1041 new
1042 set ts=8 sts=4 sw=4
1043 call append(0, ["#define BO_ALL\t 0x0001",
1044 \ "#define BO_BS\t 0x0002",
1045 \ "#define BO_CRSR\t 0x0004"])
1046 call cursor(1, 1)
1047 exe "norm! f0\<C-V>2jI\<tab>\<esc>"
1048 call assert_equal([
1049 \ "#define BO_ALL\t\t0x0001",
1050 \ "#define BO_BS\t \t0x0002",
1051 \ "#define BO_CRSR\t \t0x0004", ''], getline(1, '$'))
1052 set ts& sts& sw&
1053 bwipe!
1054endfunc
1055
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +01001056" Test for * register in :
1057func Test_star_register()
1058 call assert_fails('*bfirst', 'E16:')
1059 new
1060 call setline(1, ['foo', 'bar', 'baz', 'qux'])
1061 exe "normal jVj\<ESC>"
1062 *yank r
1063 call assert_equal("bar\nbaz\n", @r)
1064
1065 delmarks < >
1066 call assert_fails('*yank', 'E20:')
1067 close!
1068endfunc
1069
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001070" Test for changing text in visual mode with 'exclusive' selection
1071func Test_exclusive_selection()
1072 new
1073 call setline(1, ['one', 'two'])
1074 set selection=exclusive
1075 call feedkeys("vwcabc", 'xt')
1076 call assert_equal('abctwo', getline(1))
1077 call setline(1, ["\tone"])
1078 set virtualedit=all
1079 call feedkeys('0v2lcl', 'xt')
1080 call assert_equal('l one', getline(1))
1081 set virtualedit&
1082 set selection&
1083 close!
1084endfunc
1085
Bram Moolenaard1ad99b2020-10-04 16:16:54 +02001086" Test for starting linewise visual with a count.
1087" This test needs to be run without any previous visual mode. Otherwise the
1088" count will use the count from the previous visual mode.
1089func Test_linewise_visual_with_count()
1090 let after =<< trim [CODE]
1091 call setline(1, ['one', 'two', 'three', 'four'])
1092 norm! 3Vy
1093 call assert_equal("one\ntwo\nthree\n", @")
1094 call writefile(v:errors, 'Xtestout')
1095 qall!
1096 [CODE]
1097 if RunVim([], after, '')
1098 call assert_equal([], readfile('Xtestout'))
1099 call delete('Xtestout')
1100 endif
1101endfunc
1102
1103" Test for starting characterwise visual with a count.
1104" This test needs to be run without any previous visual mode. Otherwise the
1105" count will use the count from the previous visual mode.
1106func Test_characterwise_visual_with_count()
1107 let after =<< trim [CODE]
1108 call setline(1, ['one two', 'three'])
1109 norm! l5vy
1110 call assert_equal("ne tw", @")
1111 call writefile(v:errors, 'Xtestout')
1112 qall!
1113 [CODE]
1114 if RunVim([], after, '')
1115 call assert_equal([], readfile('Xtestout'))
1116 call delete('Xtestout')
1117 endif
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001118endfunc
1119
Bram Moolenaar224a5f12020-04-28 20:29:07 +02001120" Test for visually selecting an inner block (iB)
1121func Test_visual_inner_block()
1122 new
1123 call setline(1, ['one', '{', 'two', '{', 'three', '}', 'four', '}', 'five'])
1124 call cursor(5, 1)
1125 " visually select all the lines in the block and then execute iB
1126 call feedkeys("ViB\<C-C>", 'xt')
1127 call assert_equal([0, 5, 1, 0], getpos("'<"))
1128 call assert_equal([0, 5, 6, 0], getpos("'>"))
1129 " visually select two inner blocks
1130 call feedkeys("ViBiB\<C-C>", 'xt')
1131 call assert_equal([0, 3, 1, 0], getpos("'<"))
1132 call assert_equal([0, 7, 5, 0], getpos("'>"))
1133 " try to select non-existing inner block
1134 call cursor(5, 1)
1135 call assert_beeps('normal ViBiBiB')
1136 " try to select a unclosed inner block
1137 8,9d
1138 call cursor(5, 1)
1139 call assert_beeps('normal ViBiB')
1140 close!
1141endfunc
1142
Bram Moolenaarcd942772020-08-22 21:08:44 +02001143func Test_visual_put_in_block()
1144 new
1145 call setline(1, ['xxxx', 'yyy', 'zzzz'])
1146 normal 1G2yl
1147 exe "normal 1G2l\<C-V>jjlp"
1148 call assert_equal(['xxxx', 'yxx', 'zzxx'], getline(1, 3))
1149 bwipe!
1150endfunc
1151
Christian Brabandt2fa93842021-05-30 22:17:25 +02001152func Test_visual_put_in_block_using_zp()
1153 new
1154 " paste using zP
1155 call setline(1, ['/path;text', '/path;text', '/path;text', '',
1156 \ '/subdir',
1157 \ '/longsubdir',
1158 \ '/longlongsubdir'])
1159 exe "normal! 5G\<c-v>2j$y"
1160 norm! 1Gf;zP
1161 call assert_equal(['/path/subdir;text', '/path/longsubdir;text', '/path/longlongsubdir;text'], getline(1, 3))
1162 %d
1163 " paste using zP
1164 call setline(1, ['/path;text', '/path;text', '/path;text', '',
1165 \ '/subdir',
1166 \ '/longsubdir',
1167 \ '/longlongsubdir'])
1168 exe "normal! 5G\<c-v>2j$y"
1169 norm! 1Gf;hzp
1170 call assert_equal(['/path/subdir;text', '/path/longsubdir;text', '/path/longlongsubdir;text'], getline(1, 3))
1171 bwipe!
1172endfunc
1173
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +01001174" vim: shiftwidth=2 sts=2 expandtab