xref: /vim-8.2.3635/src/testdir/test_visual.vim (revision 615ddd53)
11f3e7d3bSBram Moolenaar" Tests for various Visual modes.
2c3c766eaSBram Moolenaar
3d1ad99b6SBram Moolenaarsource shared.vim
47d7bcc6bSBram Moolenaarsource check.vim
59cee4a1cSBram Moolenaarsource screendump.vim
6d1ad99b6SBram Moolenaar
7019b9c64SBram Moolenaarfunc Test_block_shift_multibyte()
8f8eb9c51SBram Moolenaar  " Uses double-wide character.
9019b9c64SBram Moolenaar  split
10019b9c64SBram Moolenaar  call setline(1, ['xヹxxx', 'ヹxxx'])
11019b9c64SBram Moolenaar  exe "normal 1G0l\<C-V>jl>"
12019b9c64SBram Moolenaar  call assert_equal('x	 ヹxxx', getline(1))
13019b9c64SBram Moolenaar  call assert_equal('	ヹxxx', getline(2))
14019b9c64SBram Moolenaar  q!
15019b9c64SBram Moolenaarendfunc
16f8eb9c51SBram Moolenaar
17bae5a17aSBram Moolenaarfunc Test_block_shift_overflow()
18bae5a17aSBram Moolenaar  " This used to cause a multiplication overflow followed by a crash.
19bae5a17aSBram Moolenaar  new
20bae5a17aSBram Moolenaar  normal ii
21bae5a17aSBram Moolenaar  exe "normal \<C-V>876543210>"
22bae5a17aSBram Moolenaar  q!
23bae5a17aSBram Moolenaarendfunc
24bae5a17aSBram Moolenaar
25f8eb9c51SBram Moolenaarfunc Test_dotregister_paste()
26f8eb9c51SBram Moolenaar  new
27f8eb9c51SBram Moolenaar  exe "norm! ihello world\<esc>"
28f8eb9c51SBram Moolenaar  norm! 0ve".p
29f8eb9c51SBram Moolenaar  call assert_equal('hello world world', getline(1))
30f8eb9c51SBram Moolenaar  q!
31f8eb9c51SBram Moolenaarendfunc
3223fa81d2SBram Moolenaar
3323fa81d2SBram Moolenaarfunc Test_Visual_ctrl_o()
3423fa81d2SBram Moolenaar  new
3523fa81d2SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
3623fa81d2SBram Moolenaar  call cursor(1,2)
3723fa81d2SBram Moolenaar  set noshowmode
3823fa81d2SBram Moolenaar  set tw=0
3923fa81d2SBram Moolenaar  call feedkeys("\<c-v>jjlIa\<c-\>\<c-o>:set tw=88\<cr>\<esc>", 'tx')
4023fa81d2SBram Moolenaar  call assert_equal(['oane', 'tawo', 'tahree'], getline(1, 3))
4123fa81d2SBram Moolenaar  call assert_equal(88, &tw)
4223fa81d2SBram Moolenaar  set tw&
4323fa81d2SBram Moolenaar  bw!
4423fa81d2SBram Moolenaarendfu
4584b2a381SBram Moolenaar
4684b2a381SBram Moolenaarfunc Test_Visual_vapo()
4784b2a381SBram Moolenaar  new
4884b2a381SBram Moolenaar  normal oxx
4984b2a381SBram Moolenaar  normal vapo
5084b2a381SBram Moolenaar  bwipe!
5184b2a381SBram Moolenaarendfunc
5246522af7SBram Moolenaar
5346522af7SBram Moolenaarfunc Test_Visual_inner_quote()
5446522af7SBram Moolenaar  new
5546522af7SBram Moolenaar  normal oxX
5646522af7SBram Moolenaar  normal vki'
5746522af7SBram Moolenaar  bwipe!
5846522af7SBram Moolenaarendfunc
5975373f38SBram Moolenaar
6075373f38SBram Moolenaar" Test for Visual mode not being reset causing E315 error.
6175373f38SBram Moolenaarfunc TriggerTheProblem()
6275373f38SBram Moolenaar  " At this point there is no visual selection because :call reset it.
6375373f38SBram Moolenaar  " Let's restore the selection:
6475373f38SBram Moolenaar  normal gv
6575373f38SBram Moolenaar  '<,'>del _
6675373f38SBram Moolenaar  try
6775373f38SBram Moolenaar      exe "normal \<Esc>"
6875373f38SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E315/
6975373f38SBram Moolenaar      echom 'Snap! E315 error!'
7075373f38SBram Moolenaar      let g:msg = 'Snap! E315 error!'
7175373f38SBram Moolenaar  endtry
7275373f38SBram Moolenaarendfunc
7375373f38SBram Moolenaar
7475373f38SBram Moolenaarfunc Test_visual_mode_reset()
7575373f38SBram Moolenaar  enew
7675373f38SBram Moolenaar  let g:msg = "Everything's fine."
7775373f38SBram Moolenaar  enew
7875373f38SBram Moolenaar  setl buftype=nofile
7975373f38SBram Moolenaar  call append(line('$'), 'Delete this line.')
8075373f38SBram Moolenaar
8175373f38SBram Moolenaar  " NOTE: this has to be done by a call to a function because executing :del
8275373f38SBram Moolenaar  " the ex-way will require the colon operator which resets the visual mode
8375373f38SBram Moolenaar  " thus preventing the problem:
8475373f38SBram Moolenaar  exe "normal! GV:call TriggerTheProblem()\<CR>"
8575373f38SBram Moolenaar  call assert_equal("Everything's fine.", g:msg)
8675373f38SBram Moolenaarendfunc
8767418d97SBram Moolenaar
8815993ce9SBram Moolenaar" Test for visual block shift and tab characters.
8915993ce9SBram Moolenaarfunc Test_block_shift_tab()
903e72dcadSBram Moolenaar  new
9115993ce9SBram Moolenaar  call append(0, repeat(['one two three'], 5))
9215993ce9SBram Moolenaar  call cursor(1,1)
9315993ce9SBram Moolenaar  exe "normal i\<C-G>u"
9415993ce9SBram Moolenaar  exe "normal fe\<C-V>4jR\<Esc>ugvr1"
9515993ce9SBram Moolenaar  call assert_equal('on1 two three', getline(1))
9615993ce9SBram Moolenaar  call assert_equal('on1 two three', getline(2))
9715993ce9SBram Moolenaar  call assert_equal('on1 two three', getline(5))
9815993ce9SBram Moolenaar
993e72dcadSBram Moolenaar  %d _
10015993ce9SBram Moolenaar  call append(0, repeat(['abcdefghijklmnopqrstuvwxyz'], 5))
10115993ce9SBram Moolenaar  call cursor(1,1)
10215993ce9SBram Moolenaar  exe "normal \<C-V>4jI    \<Esc>j<<11|D"
10315993ce9SBram Moolenaar  exe "normal j7|a\<Tab>\<Tab>"
10415993ce9SBram Moolenaar  exe "normal j7|a\<Tab>\<Tab>   "
10515993ce9SBram Moolenaar  exe "normal j7|a\<Tab>       \<Tab>\<Esc>4k13|\<C-V>4j<"
10615993ce9SBram Moolenaar  call assert_equal('    abcdefghijklmnopqrstuvwxyz', getline(1))
10715993ce9SBram Moolenaar  call assert_equal('abcdefghij', getline(2))
10815993ce9SBram Moolenaar  call assert_equal("    abc\<Tab>    defghijklmnopqrstuvwxyz", getline(3))
10915993ce9SBram Moolenaar  call assert_equal("    abc\<Tab>    defghijklmnopqrstuvwxyz", getline(4))
11015993ce9SBram Moolenaar  call assert_equal("    abc\<Tab>    defghijklmnopqrstuvwxyz", getline(5))
11115993ce9SBram Moolenaar
11215993ce9SBram Moolenaar  %s/\s\+//g
11315993ce9SBram Moolenaar  call cursor(1,1)
11415993ce9SBram Moolenaar  exe "normal \<C-V>4jI    \<Esc>j<<"
11515993ce9SBram Moolenaar  exe "normal j7|a\<Tab>\<Tab>"
11615993ce9SBram Moolenaar  exe "normal j7|a\<Tab>\<Tab>\<Tab>\<Tab>\<Tab>"
11715993ce9SBram Moolenaar  exe "normal j7|a\<Tab>       \<Tab>\<Tab>\<Esc>4k13|\<C-V>4j3<"
11815993ce9SBram Moolenaar  call assert_equal('    abcdefghijklmnopqrstuvwxyz', getline(1))
11915993ce9SBram Moolenaar  call assert_equal('abcdefghij', getline(2))
12015993ce9SBram Moolenaar  call assert_equal("    abc\<Tab>    defghijklmnopqrstuvwxyz", getline(3))
12115993ce9SBram Moolenaar  call assert_equal("    abc\<Tab>\<Tab>defghijklmnopqrstuvwxyz", getline(4))
12215993ce9SBram Moolenaar  call assert_equal("    abc\<Tab>    defghijklmnopqrstuvwxyz", getline(5))
12315993ce9SBram Moolenaar
1243e72dcadSBram Moolenaar  " Test for block shift with space characters at the beginning and with
1253e72dcadSBram Moolenaar  " 'noexpandtab' and 'expandtab'
1263e72dcadSBram Moolenaar  %d _
1273e72dcadSBram Moolenaar  call setline(1, ["      1", "      2", "      3"])
1283e72dcadSBram Moolenaar  setlocal shiftwidth=2 noexpandtab
1293e72dcadSBram Moolenaar  exe "normal gg\<C-V>3j>"
1303e72dcadSBram Moolenaar  call assert_equal(["\t1", "\t2", "\t3"], getline(1, '$'))
1313e72dcadSBram Moolenaar  %d _
1323e72dcadSBram Moolenaar  call setline(1, ["      1", "      2", "      3"])
1333e72dcadSBram Moolenaar  setlocal shiftwidth=2 expandtab
1343e72dcadSBram Moolenaar  exe "normal gg\<C-V>3j>"
1353e72dcadSBram Moolenaar  call assert_equal(["        1", "        2", "        3"], getline(1, '$'))
1363e72dcadSBram Moolenaar  setlocal shiftwidth&
1373e72dcadSBram Moolenaar
1383e72dcadSBram Moolenaar  bw!
13915993ce9SBram Moolenaarendfunc
14015993ce9SBram Moolenaar
14115993ce9SBram Moolenaar" Tests Blockwise Visual when there are TABs before the text.
14215993ce9SBram Moolenaarfunc Test_blockwise_visual()
1433e72dcadSBram Moolenaar  new
14415993ce9SBram Moolenaar  call append(0, ['123456',
14515993ce9SBram Moolenaar	      \ '234567',
14615993ce9SBram Moolenaar	      \ '345678',
14715993ce9SBram Moolenaar	      \ '',
14815993ce9SBram Moolenaar	      \ 'test text test tex start here',
14915993ce9SBram Moolenaar	      \ "\t\tsome text",
15015993ce9SBram Moolenaar	      \ "\t\ttest text",
15115993ce9SBram Moolenaar	      \ 'test text'])
15215993ce9SBram Moolenaar  call cursor(1,1)
15315993ce9SBram Moolenaar  exe "normal /start here$\<CR>"
15415993ce9SBram Moolenaar  exe 'normal "by$' . "\<C-V>jjlld"
15515993ce9SBram Moolenaar  exe "normal /456$\<CR>"
15615993ce9SBram Moolenaar  exe "normal \<C-V>jj" . '"bP'
15715993ce9SBram Moolenaar  call assert_equal(['123start here56',
15815993ce9SBram Moolenaar	      \ '234start here67',
15915993ce9SBram Moolenaar	      \ '345start here78',
16015993ce9SBram Moolenaar	      \ '',
16115993ce9SBram Moolenaar	      \ 'test text test tex rt here',
16215993ce9SBram Moolenaar	      \ "\t\tsomext",
16315993ce9SBram Moolenaar	      \ "\t\ttesext"], getline(1, 7))
16415993ce9SBram Moolenaar
1653e72dcadSBram Moolenaar  bw!
16615993ce9SBram Moolenaarendfunc
16715993ce9SBram Moolenaar
1682e94976aSBram Moolenaar" Test swapping corners in blockwise visual mode with o and O
1692e94976aSBram Moolenaarfunc Test_blockwise_visual_o_O()
1703e72dcadSBram Moolenaar  new
1712e94976aSBram Moolenaar
1722e94976aSBram Moolenaar  exe "norm! 10i.\<Esc>Y4P3lj\<C-V>4l2jr "
1732e94976aSBram Moolenaar  exe "norm! gvO\<Esc>ra"
1742e94976aSBram Moolenaar  exe "norm! gvO\<Esc>rb"
1752e94976aSBram Moolenaar  exe "norm! gvo\<C-c>rc"
1762e94976aSBram Moolenaar  exe "norm! gvO\<C-c>rd"
1771671f448SBram Moolenaar  set selection=exclusive
1781671f448SBram Moolenaar  exe "norm! gvOo\<C-c>re"
1791671f448SBram Moolenaar  call assert_equal('...a   be.', getline(4))
1801671f448SBram Moolenaar  exe "norm! gvOO\<C-c>rf"
1811671f448SBram Moolenaar  set selection&
1822e94976aSBram Moolenaar
1832e94976aSBram Moolenaar  call assert_equal(['..........',
1842e94976aSBram Moolenaar        \            '...c   d..',
1852e94976aSBram Moolenaar        \            '...     ..',
1861671f448SBram Moolenaar        \            '...a   bf.',
1872e94976aSBram Moolenaar        \            '..........'], getline(1, '$'))
1882e94976aSBram Moolenaar
1893e72dcadSBram Moolenaar  bw!
1902e94976aSBram Moolenaarendfun
1912e94976aSBram Moolenaar
19215993ce9SBram Moolenaar" Test Virtual replace mode.
19315993ce9SBram Moolenaarfunc Test_virtual_replace()
194df0d24b6SBram Moolenaar  if exists('&t_kD')
195e7808481SBram Moolenaar    let save_t_kD = &t_kD
196df0d24b6SBram Moolenaar  endif
197df0d24b6SBram Moolenaar  if exists('&t_kb')
198e7808481SBram Moolenaar    let save_t_kb = &t_kb
199df0d24b6SBram Moolenaar  endif
20015993ce9SBram Moolenaar  exe "set t_kD=\<C-V>x7f t_kb=\<C-V>x08"
20115993ce9SBram Moolenaar  enew!
20215993ce9SBram Moolenaar  exe "normal a\nabcdefghi\njk\tlmn\n    opq	rst\n\<C-D>uvwxyz"
20315993ce9SBram Moolenaar  call cursor(1,1)
20415993ce9SBram Moolenaar  set ai bs=2
20515993ce9SBram Moolenaar  exe "normal gR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR"
20615993ce9SBram Moolenaar  call assert_equal([' 1',
20715993ce9SBram Moolenaar	      \ ' A',
20815993ce9SBram Moolenaar	      \ ' BCDEFGHIJ',
20915993ce9SBram Moolenaar	      \ ' 	KL',
21015993ce9SBram Moolenaar	      \ '	MNO',
21115993ce9SBram Moolenaar	      \ '	PQR',
21215993ce9SBram Moolenaar	      \ ], getline(1, 6))
21315993ce9SBram Moolenaar  normal G
21415993ce9SBram Moolenaar  mark a
21515993ce9SBram Moolenaar  exe "normal o0\<C-D>\nabcdefghi\njk\tlmn\n    opq\trst\n\<C-D>uvwxyz\n"
21615993ce9SBram Moolenaar  exe "normal 'ajgR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" . repeat("\<BS>", 29)
21715993ce9SBram Moolenaar  call assert_equal([' 1',
21815993ce9SBram Moolenaar	      \ 'abcdefghi',
21915993ce9SBram Moolenaar	      \ 'jk	lmn',
22015993ce9SBram Moolenaar	      \ '    opq	rst',
22115993ce9SBram Moolenaar	      \ 'uvwxyz'], getline(7, 11))
22215993ce9SBram Moolenaar  normal G
22315993ce9SBram Moolenaar  exe "normal iab\tcdefghi\tjkl"
22415993ce9SBram Moolenaar  exe "normal 0gRAB......CDEFGHI.J\<Esc>o"
22515993ce9SBram Moolenaar  exe "normal iabcdefghijklmnopqrst\<Esc>0gRAB\tIJKLMNO\tQR"
22615993ce9SBram Moolenaar  call assert_equal(['AB......CDEFGHI.Jkl',
22715993ce9SBram Moolenaar	      \ 'AB	IJKLMNO	QRst'], getline(12, 13))
228845e0ee5SBram Moolenaar
229845e0ee5SBram Moolenaar  " Test inserting Tab with 'noexpandtab' and 'softabstop' set to 4
230845e0ee5SBram Moolenaar  %d
231845e0ee5SBram Moolenaar  call setline(1, 'aaaaaaaaaaaaa')
232845e0ee5SBram Moolenaar  set softtabstop=4
233845e0ee5SBram Moolenaar  exe "normal gggR\<Tab>\<Tab>x"
234845e0ee5SBram Moolenaar  call assert_equal("\txaaaa", getline(1))
235845e0ee5SBram Moolenaar  set softtabstop&
236845e0ee5SBram Moolenaar
23715993ce9SBram Moolenaar  enew!
238e7808481SBram Moolenaar  set noai bs&vim
239df0d24b6SBram Moolenaar  if exists('save_t_kD')
240e7808481SBram Moolenaar    let &t_kD = save_t_kD
241df0d24b6SBram Moolenaar  endif
242df0d24b6SBram Moolenaar  if exists('save_t_kb')
243e7808481SBram Moolenaar    let &t_kb = save_t_kb
244df0d24b6SBram Moolenaar  endif
24563e82db6SBram Moolenaarendfunc
24663e82db6SBram Moolenaar
24763e82db6SBram Moolenaar" Test Virtual replace mode.
24863e82db6SBram Moolenaarfunc Test_virtual_replace2()
24963e82db6SBram Moolenaar  enew!
25063e82db6SBram Moolenaar  set bs=2
25163e82db6SBram Moolenaar  exe "normal a\nabcdefghi\njk\tlmn\n    opq	rst\n\<C-D>uvwxyz"
25263e82db6SBram Moolenaar  call cursor(1,1)
25363e82db6SBram Moolenaar  " Test 1: Test that del deletes the newline
25463e82db6SBram Moolenaar  exe "normal gR0\<del> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR"
25563e82db6SBram Moolenaar  call assert_equal(['0 1',
25663e82db6SBram Moolenaar	      \ 'A',
25763e82db6SBram Moolenaar	      \ 'BCDEFGHIJ',
25863e82db6SBram Moolenaar	      \ '	KL',
25963e82db6SBram Moolenaar	      \ 'MNO',
26063e82db6SBram Moolenaar	      \ 'PQR',
26163e82db6SBram Moolenaar	      \ ], getline(1, 6))
26263e82db6SBram Moolenaar  " Test 2:
26363e82db6SBram Moolenaar  " a newline is not deleted, if no newline has been added in virtual replace mode
26463e82db6SBram Moolenaar  %d_
26563e82db6SBram Moolenaar  call setline(1, ['abcd', 'efgh', 'ijkl'])
26663e82db6SBram Moolenaar  call cursor(2,1)
26763e82db6SBram Moolenaar  exe "norm! gR1234\<cr>5\<bs>\<bs>\<bs>"
26863e82db6SBram Moolenaar  call assert_equal(['abcd',
26963e82db6SBram Moolenaar        \ '123h',
27063e82db6SBram Moolenaar        \ 'ijkl'], getline(1, '$'))
27163e82db6SBram Moolenaar  " Test 3:
27263e82db6SBram Moolenaar  " a newline is deleted, if a newline has been inserted before in virtual replace mode
27363e82db6SBram Moolenaar  %d_
27463e82db6SBram Moolenaar  call setline(1, ['abcd', 'efgh', 'ijkl'])
27563e82db6SBram Moolenaar  call cursor(2,1)
27663e82db6SBram Moolenaar  exe "norm! gR1234\<cr>\<cr>56\<bs>\<bs>\<bs>"
27763e82db6SBram Moolenaar  call assert_equal(['abcd',
27863e82db6SBram Moolenaar        \ '1234',
27963e82db6SBram Moolenaar        \ 'ijkl'], getline(1, '$'))
28063e82db6SBram Moolenaar  " Test 4:
28163e82db6SBram Moolenaar  " delete add a newline, delete it, add it again and check undo
28263e82db6SBram Moolenaar  %d_
28363e82db6SBram Moolenaar  call setline(1, ['abcd', 'efgh', 'ijkl'])
28463e82db6SBram Moolenaar  call cursor(2,1)
28563e82db6SBram Moolenaar  " break undo sequence explicitly
28663e82db6SBram Moolenaar  let &ul = &ul
28763e82db6SBram Moolenaar  exe "norm! gR1234\<cr>\<bs>\<del>56\<cr>"
28863e82db6SBram Moolenaar  let &ul = &ul
28963e82db6SBram Moolenaar  call assert_equal(['abcd',
29063e82db6SBram Moolenaar        \ '123456',
29163e82db6SBram Moolenaar        \ ''], getline(1, '$'))
29263e82db6SBram Moolenaar  norm! u
29363e82db6SBram Moolenaar  call assert_equal(['abcd',
29463e82db6SBram Moolenaar        \ 'efgh',
29563e82db6SBram Moolenaar        \ 'ijkl'], getline(1, '$'))
296ca68ae13SBram Moolenaar
297ca68ae13SBram Moolenaar  " Test for truncating spaces in a newly added line using 'autoindent' if
298ca68ae13SBram Moolenaar  " characters are not added to that line.
299ca68ae13SBram Moolenaar  %d_
300ca68ae13SBram Moolenaar  call setline(1, ['    app', '    bee', '    cat'])
301ca68ae13SBram Moolenaar  setlocal autoindent
302ca68ae13SBram Moolenaar  exe "normal gg$gRt\n\nr"
303ca68ae13SBram Moolenaar  call assert_equal(['    apt', '', '    rat'], getline(1, '$'))
304ca68ae13SBram Moolenaar
30563e82db6SBram Moolenaar  " clean up
30663e82db6SBram Moolenaar  %d_
30763e82db6SBram Moolenaar  set bs&vim
30815993ce9SBram Moolenaarendfunc
3096d3a1940SBram Moolenaar
31081b1ba4bSBram Moolenaarfunc Test_Visual_word_textobject()
31181b1ba4bSBram Moolenaar  new
31281b1ba4bSBram Moolenaar  call setline(1, ['First sentence. Second sentence.'])
31381b1ba4bSBram Moolenaar
31481b1ba4bSBram Moolenaar  " When start and end of visual area are identical, 'aw' or 'iw' select
31581b1ba4bSBram Moolenaar  " the whole word.
31681b1ba4bSBram Moolenaar  norm! 1go2fcvawy
31781b1ba4bSBram Moolenaar  call assert_equal('Second ', @")
31881b1ba4bSBram Moolenaar  norm! 1go2fcviwy
31981b1ba4bSBram Moolenaar  call assert_equal('Second', @")
32081b1ba4bSBram Moolenaar
32181b1ba4bSBram Moolenaar  " When start and end of visual area are not identical, 'aw' or 'iw'
32281b1ba4bSBram Moolenaar  " extend the word in direction of the end of the visual area.
32381b1ba4bSBram Moolenaar  norm! 1go2fcvlawy
32481b1ba4bSBram Moolenaar  call assert_equal('cond ', @")
32581b1ba4bSBram Moolenaar  norm! gv2awy
32681b1ba4bSBram Moolenaar  call assert_equal('cond sentence.', @")
32781b1ba4bSBram Moolenaar
32881b1ba4bSBram Moolenaar  norm! 1go2fcvliwy
32981b1ba4bSBram Moolenaar  call assert_equal('cond', @")
33081b1ba4bSBram Moolenaar  norm! gv2iwy
33181b1ba4bSBram Moolenaar  call assert_equal('cond sentence', @")
33281b1ba4bSBram Moolenaar
33381b1ba4bSBram Moolenaar  " Extend visual area in opposite direction.
33481b1ba4bSBram Moolenaar  norm! 1go2fcvhawy
33581b1ba4bSBram Moolenaar  call assert_equal(' Sec', @")
33681b1ba4bSBram Moolenaar  norm! gv2awy
33781b1ba4bSBram Moolenaar  call assert_equal(' sentence. Sec', @")
33881b1ba4bSBram Moolenaar
33981b1ba4bSBram Moolenaar  norm! 1go2fcvhiwy
34081b1ba4bSBram Moolenaar  call assert_equal('Sec', @")
34181b1ba4bSBram Moolenaar  norm! gv2iwy
34281b1ba4bSBram Moolenaar  call assert_equal('. Sec', @")
34381b1ba4bSBram Moolenaar
34481b1ba4bSBram Moolenaar  bwipe!
34581b1ba4bSBram Moolenaarendfunc
34681b1ba4bSBram Moolenaar
3476d3a1940SBram Moolenaarfunc Test_Visual_sentence_textobject()
3486d3a1940SBram Moolenaar  new
34981b1ba4bSBram Moolenaar  call setline(1, ['First sentence. Second sentence. Third', 'sentence. Fourth sentence'])
3506d3a1940SBram Moolenaar
3516d3a1940SBram Moolenaar  " When start and end of visual area are identical, 'as' or 'is' select
3526d3a1940SBram Moolenaar  " the whole sentence.
3536d3a1940SBram Moolenaar  norm! 1gofdvasy
3546d3a1940SBram Moolenaar  call assert_equal('Second sentence. ', @")
3556d3a1940SBram Moolenaar  norm! 1gofdvisy
3566d3a1940SBram Moolenaar  call assert_equal('Second sentence.', @")
3576d3a1940SBram Moolenaar
3586d3a1940SBram Moolenaar  " When start and end of visual area are not identical, 'as' or 'is'
3596d3a1940SBram Moolenaar  " extend the sentence in direction of the end of the visual area.
3606d3a1940SBram Moolenaar  norm! 1gofdvlasy
3616d3a1940SBram Moolenaar  call assert_equal('d sentence. ', @")
3626d3a1940SBram Moolenaar  norm! gvasy
3636d3a1940SBram Moolenaar  call assert_equal("d sentence. Third\nsentence. ", @")
3646d3a1940SBram Moolenaar
3656d3a1940SBram Moolenaar  norm! 1gofdvlisy
3666d3a1940SBram Moolenaar  call assert_equal('d sentence.', @")
3676d3a1940SBram Moolenaar  norm! gvisy
3686d3a1940SBram Moolenaar  call assert_equal('d sentence. ', @")
3696d3a1940SBram Moolenaar  norm! gvisy
3706d3a1940SBram Moolenaar  call assert_equal("d sentence. Third\nsentence.", @")
3716d3a1940SBram Moolenaar
3726d3a1940SBram Moolenaar  " Extend visual area in opposite direction.
3736d3a1940SBram Moolenaar  norm! 1gofdvhasy
3746d3a1940SBram Moolenaar  call assert_equal(' Second', @")
3756d3a1940SBram Moolenaar  norm! gvasy
3766d3a1940SBram Moolenaar  call assert_equal("First sentence. Second", @")
3776d3a1940SBram Moolenaar
3786d3a1940SBram Moolenaar  norm! 1gofdvhisy
3796d3a1940SBram Moolenaar  call assert_equal('Second', @")
3806d3a1940SBram Moolenaar  norm! gvisy
3816d3a1940SBram Moolenaar  call assert_equal(' Second', @")
3826d3a1940SBram Moolenaar  norm! gvisy
3836d3a1940SBram Moolenaar  call assert_equal('First sentence. Second', @")
3846d3a1940SBram Moolenaar
3856d3a1940SBram Moolenaar  bwipe!
3866d3a1940SBram Moolenaarendfunc
38781b1ba4bSBram Moolenaar
38881b1ba4bSBram Moolenaarfunc Test_Visual_paragraph_textobject()
38981b1ba4bSBram Moolenaar  new
3908a9bc95eSBram Moolenaar  let lines =<< trim [END]
3918a9bc95eSBram Moolenaar    First line.
3928a9bc95eSBram Moolenaar
3938a9bc95eSBram Moolenaar    Second line.
3948a9bc95eSBram Moolenaar    Third line.
3958a9bc95eSBram Moolenaar    Fourth line.
3968a9bc95eSBram Moolenaar    Fifth line.
3978a9bc95eSBram Moolenaar
3988a9bc95eSBram Moolenaar    Sixth line.
3998a9bc95eSBram Moolenaar  [END]
4008a9bc95eSBram Moolenaar  call setline(1, lines)
40181b1ba4bSBram Moolenaar
40281b1ba4bSBram Moolenaar  " When start and end of visual area are identical, 'ap' or 'ip' select
40381b1ba4bSBram Moolenaar  " the whole paragraph.
40481b1ba4bSBram Moolenaar  norm! 4ggvapy
40581b1ba4bSBram Moolenaar  call assert_equal("Second line.\nThird line.\nFourth line.\nFifth line.\n\n", @")
40681b1ba4bSBram Moolenaar  norm! 4ggvipy
40781b1ba4bSBram Moolenaar  call assert_equal("Second line.\nThird line.\nFourth line.\nFifth line.\n", @")
40881b1ba4bSBram Moolenaar
40981b1ba4bSBram Moolenaar  " When start and end of visual area are not identical, 'ap' or 'ip'
41081b1ba4bSBram Moolenaar  " extend the sentence in direction of the end of the visual area.
41181b1ba4bSBram Moolenaar  " FIXME: actually, it is not sufficient to have different start and
41281b1ba4bSBram Moolenaar  " end of visual selection, the start line and end line have to differ,
41381b1ba4bSBram Moolenaar  " which is not consistent with the documentation.
41481b1ba4bSBram Moolenaar  norm! 4ggVjapy
41581b1ba4bSBram Moolenaar  call assert_equal("Third line.\nFourth line.\nFifth line.\n\n", @")
41681b1ba4bSBram Moolenaar  norm! gvapy
41781b1ba4bSBram Moolenaar  call assert_equal("Third line.\nFourth line.\nFifth line.\n\nSixth line.\n", @")
41881b1ba4bSBram Moolenaar  norm! 4ggVjipy
41981b1ba4bSBram Moolenaar  call assert_equal("Third line.\nFourth line.\nFifth line.\n", @")
42081b1ba4bSBram Moolenaar  norm! gvipy
42181b1ba4bSBram Moolenaar  call assert_equal("Third line.\nFourth line.\nFifth line.\n\n", @")
42281b1ba4bSBram Moolenaar  norm! gvipy
42381b1ba4bSBram Moolenaar  call assert_equal("Third line.\nFourth line.\nFifth line.\n\nSixth line.\n", @")
42481b1ba4bSBram Moolenaar
42581b1ba4bSBram Moolenaar  " Extend visual area in opposite direction.
42681b1ba4bSBram Moolenaar  norm! 5ggVkapy
42781b1ba4bSBram Moolenaar  call assert_equal("\nSecond line.\nThird line.\nFourth line.\n", @")
42881b1ba4bSBram Moolenaar  norm! gvapy
42981b1ba4bSBram Moolenaar  call assert_equal("First line.\n\nSecond line.\nThird line.\nFourth line.\n", @")
43081b1ba4bSBram Moolenaar  norm! 5ggVkipy
43181b1ba4bSBram Moolenaar  call assert_equal("Second line.\nThird line.\nFourth line.\n", @")
43281b1ba4bSBram Moolenaar  norma gvipy
43381b1ba4bSBram Moolenaar  call assert_equal("\nSecond line.\nThird line.\nFourth line.\n", @")
43481b1ba4bSBram Moolenaar  norm! gvipy
43581b1ba4bSBram Moolenaar  call assert_equal("First line.\n\nSecond line.\nThird line.\nFourth line.\n", @")
43681b1ba4bSBram Moolenaar
43781b1ba4bSBram Moolenaar  bwipe!
43881b1ba4bSBram Moolenaarendfunc
43919a66858SBram Moolenaar
44019a66858SBram Moolenaarfunc Test_curswant_not_changed()
44119a66858SBram Moolenaar  new
44219a66858SBram Moolenaar  call setline(1, ['one', 'two'])
44319a66858SBram Moolenaar  au InsertLeave * call getcurpos()
44419a66858SBram Moolenaar  call feedkeys("gg0\<C-V>jI123 \<Esc>j", 'xt')
44519a66858SBram Moolenaar  call assert_equal([0, 2, 1, 0, 1], getcurpos())
44619a66858SBram Moolenaar
44719a66858SBram Moolenaar  bwipe!
44819a66858SBram Moolenaar  au! InsertLeave
44919a66858SBram Moolenaarendfunc
450c6b37db1SBram Moolenaar
451c6b37db1SBram Moolenaar" Tests for "vaBiB", end could be wrong.
452c6b37db1SBram Moolenaarfunc Test_Visual_Block()
453c6b37db1SBram Moolenaar  new
454c6b37db1SBram Moolenaar  a
455c6b37db1SBram Moolenaar- Bug in "vPPPP" on this text:
456c6b37db1SBram Moolenaar	{
457c6b37db1SBram Moolenaar		cmd;
458c6b37db1SBram Moolenaar		{
459c6b37db1SBram Moolenaar			cmd;\t/* <-- Start cursor here */
460c6b37db1SBram Moolenaar			{
461c6b37db1SBram Moolenaar			}
462c6b37db1SBram Moolenaar		}
463c6b37db1SBram Moolenaar	}
464c6b37db1SBram Moolenaar.
465c6b37db1SBram Moolenaar  normal gg
466c6b37db1SBram Moolenaar  call search('Start cursor here')
467c6b37db1SBram Moolenaar  normal vaBiBD
468c6b37db1SBram Moolenaar  call assert_equal(['- Bug in "vPPPP" on this text:',
469c6b37db1SBram Moolenaar	      \ "\t{",
470c6b37db1SBram Moolenaar	      \ "\t}"], getline(1, '$'))
471c6b37db1SBram Moolenaar
472c6b37db1SBram Moolenaar  close!
473c6b37db1SBram Moolenaarendfunc
4746f1f0ca3SBram Moolenaar
4756f1f0ca3SBram Moolenaar" Test for 'p'ut in visual block mode
4766f1f0ca3SBram Moolenaarfunc Test_visual_block_put()
4773e72dcadSBram Moolenaar  new
4786f1f0ca3SBram Moolenaar  call append(0, ['One', 'Two', 'Three'])
4796f1f0ca3SBram Moolenaar  normal gg
4806f1f0ca3SBram Moolenaar  yank
4816f1f0ca3SBram Moolenaar  call feedkeys("jl\<C-V>ljp", 'xt')
4826f1f0ca3SBram Moolenaar  call assert_equal(['One', 'T', 'Tee', 'One', ''], getline(1, '$'))
4833e72dcadSBram Moolenaar  bw!
4846f1f0ca3SBram Moolenaarendfunc
4856f1f0ca3SBram Moolenaar
486309976ecSBram Moolenaar" Visual modes (v V CTRL-V) followed by an operator; count; repeating
487309976ecSBram Moolenaarfunc Test_visual_mode_op()
488309976ecSBram Moolenaar  new
489309976ecSBram Moolenaar  call append(0, '')
490309976ecSBram Moolenaar
491309976ecSBram Moolenaar  call setline(1, 'apple banana cherry')
492309976ecSBram Moolenaar  call cursor(1, 1)
493309976ecSBram Moolenaar  normal lvld.l3vd.
494309976ecSBram Moolenaar  call assert_equal('a y', getline(1))
495309976ecSBram Moolenaar
496309976ecSBram Moolenaar  call setline(1, ['line 1 line 1', 'line 2 line 2', 'line 3 line 3',
497309976ecSBram Moolenaar        \ 'line 4 line 4', 'line 5 line 5', 'line 6 line 6'])
498309976ecSBram Moolenaar  call cursor(1, 1)
499309976ecSBram Moolenaar  exe "normal Vcnewline\<Esc>j.j2Vd."
500309976ecSBram Moolenaar  call assert_equal(['newline', 'newline'], getline(1, '$'))
501309976ecSBram Moolenaar
502309976ecSBram Moolenaar  call deletebufline('', 1, '$')
503309976ecSBram Moolenaar  call setline(1, ['xxxxxxxxxxxxx', 'xxxxxxxxxxxxx', 'xxxxxxxxxxxxx',
504309976ecSBram Moolenaar        \ 'xxxxxxxxxxxxx'])
505309976ecSBram Moolenaar  exe "normal \<C-V>jlc  \<Esc>l.l2\<C-V>c----\<Esc>l."
506309976ecSBram Moolenaar  call assert_equal(['    --------x',
507309976ecSBram Moolenaar        \ '    --------x',
508309976ecSBram Moolenaar        \ 'xxxx--------x',
509309976ecSBram Moolenaar        \ 'xxxx--------x'], getline(1, '$'))
510309976ecSBram Moolenaar
511309976ecSBram Moolenaar  bwipe!
512309976ecSBram Moolenaarendfunc
513309976ecSBram Moolenaar
514309976ecSBram Moolenaar" Visual mode maps (movement and text object)
515309976ecSBram Moolenaar" Visual mode maps; count; repeating
516309976ecSBram Moolenaar"   - Simple
517309976ecSBram Moolenaar"   - With an Ex command (custom text object)
518309976ecSBram Moolenaarfunc Test_visual_mode_maps()
519309976ecSBram Moolenaar  new
520309976ecSBram Moolenaar  call append(0, '')
521309976ecSBram Moolenaar
522309976ecSBram Moolenaar  func SelectInCaps()
523309976ecSBram Moolenaar    let [line1, col1] = searchpos('\u', 'bcnW')
524309976ecSBram Moolenaar    let [line2, col2] = searchpos('.\u', 'nW')
525309976ecSBram Moolenaar    call setpos("'<", [0, line1, col1, 0])
526309976ecSBram Moolenaar    call setpos("'>", [0, line2, col2, 0])
527309976ecSBram Moolenaar    normal! gv
528309976ecSBram Moolenaar  endfunction
529309976ecSBram Moolenaar
530309976ecSBram Moolenaar  vnoremap W /\u/s-1<CR>
531309976ecSBram Moolenaar  vnoremap iW :<C-U>call SelectInCaps()<CR>
532309976ecSBram Moolenaar
533309976ecSBram Moolenaar  call setline(1, 'KiwiRaspberryDateWatermelonPeach')
534309976ecSBram Moolenaar  call cursor(1, 1)
535309976ecSBram Moolenaar  exe "normal vWcNo\<Esc>l.fD2vd."
536309976ecSBram Moolenaar  call assert_equal('NoNoberryach', getline(1))
537309976ecSBram Moolenaar
538309976ecSBram Moolenaar  call setline(1, 'JambuRambutanBananaTangerineMango')
539309976ecSBram Moolenaar  call cursor(1, 1)
540309976ecSBram Moolenaar  exe "normal llviWc-\<Esc>l.l2vdl."
541309976ecSBram Moolenaar  call assert_equal('--ago', getline(1))
542309976ecSBram Moolenaar
543309976ecSBram Moolenaar  vunmap W
544309976ecSBram Moolenaar  vunmap iW
545309976ecSBram Moolenaar  bwipe!
546309976ecSBram Moolenaar  delfunc SelectInCaps
547309976ecSBram Moolenaarendfunc
548309976ecSBram Moolenaar
549309976ecSBram Moolenaar" Operator-pending mode maps (movement and text object)
550309976ecSBram Moolenaar"   - Simple
551309976ecSBram Moolenaar"   - With Ex command moving the cursor
552309976ecSBram Moolenaar"   - With Ex command and Visual selection (custom text object)
553309976ecSBram Moolenaarfunc Test_visual_oper_pending_mode_maps()
554309976ecSBram Moolenaar  new
555309976ecSBram Moolenaar  call append(0, '')
556309976ecSBram Moolenaar
557309976ecSBram Moolenaar  func MoveToCap()
558309976ecSBram Moolenaar    call search('\u', 'W')
559309976ecSBram Moolenaar  endfunction
560309976ecSBram Moolenaar
561309976ecSBram Moolenaar  func SelectInCaps()
562309976ecSBram Moolenaar    let [line1, col1] = searchpos('\u', 'bcnW')
563309976ecSBram Moolenaar    let [line2, col2] = searchpos('.\u', 'nW')
564309976ecSBram Moolenaar    call setpos("'<", [0, line1, col1, 0])
565309976ecSBram Moolenaar    call setpos("'>", [0, line2, col2, 0])
566309976ecSBram Moolenaar    normal! gv
567309976ecSBram Moolenaar  endfunction
568309976ecSBram Moolenaar
569309976ecSBram Moolenaar  onoremap W /\u/<CR>
570309976ecSBram Moolenaar  onoremap <Leader>W :<C-U>call MoveToCap()<CR>
571309976ecSBram Moolenaar  onoremap iW :<C-U>call SelectInCaps()<CR>
572309976ecSBram Moolenaar
573309976ecSBram Moolenaar  call setline(1, 'PineappleQuinceLoganberryOrangeGrapefruitKiwiZ')
574309976ecSBram Moolenaar  call cursor(1, 1)
575309976ecSBram Moolenaar  exe "normal cW-\<Esc>l.l2.l."
576309976ecSBram Moolenaar  call assert_equal('----Z', getline(1))
577309976ecSBram Moolenaar
578309976ecSBram Moolenaar  call setline(1, 'JuniperDurianZ')
579309976ecSBram Moolenaar  call cursor(1, 1)
580309976ecSBram Moolenaar  exe "normal g?\WfD."
581309976ecSBram Moolenaar  call assert_equal('WhavcreQhevnaZ', getline(1))
582309976ecSBram Moolenaar
583309976ecSBram Moolenaar  call setline(1, 'LemonNectarineZ')
584309976ecSBram Moolenaar  call cursor(1, 1)
585309976ecSBram Moolenaar  exe "normal yiWPlciWNew\<Esc>fr."
586309976ecSBram Moolenaar  call assert_equal('LemonNewNewZ', getline(1))
587309976ecSBram Moolenaar
588309976ecSBram Moolenaar  ounmap W
589309976ecSBram Moolenaar  ounmap <Leader>W
590309976ecSBram Moolenaar  ounmap iW
591309976ecSBram Moolenaar  bwipe!
592309976ecSBram Moolenaar  delfunc MoveToCap
593309976ecSBram Moolenaar  delfunc SelectInCaps
594309976ecSBram Moolenaarendfunc
595309976ecSBram Moolenaar
596309976ecSBram Moolenaar" Patch 7.3.879: Properly abort Operator-pending mode for "dv:<Esc>" etc.
597309976ecSBram Moolenaarfunc Test_op_pend_mode_abort()
598309976ecSBram Moolenaar  new
599309976ecSBram Moolenaar  call append(0, '')
600309976ecSBram Moolenaar
601309976ecSBram Moolenaar  call setline(1, ['zzzz', 'zzzz'])
602309976ecSBram Moolenaar  call cursor(1, 1)
603309976ecSBram Moolenaar
604309976ecSBram Moolenaar  exe "normal dV:\<CR>dv:\<CR>"
605309976ecSBram Moolenaar  call assert_equal(['zzz'], getline(1, 2))
606309976ecSBram Moolenaar  set nomodifiable
607309976ecSBram Moolenaar  call assert_fails('exe "normal d:\<CR>"', 'E21:')
608309976ecSBram Moolenaar  set modifiable
609309976ecSBram Moolenaar  call feedkeys("dv:\<Esc>dV:\<Esc>", 'xt')
610309976ecSBram Moolenaar  call assert_equal(['zzz'], getline(1, 2))
611309976ecSBram Moolenaar  set nomodifiable
612309976ecSBram Moolenaar  let v:errmsg = ''
613309976ecSBram Moolenaar  call feedkeys("d:\<Esc>", 'xt')
614309976ecSBram Moolenaar  call assert_true(v:errmsg !~# '^E21:')
615309976ecSBram Moolenaar  set modifiable
616309976ecSBram Moolenaar
617309976ecSBram Moolenaar  bwipe!
618309976ecSBram Moolenaarendfunc
619309976ecSBram Moolenaar
620309976ecSBram Moolenaarfunc Test_characterwise_visual_mode()
621309976ecSBram Moolenaar  new
622309976ecSBram Moolenaar
623309976ecSBram Moolenaar  " characterwise visual mode: replace last line
624309976ecSBram Moolenaar  $put ='a'
625309976ecSBram Moolenaar  let @" = 'x'
626309976ecSBram Moolenaar  normal v$p
627309976ecSBram Moolenaar  call assert_equal('x', getline('$'))
628309976ecSBram Moolenaar
629309976ecSBram Moolenaar  " characterwise visual mode: delete middle line
630309976ecSBram Moolenaar  call deletebufline('', 1, '$')
631309976ecSBram Moolenaar  call append('$', ['a', 'b', 'c'])
632309976ecSBram Moolenaar  normal G
633309976ecSBram Moolenaar  normal kkv$d
634309976ecSBram Moolenaar  call assert_equal(['', 'b', 'c'], getline(1, '$'))
635309976ecSBram Moolenaar
636309976ecSBram Moolenaar  " characterwise visual mode: delete middle two lines
637309976ecSBram Moolenaar  call deletebufline('', 1, '$')
638309976ecSBram Moolenaar  call append('$', ['a', 'b', 'c'])
639309976ecSBram Moolenaar  normal Gkkvj$d
640309976ecSBram Moolenaar  call assert_equal(['', 'c'], getline(1, '$'))
641309976ecSBram Moolenaar
642309976ecSBram Moolenaar  " characterwise visual mode: delete last line
643309976ecSBram Moolenaar  call deletebufline('', 1, '$')
644309976ecSBram Moolenaar  call append('$', ['a', 'b', 'c'])
645309976ecSBram Moolenaar  normal Gv$d
646309976ecSBram Moolenaar  call assert_equal(['', 'a', 'b', ''], getline(1, '$'))
647309976ecSBram Moolenaar
648309976ecSBram Moolenaar  " characterwise visual mode: delete last two lines
649309976ecSBram Moolenaar  call deletebufline('', 1, '$')
650309976ecSBram Moolenaar  call append('$', ['a', 'b', 'c'])
651309976ecSBram Moolenaar  normal Gkvj$d
652309976ecSBram Moolenaar  call assert_equal(['', 'a', ''], getline(1, '$'))
653309976ecSBram Moolenaar
6548a9bc95eSBram Moolenaar  " characterwise visual mode: use a count with the visual mode from the last
6558a9bc95eSBram Moolenaar  " line in the buffer
6568a9bc95eSBram Moolenaar  %d _
6578a9bc95eSBram Moolenaar  call setline(1, ['one', 'two', 'three', 'four'])
6588a9bc95eSBram Moolenaar  norm! vj$y
6598a9bc95eSBram Moolenaar  norm! G1vy
6608a9bc95eSBram Moolenaar  call assert_equal('four', @")
6618a9bc95eSBram Moolenaar
6623e72dcadSBram Moolenaar  " characterwise visual mode: replace a single character line and the eol
6633e72dcadSBram Moolenaar  %d _
6643e72dcadSBram Moolenaar  call setline(1, "a")
6653e72dcadSBram Moolenaar  normal v$rx
6663e72dcadSBram Moolenaar  call assert_equal(['x'], getline(1, '$'))
6673e72dcadSBram Moolenaar
668309976ecSBram Moolenaar  bwipe!
669309976ecSBram Moolenaarendfunc
670309976ecSBram Moolenaar
671309976ecSBram Moolenaarfunc Test_visual_mode_put()
672309976ecSBram Moolenaar  new
673309976ecSBram Moolenaar
674309976ecSBram Moolenaar  " v_p: replace last character with line register at middle line
675309976ecSBram Moolenaar  call append('$', ['aaa', 'bbb', 'ccc'])
676309976ecSBram Moolenaar  normal G
677309976ecSBram Moolenaar  -2yank
678309976ecSBram Moolenaar  normal k$vp
679309976ecSBram Moolenaar  call assert_equal(['', 'aaa', 'bb', 'aaa', '', 'ccc'], getline(1, '$'))
680309976ecSBram Moolenaar
681309976ecSBram Moolenaar  " v_p: replace last character with line register at middle line selecting
682309976ecSBram Moolenaar  " newline
683309976ecSBram Moolenaar  call deletebufline('', 1, '$')
684309976ecSBram Moolenaar  call append('$', ['aaa', 'bbb', 'ccc'])
685309976ecSBram Moolenaar  normal G
686309976ecSBram Moolenaar  -2yank
687309976ecSBram Moolenaar  normal k$v$p
688309976ecSBram Moolenaar  call assert_equal(['', 'aaa', 'bb', 'aaa', 'ccc'], getline(1, '$'))
689309976ecSBram Moolenaar
690309976ecSBram Moolenaar  " v_p: replace last character with line register at last line
691309976ecSBram Moolenaar  call deletebufline('', 1, '$')
692309976ecSBram Moolenaar  call append('$', ['aaa', 'bbb', 'ccc'])
693309976ecSBram Moolenaar  normal G
694309976ecSBram Moolenaar  -2yank
695309976ecSBram Moolenaar  normal $vp
696309976ecSBram Moolenaar  call assert_equal(['', 'aaa', 'bbb', 'cc', 'aaa', ''], getline(1, '$'))
697309976ecSBram Moolenaar
698309976ecSBram Moolenaar  " v_p: replace last character with line register at last line selecting
699309976ecSBram Moolenaar  " newline
700309976ecSBram Moolenaar  call deletebufline('', 1, '$')
701309976ecSBram Moolenaar  call append('$', ['aaa', 'bbb', 'ccc'])
702309976ecSBram Moolenaar  normal G
703309976ecSBram Moolenaar  -2yank
704309976ecSBram Moolenaar  normal $v$p
705309976ecSBram Moolenaar  call assert_equal(['', 'aaa', 'bbb', 'cc', 'aaa', ''], getline(1, '$'))
706309976ecSBram Moolenaar
707309976ecSBram Moolenaar  bwipe!
708309976ecSBram Moolenaarendfunc
709309976ecSBram Moolenaar
710515545e1SBram Moolenaarfunc Test_gv_with_exclusive_selection()
711309976ecSBram Moolenaar  new
712309976ecSBram Moolenaar
713515545e1SBram Moolenaar  " gv with exclusive selection after an operation
714309976ecSBram Moolenaar  call append('$', ['zzz ', 'äà '])
715309976ecSBram Moolenaar  set selection=exclusive
716309976ecSBram Moolenaar  normal Gkv3lyjv3lpgvcxxx
717309976ecSBram Moolenaar  call assert_equal(['', 'zzz ', 'xxx '], getline(1, '$'))
718309976ecSBram Moolenaar
719515545e1SBram Moolenaar  " gv with exclusive selection without an operation
720309976ecSBram Moolenaar  call deletebufline('', 1, '$')
721309976ecSBram Moolenaar  call append('$', 'zzz ')
722309976ecSBram Moolenaar  set selection=exclusive
723309976ecSBram Moolenaar  exe "normal G0v3l\<Esc>gvcxxx"
724309976ecSBram Moolenaar  call assert_equal(['', 'xxx '], getline(1, '$'))
725309976ecSBram Moolenaar
726309976ecSBram Moolenaar  set selection&vim
727309976ecSBram Moolenaar  bwipe!
728309976ecSBram Moolenaarendfunc
729309976ecSBram Moolenaar
7301f3e7d3bSBram Moolenaar" Tests for the visual block mode commands
7311f3e7d3bSBram Moolenaarfunc Test_visual_block_mode()
7321f3e7d3bSBram Moolenaar  new
7331f3e7d3bSBram Moolenaar  call append(0, '')
7341671f448SBram Moolenaar  call setline(1, repeat(['abcdefghijklm'], 5))
7351f3e7d3bSBram Moolenaar  call cursor(1, 1)
7361f3e7d3bSBram Moolenaar
7371f3e7d3bSBram Moolenaar  " Test shift-right of a block
7381f3e7d3bSBram Moolenaar  exe "normal jllll\<C-V>jj>wll\<C-V>jlll>"
7391f3e7d3bSBram Moolenaar  " Test shift-left of a block
7401f3e7d3bSBram Moolenaar  exe "normal G$hhhh\<C-V>kk<"
7411f3e7d3bSBram Moolenaar  " Test block-insert
7421f3e7d3bSBram Moolenaar  exe "normal Gkl\<C-V>kkkIxyz"
7431f3e7d3bSBram Moolenaar  " Test block-replace
7441f3e7d3bSBram Moolenaar  exe "normal Gllll\<C-V>kkklllrq"
7451f3e7d3bSBram Moolenaar  " Test block-change
7461f3e7d3bSBram Moolenaar  exe "normal G$khhh\<C-V>hhkkcmno"
7471f3e7d3bSBram Moolenaar  call assert_equal(['axyzbcdefghijklm',
7481f3e7d3bSBram Moolenaar        \ 'axyzqqqq   mno	      ghijklm',
7491f3e7d3bSBram Moolenaar        \ 'axyzqqqqef mno        ghijklm',
7501f3e7d3bSBram Moolenaar        \ 'axyzqqqqefgmnoklm',
7511f3e7d3bSBram Moolenaar        \ 'abcdqqqqijklm'], getline(1, 5))
7521f3e7d3bSBram Moolenaar
7531671f448SBram Moolenaar  " Test 'C' to change till the end of the line
7541671f448SBram Moolenaar  call cursor(3, 4)
7551671f448SBram Moolenaar  exe "normal! \<C-V>j3lCooo"
7561671f448SBram Moolenaar  call assert_equal(['axyooo', 'axyooo'], getline(3, 4))
7571671f448SBram Moolenaar
7581671f448SBram Moolenaar  " Test 'D' to delete till the end of the line
7591671f448SBram Moolenaar  call cursor(3, 3)
7601671f448SBram Moolenaar  exe "normal! \<C-V>j2lD"
7611671f448SBram Moolenaar  call assert_equal(['ax', 'ax'], getline(3, 4))
7621671f448SBram Moolenaar
7633e72dcadSBram Moolenaar  " Test block insert with a short line that ends before the block
7643e72dcadSBram Moolenaar  %d _
7653e72dcadSBram Moolenaar  call setline(1, ["  one", "a", "  two"])
7663e72dcadSBram Moolenaar  exe "normal gg\<C-V>2jIx"
7673e72dcadSBram Moolenaar  call assert_equal(["  xone", "a", "  xtwo"], getline(1, '$'))
7683e72dcadSBram Moolenaar
7693e72dcadSBram Moolenaar  " Test block append at EOL with '$' and without '$'
7703e72dcadSBram Moolenaar  %d _
7713e72dcadSBram Moolenaar  call setline(1, ["one", "a", "two"])
7723e72dcadSBram Moolenaar  exe "normal gg$\<C-V>2jAx"
7733e72dcadSBram Moolenaar  call assert_equal(["onex", "ax", "twox"], getline(1, '$'))
7743e72dcadSBram Moolenaar  %d _
7753e72dcadSBram Moolenaar  call setline(1, ["one", "a", "two"])
7763e72dcadSBram Moolenaar  exe "normal gg3l\<C-V>2jAx"
7773e72dcadSBram Moolenaar  call assert_equal(["onex", "a  x", "twox"], getline(1, '$'))
7783e72dcadSBram Moolenaar
7793e72dcadSBram Moolenaar  " Test block replace with an empty line in the middle and use $ to jump to
7803e72dcadSBram Moolenaar  " the end of the line.
7813e72dcadSBram Moolenaar  %d _
7823e72dcadSBram Moolenaar  call setline(1, ['one', '', 'two'])
7833e72dcadSBram Moolenaar  exe "normal gg$\<C-V>2jrx"
7843e72dcadSBram Moolenaar  call assert_equal(["onx", "", "twx"], getline(1, '$'))
7853e72dcadSBram Moolenaar
7863e72dcadSBram Moolenaar  " Test block replace with an empty line in the middle and move cursor to the
7873e72dcadSBram Moolenaar  " end of the line
7883e72dcadSBram Moolenaar  %d _
7893e72dcadSBram Moolenaar  call setline(1, ['one', '', 'two'])
7903e72dcadSBram Moolenaar  exe "normal gg2l\<C-V>2jrx"
7913e72dcadSBram Moolenaar  call assert_equal(["onx", "", "twx"], getline(1, '$'))
7923e72dcadSBram Moolenaar
7933e72dcadSBram Moolenaar  " Replace odd number of characters with a multibyte character
7943e72dcadSBram Moolenaar  %d _
7953e72dcadSBram Moolenaar  call setline(1, ['abcd', 'efgh'])
7963e72dcadSBram Moolenaar  exe "normal ggl\<C-V>2ljr\u1100"
7973e72dcadSBram Moolenaar  call assert_equal(["a\u1100 ", "e\u1100 "], getline(1, '$'))
7983e72dcadSBram Moolenaar
7993e72dcadSBram Moolenaar  " During visual block append, if the cursor moved outside of the selected
8003e72dcadSBram Moolenaar  " range, then the edit should not be applied to the block.
8013e72dcadSBram Moolenaar  %d _
8023e72dcadSBram Moolenaar  call setline(1, ['aaa', 'bbb', 'ccc'])
8033e72dcadSBram Moolenaar  exe "normal 2G\<C-V>jAx\<Up>"
8043e72dcadSBram Moolenaar  call assert_equal(['aaa', 'bxbb', 'ccc'], getline(1, '$'))
8053e72dcadSBram Moolenaar
8063e72dcadSBram Moolenaar  " During visual block append, if the cursor is moved before the start of the
8073e72dcadSBram Moolenaar  " block, then the new text should be appended there.
8083e72dcadSBram Moolenaar  %d _
8093e72dcadSBram Moolenaar  call setline(1, ['aaa', 'bbb', 'ccc'])
8103e72dcadSBram Moolenaar  exe "normal $\<C-V>2jA\<Left>x"
8114067bd36SBram Moolenaar  call assert_equal(['aaxa', 'bbxb', 'ccxc'], getline(1, '$'))
81259b26236SYegappan Lakshmanan  " Repeat the previous test but use 'l' to move the cursor instead of '$'
81359b26236SYegappan Lakshmanan  call setline(1, ['aaa', 'bbb', 'ccc'])
81459b26236SYegappan Lakshmanan  exe "normal! gg2l\<C-V>2jA\<Left>x"
81559b26236SYegappan Lakshmanan  call assert_equal(['aaxa', 'bbxb', 'ccxc'], getline(1, '$'))
8163e72dcadSBram Moolenaar
8173e72dcadSBram Moolenaar  " Change a characterwise motion to a blockwise motion using CTRL-V
8183e72dcadSBram Moolenaar  %d _
8193e72dcadSBram Moolenaar  call setline(1, ['123', '456', '789'])
8203e72dcadSBram Moolenaar  exe "normal ld\<C-V>j"
8213e72dcadSBram Moolenaar  call assert_equal(['13', '46', '789'], getline(1, '$'))
8223e72dcadSBram Moolenaar
8232ac7184dSYegappan Lakshmanan  " Test from ':help v_b_I_example'
8242ac7184dSYegappan Lakshmanan  %d _
8252ac7184dSYegappan Lakshmanan  setlocal tabstop=8 shiftwidth=4
8262ac7184dSYegappan Lakshmanan  let lines =<< trim END
8272ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
8282ac7184dSYegappan Lakshmanan    abc		defghijklmnopqrstuvwxyz
8292ac7184dSYegappan Lakshmanan    abcdef  ghi		jklmnopqrstuvwxyz
8302ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
8312ac7184dSYegappan Lakshmanan  END
8322ac7184dSYegappan Lakshmanan  call setline(1, lines)
8332ac7184dSYegappan Lakshmanan  exe "normal ggfo\<C-V>3jISTRING"
8342ac7184dSYegappan Lakshmanan  let expected =<< trim END
8352ac7184dSYegappan Lakshmanan    abcdefghijklmnSTRINGopqrstuvwxyz
8362ac7184dSYegappan Lakshmanan    abc	      STRING  defghijklmnopqrstuvwxyz
8372ac7184dSYegappan Lakshmanan    abcdef  ghi   STRING  	jklmnopqrstuvwxyz
8382ac7184dSYegappan Lakshmanan    abcdefghijklmnSTRINGopqrstuvwxyz
8392ac7184dSYegappan Lakshmanan  END
8402ac7184dSYegappan Lakshmanan  call assert_equal(expected, getline(1, '$'))
8412ac7184dSYegappan Lakshmanan
8422ac7184dSYegappan Lakshmanan  " Test from ':help v_b_A_example'
8432ac7184dSYegappan Lakshmanan  %d _
8442ac7184dSYegappan Lakshmanan  let lines =<< trim END
8452ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
8462ac7184dSYegappan Lakshmanan    abc		defghijklmnopqrstuvwxyz
8472ac7184dSYegappan Lakshmanan    abcdef  ghi		jklmnopqrstuvwxyz
8482ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
8492ac7184dSYegappan Lakshmanan  END
8502ac7184dSYegappan Lakshmanan  call setline(1, lines)
8512ac7184dSYegappan Lakshmanan  exe "normal ggfo\<C-V>3j$ASTRING"
8522ac7184dSYegappan Lakshmanan  let expected =<< trim END
8532ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyzSTRING
8542ac7184dSYegappan Lakshmanan    abc		defghijklmnopqrstuvwxyzSTRING
8552ac7184dSYegappan Lakshmanan    abcdef  ghi		jklmnopqrstuvwxyzSTRING
8562ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyzSTRING
8572ac7184dSYegappan Lakshmanan  END
8582ac7184dSYegappan Lakshmanan  call assert_equal(expected, getline(1, '$'))
8592ac7184dSYegappan Lakshmanan
8602ac7184dSYegappan Lakshmanan  " Test from ':help v_b_<_example'
8612ac7184dSYegappan Lakshmanan  %d _
8622ac7184dSYegappan Lakshmanan  let lines =<< trim END
8632ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
8642ac7184dSYegappan Lakshmanan    abc		defghijklmnopqrstuvwxyz
8652ac7184dSYegappan Lakshmanan    abcdef  ghi		jklmnopqrstuvwxyz
8662ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
8672ac7184dSYegappan Lakshmanan  END
8682ac7184dSYegappan Lakshmanan  call setline(1, lines)
8692ac7184dSYegappan Lakshmanan  exe "normal ggfo\<C-V>3j3l<.."
8702ac7184dSYegappan Lakshmanan  let expected =<< trim END
8712ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
8722ac7184dSYegappan Lakshmanan    abc	      defghijklmnopqrstuvwxyz
8732ac7184dSYegappan Lakshmanan    abcdef  ghi   jklmnopqrstuvwxyz
8742ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
8752ac7184dSYegappan Lakshmanan  END
8762ac7184dSYegappan Lakshmanan  call assert_equal(expected, getline(1, '$'))
8772ac7184dSYegappan Lakshmanan
8782ac7184dSYegappan Lakshmanan  " Test from ':help v_b_>_example'
8792ac7184dSYegappan Lakshmanan  %d _
8802ac7184dSYegappan Lakshmanan  let lines =<< trim END
8812ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
8822ac7184dSYegappan Lakshmanan    abc		defghijklmnopqrstuvwxyz
8832ac7184dSYegappan Lakshmanan    abcdef  ghi		jklmnopqrstuvwxyz
8842ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
8852ac7184dSYegappan Lakshmanan  END
8862ac7184dSYegappan Lakshmanan  call setline(1, lines)
8872ac7184dSYegappan Lakshmanan  exe "normal ggfo\<C-V>3j>.."
8882ac7184dSYegappan Lakshmanan  let expected =<< trim END
8892ac7184dSYegappan Lakshmanan    abcdefghijklmn		  opqrstuvwxyz
8902ac7184dSYegappan Lakshmanan    abc			    defghijklmnopqrstuvwxyz
8912ac7184dSYegappan Lakshmanan    abcdef  ghi			    jklmnopqrstuvwxyz
8922ac7184dSYegappan Lakshmanan    abcdefghijklmn		  opqrstuvwxyz
8932ac7184dSYegappan Lakshmanan  END
8942ac7184dSYegappan Lakshmanan  call assert_equal(expected, getline(1, '$'))
8952ac7184dSYegappan Lakshmanan
8962ac7184dSYegappan Lakshmanan  " Test from ':help v_b_r_example'
8972ac7184dSYegappan Lakshmanan  %d _
8982ac7184dSYegappan Lakshmanan  let lines =<< trim END
8992ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
9002ac7184dSYegappan Lakshmanan    abc		defghijklmnopqrstuvwxyz
9012ac7184dSYegappan Lakshmanan    abcdef  ghi		jklmnopqrstuvwxyz
9022ac7184dSYegappan Lakshmanan    abcdefghijklmnopqrstuvwxyz
9032ac7184dSYegappan Lakshmanan  END
9042ac7184dSYegappan Lakshmanan  call setline(1, lines)
9052ac7184dSYegappan Lakshmanan  exe "normal ggfo\<C-V>5l3jrX"
9062ac7184dSYegappan Lakshmanan  let expected =<< trim END
9072ac7184dSYegappan Lakshmanan    abcdefghijklmnXXXXXXuvwxyz
9082ac7184dSYegappan Lakshmanan    abc	      XXXXXXhijklmnopqrstuvwxyz
9092ac7184dSYegappan Lakshmanan    abcdef  ghi   XXXXXX    jklmnopqrstuvwxyz
9102ac7184dSYegappan Lakshmanan    abcdefghijklmnXXXXXXuvwxyz
9112ac7184dSYegappan Lakshmanan  END
9122ac7184dSYegappan Lakshmanan  call assert_equal(expected, getline(1, '$'))
9132ac7184dSYegappan Lakshmanan
9141f3e7d3bSBram Moolenaar  bwipe!
9152ac7184dSYegappan Lakshmanan  set tabstop& shiftwidth&
9161f3e7d3bSBram Moolenaarendfunc
9171f3e7d3bSBram Moolenaar
91821492743SBram Moolenaarfunc Test_visual_force_motion_feedkeys()
91921492743SBram Moolenaar    onoremap <expr> i- execute('let g:mode = mode(1)')->slice(0, 0)
92021492743SBram Moolenaar    call feedkeys('dvi-', 'x')
92121492743SBram Moolenaar    call assert_equal('nov', g:mode)
92221492743SBram Moolenaar    call feedkeys('di-', 'x')
92321492743SBram Moolenaar    call assert_equal('no', g:mode)
92421492743SBram Moolenaar    ounmap i-
92521492743SBram Moolenaarendfunc
92621492743SBram Moolenaar
9271f3e7d3bSBram Moolenaar" Test block-insert using cursor keys for movement
9281f3e7d3bSBram Moolenaarfunc Test_visual_block_insert_cursor_keys()
9291f3e7d3bSBram Moolenaar  new
9301f3e7d3bSBram Moolenaar  call append(0, ['aaaaaa', 'bbbbbb', 'cccccc', 'dddddd'])
9311f3e7d3bSBram Moolenaar  call cursor(1, 1)
9321f3e7d3bSBram Moolenaar
9331f3e7d3bSBram Moolenaar  exe "norm! l\<C-V>jjjlllI\<Right>\<Right>  \<Esc>"
9341f3e7d3bSBram Moolenaar  call assert_equal(['aaa  aaa', 'bbb  bbb', 'ccc  ccc', 'ddd  ddd'],
9351f3e7d3bSBram Moolenaar        \ getline(1, 4))
9361f3e7d3bSBram Moolenaar
9371f3e7d3bSBram Moolenaar  call deletebufline('', 1, '$')
9381f3e7d3bSBram Moolenaar  call setline(1, ['xaaa', 'bbbb', 'cccc', 'dddd'])
9391f3e7d3bSBram Moolenaar  call cursor(1, 1)
9401f3e7d3bSBram Moolenaar  exe "norm! \<C-V>jjjI<>\<Left>p\<Esc>"
9411f3e7d3bSBram Moolenaar  call assert_equal(['<p>xaaa', '<p>bbbb', '<p>cccc', '<p>dddd'],
9421f3e7d3bSBram Moolenaar        \ getline(1, 4))
9431f3e7d3bSBram Moolenaar  bwipe!
9441f3e7d3bSBram Moolenaarendfunc
9451f3e7d3bSBram Moolenaar
9461f3e7d3bSBram Moolenaarfunc Test_visual_block_create()
9471f3e7d3bSBram Moolenaar  new
9481f3e7d3bSBram Moolenaar  call append(0, '')
9491f3e7d3bSBram Moolenaar  " Test for Visual block was created with the last <C-v>$
9501f3e7d3bSBram Moolenaar  call setline(1, ['A23', '4567'])
9511f3e7d3bSBram Moolenaar  call cursor(1, 1)
9521f3e7d3bSBram Moolenaar  exe "norm! l\<C-V>j$Aab\<Esc>"
9531f3e7d3bSBram Moolenaar  call assert_equal(['A23ab', '4567ab'], getline(1, 2))
9541f3e7d3bSBram Moolenaar
9551f3e7d3bSBram Moolenaar  " Test for Visual block was created with the middle <C-v>$ (1)
9561f3e7d3bSBram Moolenaar  call deletebufline('', 1, '$')
9571f3e7d3bSBram Moolenaar  call setline(1, ['B23', '4567'])
9581f3e7d3bSBram Moolenaar  call cursor(1, 1)
9591f3e7d3bSBram Moolenaar  exe "norm! l\<C-V>j$hAab\<Esc>"
9601f3e7d3bSBram Moolenaar  call assert_equal(['B23 ab', '4567ab'], getline(1, 2))
9611f3e7d3bSBram Moolenaar
9621f3e7d3bSBram Moolenaar  " Test for Visual block was created with the middle <C-v>$ (2)
9631f3e7d3bSBram Moolenaar  call deletebufline('', 1, '$')
9641f3e7d3bSBram Moolenaar  call setline(1, ['C23', '4567'])
9651f3e7d3bSBram Moolenaar  call cursor(1, 1)
9661f3e7d3bSBram Moolenaar  exe "norm! l\<C-V>j$hhAab\<Esc>"
9671f3e7d3bSBram Moolenaar  call assert_equal(['C23ab', '456ab7'], getline(1, 2))
9681f3e7d3bSBram Moolenaar  bwipe!
9691f3e7d3bSBram Moolenaarendfunc
9701f3e7d3bSBram Moolenaar
9711f3e7d3bSBram Moolenaar" Test for Visual block insert when virtualedit=all
9721f3e7d3bSBram Moolenaarfunc Test_virtualedit_visual_block()
9731f3e7d3bSBram Moolenaar  set ve=all
9741f3e7d3bSBram Moolenaar  new
9751f3e7d3bSBram Moolenaar  call append(0, ["\t\tline1", "\t\tline2", "\t\tline3"])
9761f3e7d3bSBram Moolenaar  call cursor(1, 1)
9771f3e7d3bSBram Moolenaar  exe "norm! 07l\<C-V>jjIx\<Esc>"
9781f3e7d3bSBram Moolenaar  call assert_equal(["       x \tline1",
9791f3e7d3bSBram Moolenaar        \ "       x \tline2",
9801f3e7d3bSBram Moolenaar        \ "       x \tline3"], getline(1, 3))
9811f3e7d3bSBram Moolenaar
9821f3e7d3bSBram Moolenaar  " Test for Visual block append when virtualedit=all
9831f3e7d3bSBram Moolenaar  exe "norm! 012l\<C-v>jjAx\<Esc>"
9841f3e7d3bSBram Moolenaar  call assert_equal(['       x     x   line1',
9851f3e7d3bSBram Moolenaar        \ '       x     x   line2',
9861f3e7d3bSBram Moolenaar        \ '       x     x   line3'], getline(1, 3))
9871f3e7d3bSBram Moolenaar  set ve=
9881f3e7d3bSBram Moolenaar  bwipe!
9891f3e7d3bSBram Moolenaarendfunc
9901f3e7d3bSBram Moolenaar
9911f3e7d3bSBram Moolenaar" Test for changing case
9921f3e7d3bSBram Moolenaarfunc Test_visual_change_case()
9931f3e7d3bSBram Moolenaar  new
9941f3e7d3bSBram Moolenaar  " gUe must uppercase a whole word, also when ß changes to SS
9951f3e7d3bSBram Moolenaar  exe "normal Gothe youtußeuu end\<Esc>Ypk0wgUe\r"
9961f3e7d3bSBram Moolenaar  " gUfx must uppercase until x, inclusive.
9971f3e7d3bSBram Moolenaar  exe "normal O- youßtußexu -\<Esc>0fogUfx\r"
9981f3e7d3bSBram Moolenaar  " VU must uppercase a whole line
9991f3e7d3bSBram Moolenaar  exe "normal YpkVU\r"
10001f3e7d3bSBram Moolenaar  " same, when it's the last line in the buffer
10011f3e7d3bSBram Moolenaar  exe "normal YPGi111\<Esc>VUddP\r"
10021f3e7d3bSBram Moolenaar  " Uppercase two lines
10031f3e7d3bSBram Moolenaar  exe "normal Oblah di\rdoh dut\<Esc>VkUj\r"
10041f3e7d3bSBram Moolenaar  " Uppercase part of two lines
10051f3e7d3bSBram Moolenaar  exe "normal ddppi333\<Esc>k0i222\<Esc>fyllvjfuUk"
10061f3e7d3bSBram Moolenaar  call assert_equal(['the YOUTUSSEUU end', '- yOUSSTUSSEXu -',
10071f3e7d3bSBram Moolenaar        \ 'THE YOUTUSSEUU END', '111THE YOUTUSSEUU END', 'BLAH DI', 'DOH DUT',
10081f3e7d3bSBram Moolenaar        \ '222the yoUTUSSEUU END', '333THE YOUTUßeuu end'], getline(2, '$'))
10091f3e7d3bSBram Moolenaar  bwipe!
10101f3e7d3bSBram Moolenaarendfunc
10111f3e7d3bSBram Moolenaar
10121f3e7d3bSBram Moolenaar" Test for Visual replace using Enter or NL
10131f3e7d3bSBram Moolenaarfunc Test_visual_replace_crnl()
10141f3e7d3bSBram Moolenaar  new
10151f3e7d3bSBram Moolenaar  exe "normal G3o123456789\e2k05l\<C-V>2jr\r"
10161f3e7d3bSBram Moolenaar  exe "normal G3o98765\e2k02l\<C-V>2jr\<C-V>\r\n"
10171f3e7d3bSBram Moolenaar  exe "normal G3o123456789\e2k05l\<C-V>2jr\n"
10181f3e7d3bSBram Moolenaar  exe "normal G3o98765\e2k02l\<C-V>2jr\<C-V>\n"
10191f3e7d3bSBram Moolenaar  call assert_equal(['12345', '789', '12345', '789', '12345', '789', "98\r65",
10201f3e7d3bSBram Moolenaar        \ "98\r65", "98\r65", '12345', '789', '12345', '789', '12345', '789',
10211f3e7d3bSBram Moolenaar        \ "98\n65", "98\n65", "98\n65"], getline(2, '$'))
10221f3e7d3bSBram Moolenaar  bwipe!
10231f3e7d3bSBram Moolenaarendfunc
10241f3e7d3bSBram Moolenaar
10251f3e7d3bSBram Moolenaarfunc Test_ve_block_curpos()
10261f3e7d3bSBram Moolenaar  new
10271f3e7d3bSBram Moolenaar  " Test cursor position. When ve=block and Visual block mode and $gj
10281f3e7d3bSBram Moolenaar  call append(0, ['12345', '789'])
10291f3e7d3bSBram Moolenaar  call cursor(1, 3)
10301f3e7d3bSBram Moolenaar  set virtualedit=block
10311f3e7d3bSBram Moolenaar  exe "norm! \<C-V>$gj\<Esc>"
10321f3e7d3bSBram Moolenaar  call assert_equal([0, 2, 4, 0], getpos("'>"))
10331f3e7d3bSBram Moolenaar  set virtualedit=
10341f3e7d3bSBram Moolenaar  bwipe!
10351f3e7d3bSBram Moolenaarendfunc
10361f3e7d3bSBram Moolenaar
10371f3e7d3bSBram Moolenaar" Test for block_insert when replacing spaces in front of the a with tabs
10381f3e7d3bSBram Moolenaarfunc Test_block_insert_replace_tabs()
10391f3e7d3bSBram Moolenaar  new
10401f3e7d3bSBram Moolenaar  set ts=8 sts=4 sw=4
10411f3e7d3bSBram Moolenaar  call append(0, ["#define BO_ALL\t    0x0001",
10421f3e7d3bSBram Moolenaar        \ "#define BO_BS\t    0x0002",
10431f3e7d3bSBram Moolenaar        \ "#define BO_CRSR\t    0x0004"])
10441f3e7d3bSBram Moolenaar  call cursor(1, 1)
10451f3e7d3bSBram Moolenaar  exe "norm! f0\<C-V>2jI\<tab>\<esc>"
10461f3e7d3bSBram Moolenaar  call assert_equal([
10471f3e7d3bSBram Moolenaar        \ "#define BO_ALL\t\t0x0001",
10481f3e7d3bSBram Moolenaar        \ "#define BO_BS\t    \t0x0002",
10491f3e7d3bSBram Moolenaar        \ "#define BO_CRSR\t    \t0x0004", ''], getline(1, '$'))
10501f3e7d3bSBram Moolenaar  set ts& sts& sw&
10511f3e7d3bSBram Moolenaar  bwipe!
10521f3e7d3bSBram Moolenaarendfunc
10531f3e7d3bSBram Moolenaar
1054bc2b71d4SBram Moolenaar" Test for * register in :
1055bc2b71d4SBram Moolenaarfunc Test_star_register()
1056bc2b71d4SBram Moolenaar  call assert_fails('*bfirst', 'E16:')
1057bc2b71d4SBram Moolenaar  new
1058bc2b71d4SBram Moolenaar  call setline(1, ['foo', 'bar', 'baz', 'qux'])
1059bc2b71d4SBram Moolenaar  exe "normal jVj\<ESC>"
1060bc2b71d4SBram Moolenaar  *yank r
1061bc2b71d4SBram Moolenaar  call assert_equal("bar\nbaz\n", @r)
1062bc2b71d4SBram Moolenaar
1063bc2b71d4SBram Moolenaar  delmarks < >
1064bc2b71d4SBram Moolenaar  call assert_fails('*yank', 'E20:')
1065bc2b71d4SBram Moolenaar  close!
1066bc2b71d4SBram Moolenaarendfunc
1067bc2b71d4SBram Moolenaar
1068f5f1e10dSBram Moolenaar" Test for changing text in visual mode with 'exclusive' selection
1069f5f1e10dSBram Moolenaarfunc Test_exclusive_selection()
1070f5f1e10dSBram Moolenaar  new
1071f5f1e10dSBram Moolenaar  call setline(1, ['one', 'two'])
1072f5f1e10dSBram Moolenaar  set selection=exclusive
1073f5f1e10dSBram Moolenaar  call feedkeys("vwcabc", 'xt')
1074f5f1e10dSBram Moolenaar  call assert_equal('abctwo', getline(1))
1075f5f1e10dSBram Moolenaar  call setline(1, ["\tone"])
1076f5f1e10dSBram Moolenaar  set virtualedit=all
1077f5f1e10dSBram Moolenaar  call feedkeys('0v2lcl', 'xt')
1078f5f1e10dSBram Moolenaar  call assert_equal('l      one', getline(1))
1079f5f1e10dSBram Moolenaar  set virtualedit&
1080f5f1e10dSBram Moolenaar  set selection&
1081f5f1e10dSBram Moolenaar  close!
1082f5f1e10dSBram Moolenaarendfunc
1083f5f1e10dSBram Moolenaar
1084d1ad99b6SBram Moolenaar" Test for starting linewise visual with a count.
1085d1ad99b6SBram Moolenaar" This test needs to be run without any previous visual mode. Otherwise the
1086d1ad99b6SBram Moolenaar" count will use the count from the previous visual mode.
1087d1ad99b6SBram Moolenaarfunc Test_linewise_visual_with_count()
1088d1ad99b6SBram Moolenaar  let after =<< trim [CODE]
1089d1ad99b6SBram Moolenaar    call setline(1, ['one', 'two', 'three', 'four'])
1090d1ad99b6SBram Moolenaar    norm! 3Vy
1091d1ad99b6SBram Moolenaar    call assert_equal("one\ntwo\nthree\n", @")
1092d1ad99b6SBram Moolenaar    call writefile(v:errors, 'Xtestout')
1093d1ad99b6SBram Moolenaar    qall!
1094d1ad99b6SBram Moolenaar  [CODE]
1095d1ad99b6SBram Moolenaar  if RunVim([], after, '')
1096d1ad99b6SBram Moolenaar    call assert_equal([], readfile('Xtestout'))
1097d1ad99b6SBram Moolenaar    call delete('Xtestout')
1098d1ad99b6SBram Moolenaar  endif
1099d1ad99b6SBram Moolenaarendfunc
1100d1ad99b6SBram Moolenaar
1101d1ad99b6SBram Moolenaar" Test for starting characterwise visual with a count.
1102d1ad99b6SBram Moolenaar" This test needs to be run without any previous visual mode. Otherwise the
1103d1ad99b6SBram Moolenaar" count will use the count from the previous visual mode.
1104d1ad99b6SBram Moolenaarfunc Test_characterwise_visual_with_count()
1105d1ad99b6SBram Moolenaar  let after =<< trim [CODE]
1106d1ad99b6SBram Moolenaar    call setline(1, ['one two', 'three'])
1107d1ad99b6SBram Moolenaar    norm! l5vy
1108d1ad99b6SBram Moolenaar    call assert_equal("ne tw", @")
1109d1ad99b6SBram Moolenaar    call writefile(v:errors, 'Xtestout')
1110d1ad99b6SBram Moolenaar    qall!
1111d1ad99b6SBram Moolenaar  [CODE]
1112d1ad99b6SBram Moolenaar  if RunVim([], after, '')
1113d1ad99b6SBram Moolenaar    call assert_equal([], readfile('Xtestout'))
1114d1ad99b6SBram Moolenaar    call delete('Xtestout')
1115d1ad99b6SBram Moolenaar  endif
1116f5f1e10dSBram Moolenaarendfunc
1117f5f1e10dSBram Moolenaar
1118224a5f17SBram Moolenaar" Test for visually selecting an inner block (iB)
1119224a5f17SBram Moolenaarfunc Test_visual_inner_block()
1120224a5f17SBram Moolenaar  new
1121224a5f17SBram Moolenaar  call setline(1, ['one', '{', 'two', '{', 'three', '}', 'four', '}', 'five'])
1122224a5f17SBram Moolenaar  call cursor(5, 1)
1123224a5f17SBram Moolenaar  " visually select all the lines in the block and then execute iB
1124224a5f17SBram Moolenaar  call feedkeys("ViB\<C-C>", 'xt')
1125224a5f17SBram Moolenaar  call assert_equal([0, 5, 1, 0], getpos("'<"))
1126224a5f17SBram Moolenaar  call assert_equal([0, 5, 6, 0], getpos("'>"))
1127224a5f17SBram Moolenaar  " visually select two inner blocks
1128224a5f17SBram Moolenaar  call feedkeys("ViBiB\<C-C>", 'xt')
1129224a5f17SBram Moolenaar  call assert_equal([0, 3, 1, 0], getpos("'<"))
1130224a5f17SBram Moolenaar  call assert_equal([0, 7, 5, 0], getpos("'>"))
1131224a5f17SBram Moolenaar  " try to select non-existing inner block
1132224a5f17SBram Moolenaar  call cursor(5, 1)
1133224a5f17SBram Moolenaar  call assert_beeps('normal ViBiBiB')
1134224a5f17SBram Moolenaar  " try to select a unclosed inner block
1135224a5f17SBram Moolenaar  8,9d
1136224a5f17SBram Moolenaar  call cursor(5, 1)
1137224a5f17SBram Moolenaar  call assert_beeps('normal ViBiB')
1138224a5f17SBram Moolenaar  close!
1139224a5f17SBram Moolenaarendfunc
1140224a5f17SBram Moolenaar
1141cd94277fSBram Moolenaarfunc Test_visual_put_in_block()
1142cd94277fSBram Moolenaar  new
1143cd94277fSBram Moolenaar  call setline(1, ['xxxx', 'y∞yy', 'zzzz'])
1144cd94277fSBram Moolenaar  normal 1G2yl
1145cd94277fSBram Moolenaar  exe "normal 1G2l\<C-V>jjlp"
1146cd94277fSBram Moolenaar  call assert_equal(['xxxx', 'y∞xx', 'zzxx'], getline(1, 3))
1147cd94277fSBram Moolenaar  bwipe!
1148cd94277fSBram Moolenaarendfunc
1149cd94277fSBram Moolenaar
11502fa9384cSChristian Brabandtfunc Test_visual_put_in_block_using_zp()
11512fa9384cSChristian Brabandt  new
11522fa9384cSChristian Brabandt  " paste using zP
11532fa9384cSChristian Brabandt  call setline(1, ['/path;text', '/path;text', '/path;text', '',
11542fa9384cSChristian Brabandt    \ '/subdir',
11552fa9384cSChristian Brabandt    \ '/longsubdir',
11562fa9384cSChristian Brabandt    \ '/longlongsubdir'])
11572fa9384cSChristian Brabandt  exe "normal! 5G\<c-v>2j$y"
11582fa9384cSChristian Brabandt  norm! 1Gf;zP
11592fa9384cSChristian Brabandt  call assert_equal(['/path/subdir;text', '/path/longsubdir;text', '/path/longlongsubdir;text'], getline(1, 3))
11602fa9384cSChristian Brabandt  %d
11612fa9384cSChristian Brabandt  " paste using zP
11622fa9384cSChristian Brabandt  call setline(1, ['/path;text', '/path;text', '/path;text', '',
11632fa9384cSChristian Brabandt    \ '/subdir',
11642fa9384cSChristian Brabandt    \ '/longsubdir',
11652fa9384cSChristian Brabandt    \ '/longlongsubdir'])
11662fa9384cSChristian Brabandt  exe "normal! 5G\<c-v>2j$y"
11672fa9384cSChristian Brabandt  norm! 1Gf;hzp
11682fa9384cSChristian Brabandt  call assert_equal(['/path/subdir;text', '/path/longsubdir;text', '/path/longlongsubdir;text'], getline(1, 3))
11692fa9384cSChristian Brabandt  bwipe!
11702fa9384cSChristian Brabandtendfunc
11712fa9384cSChristian Brabandt
1172544a38e4SChristian Brabandtfunc Test_visual_put_in_block_using_zy_and_zp()
1173544a38e4SChristian Brabandt  new
1174544a38e4SChristian Brabandt
1175544a38e4SChristian Brabandt  " Test 1) Paste using zp - after the cursor without trailing spaces
1176544a38e4SChristian Brabandt  call setline(1, ['/path;text', '/path;text', '/path;text', '',
1177544a38e4SChristian Brabandt    \ 'texttext  /subdir           columntext',
1178544a38e4SChristian Brabandt		\ 'texttext  /longsubdir       columntext',
1179544a38e4SChristian Brabandt    \ 'texttext  /longlongsubdir   columntext'])
1180544a38e4SChristian Brabandt  exe "normal! 5G0f/\<c-v>2jezy"
1181544a38e4SChristian Brabandt  norm! 1G0f;hzp
1182544a38e4SChristian Brabandt  call assert_equal(['/path/subdir;text', '/path/longsubdir;text', '/path/longlongsubdir;text'], getline(1, 3))
1183544a38e4SChristian Brabandt
1184544a38e4SChristian Brabandt  " Test 2) Paste using zP - in front of the cursor without trailing spaces
1185544a38e4SChristian Brabandt  %d
1186544a38e4SChristian Brabandt  call setline(1, ['/path;text', '/path;text', '/path;text', '',
1187544a38e4SChristian Brabandt    \ 'texttext  /subdir           columntext',
1188544a38e4SChristian Brabandt		\ 'texttext  /longsubdir       columntext',
1189544a38e4SChristian Brabandt    \ 'texttext  /longlongsubdir   columntext'])
1190544a38e4SChristian Brabandt  exe "normal! 5G0f/\<c-v>2jezy"
1191544a38e4SChristian Brabandt  norm! 1G0f;zP
1192544a38e4SChristian Brabandt  call assert_equal(['/path/subdir;text', '/path/longsubdir;text', '/path/longlongsubdir;text'], getline(1, 3))
1193544a38e4SChristian Brabandt
1194544a38e4SChristian Brabandt  " Test 3) Paste using p - with trailing spaces
1195544a38e4SChristian Brabandt  %d
1196544a38e4SChristian Brabandt  call setline(1, ['/path;text', '/path;text', '/path;text', '',
1197544a38e4SChristian Brabandt    \ 'texttext  /subdir           columntext',
1198544a38e4SChristian Brabandt		\ 'texttext  /longsubdir       columntext',
1199544a38e4SChristian Brabandt    \ 'texttext  /longlongsubdir   columntext'])
1200544a38e4SChristian Brabandt  exe "normal! 5G0f/\<c-v>2jezy"
1201544a38e4SChristian Brabandt  norm! 1G0f;hp
1202544a38e4SChristian Brabandt  call assert_equal(['/path/subdir        ;text', '/path/longsubdir    ;text', '/path/longlongsubdir;text'], getline(1, 3))
1203544a38e4SChristian Brabandt
1204544a38e4SChristian Brabandt  " Test 4) Paste using P - with trailing spaces
1205544a38e4SChristian Brabandt  %d
1206544a38e4SChristian Brabandt  call setline(1, ['/path;text', '/path;text', '/path;text', '',
1207544a38e4SChristian Brabandt    \ 'texttext  /subdir           columntext',
1208544a38e4SChristian Brabandt		\ 'texttext  /longsubdir       columntext',
1209544a38e4SChristian Brabandt    \ 'texttext  /longlongsubdir   columntext'])
1210544a38e4SChristian Brabandt  exe "normal! 5G0f/\<c-v>2jezy"
1211544a38e4SChristian Brabandt  norm! 1G0f;P
1212544a38e4SChristian Brabandt  call assert_equal(['/path/subdir        ;text', '/path/longsubdir    ;text', '/path/longlongsubdir;text'], getline(1, 3))
1213544a38e4SChristian Brabandt
1214544a38e4SChristian Brabandt  " Test 5) Yank with spaces inside the block
1215544a38e4SChristian Brabandt  %d
1216544a38e4SChristian Brabandt  call setline(1, ['/path;text', '/path;text', '/path;text', '',
1217544a38e4SChristian Brabandt    \ 'texttext  /sub    dir/           columntext',
1218544a38e4SChristian Brabandt    \ 'texttext  /lon    gsubdir/       columntext',
1219544a38e4SChristian Brabandt    \ 'texttext  /lon    glongsubdir/   columntext'])
1220544a38e4SChristian Brabandt  exe "normal! 5G0f/\<c-v>2jf/zy"
1221544a38e4SChristian Brabandt  norm! 1G0f;zP
1222544a38e4SChristian Brabandt  call assert_equal(['/path/sub    dir/;text', '/path/lon    gsubdir/;text', '/path/lon    glongsubdir/;text'], getline(1, 3))
1223544a38e4SChristian Brabandt  bwipe!
1224544a38e4SChristian Brabandtendfunc
1225544a38e4SChristian Brabandt
12267d7bcc6bSBram Moolenaarfunc Test_visual_put_blockedit_zy_and_zp()
12277d7bcc6bSBram Moolenaar  new
12287d7bcc6bSBram Moolenaar
12297d7bcc6bSBram Moolenaar  call setline(1, ['aa', 'bbbbb', 'ccc', '', 'XX', 'GGHHJ', 'RTZU'])
12307d7bcc6bSBram Moolenaar  exe "normal! gg0\<c-v>2j$zy"
12317d7bcc6bSBram Moolenaar  norm! 5gg0zP
12327d7bcc6bSBram Moolenaar  call assert_equal(['aa', 'bbbbb', 'ccc', '', 'aaXX', 'bbbbbGGHHJ', 'cccRTZU'], getline(1, 7))
12337d7bcc6bSBram Moolenaar  "
12347d7bcc6bSBram Moolenaar  " now with blockmode editing
12357d7bcc6bSBram Moolenaar  sil %d
12367d7bcc6bSBram Moolenaar  :set ve=block
12377d7bcc6bSBram Moolenaar  call setline(1, ['aa', 'bbbbb', 'ccc', '', 'XX', 'GGHHJ', 'RTZU'])
12387d7bcc6bSBram Moolenaar  exe "normal! gg0\<c-v>2j$zy"
12397d7bcc6bSBram Moolenaar  norm! 5gg0zP
12407d7bcc6bSBram Moolenaar  call assert_equal(['aa', 'bbbbb', 'ccc', '', 'aaXX', 'bbbbbGGHHJ', 'cccRTZU'], getline(1, 7))
12417d7bcc6bSBram Moolenaar  set ve&vim
12427d7bcc6bSBram Moolenaar  bw!
12437d7bcc6bSBram Moolenaarendfunc
12447d7bcc6bSBram Moolenaar
12459cee4a1cSBram Moolenaarfunc Test_visual_block_with_virtualedit()
12469cee4a1cSBram Moolenaar  CheckScreendump
12479cee4a1cSBram Moolenaar
12489cee4a1cSBram Moolenaar  let lines =<< trim END
12499cee4a1cSBram Moolenaar    call setline(1, ['aaaaaa', 'bbbb', 'cc'])
12509cee4a1cSBram Moolenaar    set virtualedit=block
12519cee4a1cSBram Moolenaar    normal G
12529cee4a1cSBram Moolenaar  END
12539cee4a1cSBram Moolenaar  call writefile(lines, 'XTest_block')
12549cee4a1cSBram Moolenaar
12559cee4a1cSBram Moolenaar  let buf = RunVimInTerminal('-S XTest_block', {'rows': 8, 'cols': 50})
12569cee4a1cSBram Moolenaar  call term_sendkeys(buf, "\<C-V>gg$")
12579cee4a1cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_visual_block_with_virtualedit', {})
12589cee4a1cSBram Moolenaar
1259b17ab86eSBram Moolenaar  call term_sendkeys(buf, "\<Esc>gg\<C-V>G$")
1260b17ab86eSBram Moolenaar  call VerifyScreenDump(buf, 'Test_visual_block_with_virtualedit2', {})
1261b17ab86eSBram Moolenaar
12629cee4a1cSBram Moolenaar  " clean up
12639cee4a1cSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
12649cee4a1cSBram Moolenaar  call StopVimInTerminal(buf)
12656c72fd51SDominique Pelle  call delete('XTest_block')
12669cee4a1cSBram Moolenaarendfunc
12679cee4a1cSBram Moolenaar
1268*615ddd53SBram Moolenaarfunc Test_visual_block_ctrl_w_f()
1269*615ddd53SBram Moolenaar  " Emtpy block selected in new buffer should not result in an error.
1270*615ddd53SBram Moolenaar  au! BufNew foo sil norm f
1271*615ddd53SBram Moolenaar  edit foo
1272*615ddd53SBram Moolenaar
1273*615ddd53SBram Moolenaar  au! BufNew
1274*615ddd53SBram Moolenaarendfunc
1275*615ddd53SBram Moolenaar
1276b07626d4SBram Moolenaarfunc Test_visual_reselect_with_count()
1277b07626d4SBram Moolenaar  " this was causing an illegal memory access
1278b07626d4SBram Moolenaar  let lines =<< trim END
1279b07626d4SBram Moolenaar
1280b07626d4SBram Moolenaar
1281b07626d4SBram Moolenaar
1282b07626d4SBram Moolenaar      :
1283b07626d4SBram Moolenaar      r<sfile>
1284b07626d4SBram Moolenaar      exe "%norm e3\<c-v>kr\t"
1285b07626d4SBram Moolenaar      :
1286b07626d4SBram Moolenaar
1287b07626d4SBram Moolenaar      :
1288b07626d4SBram Moolenaar  END
1289b07626d4SBram Moolenaar  call writefile(lines, 'XvisualReselect')
1290b07626d4SBram Moolenaar  source XvisualReselect
1291b07626d4SBram Moolenaar
1292b07626d4SBram Moolenaar  bwipe!
1293b07626d4SBram Moolenaar  call delete('XvisualReselect')
1294b07626d4SBram Moolenaarendfunc
1295b07626d4SBram Moolenaar
1296544a38e4SChristian Brabandt
12976f1f0ca3SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1298