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