187bc3f74SBram Moolenaar" Test for various Normal mode commands 287bc3f74SBram Moolenaar 3a84a3dd6SBram Moolenaarsource shared.vim 45a4c3082SBram Moolenaarsource check.vim 5ca68ae13SBram Moolenaarsource view_util.vim 6a84a3dd6SBram Moolenaar 71bbb6194SBram Moolenaarfunc Setup_NewWindow() 887bc3f74SBram Moolenaar 10new 987bc3f74SBram Moolenaar call setline(1, range(1,100)) 1087bc3f74SBram Moolenaarendfunc 1187bc3f74SBram Moolenaar 121bbb6194SBram Moolenaarfunc MyFormatExpr() 1387bc3f74SBram Moolenaar " Adds '->$' at lines having numbers followed by trailing whitespace 1487bc3f74SBram Moolenaar for ln in range(v:lnum, v:lnum+v:count-1) 1587bc3f74SBram Moolenaar let line = getline(ln) 1687bc3f74SBram Moolenaar if getline(ln) =~# '\d\s\+$' 1787bc3f74SBram Moolenaar call setline(ln, substitute(line, '\s\+$', '', '') . '->$') 1887bc3f74SBram Moolenaar endif 1987bc3f74SBram Moolenaar endfor 202931f2a5SBram Moolenaarendfunc 2187bc3f74SBram Moolenaar 221bbb6194SBram Moolenaarfunc CountSpaces(type, ...) 2387bc3f74SBram Moolenaar " for testing operatorfunc 2487bc3f74SBram Moolenaar " will count the number of spaces 2587bc3f74SBram Moolenaar " and return the result in g:a 2687bc3f74SBram Moolenaar let sel_save = &selection 2787bc3f74SBram Moolenaar let &selection = "inclusive" 2887bc3f74SBram Moolenaar let reg_save = @@ 2987bc3f74SBram Moolenaar 3087bc3f74SBram Moolenaar if a:0 " Invoked from Visual mode, use gv command. 3187bc3f74SBram Moolenaar silent exe "normal! gvy" 3287bc3f74SBram Moolenaar elseif a:type == 'line' 3387bc3f74SBram Moolenaar silent exe "normal! '[V']y" 3487bc3f74SBram Moolenaar else 3587bc3f74SBram Moolenaar silent exe "normal! `[v`]y" 3687bc3f74SBram Moolenaar endif 3787bc3f74SBram Moolenaar let g:a = strlen(substitute(@@, '[^ ]', '', 'g')) 3887bc3f74SBram Moolenaar let &selection = sel_save 3987bc3f74SBram Moolenaar let @@ = reg_save 402931f2a5SBram Moolenaarendfunc 412931f2a5SBram Moolenaar 421bbb6194SBram Moolenaarfunc OpfuncDummy(type, ...) 434a08b0dcSBram Moolenaar " for testing operatorfunc 444a08b0dcSBram Moolenaar let g:opt = &linebreak 454a08b0dcSBram Moolenaar 464a08b0dcSBram Moolenaar if a:0 " Invoked from Visual mode, use gv command. 474a08b0dcSBram Moolenaar silent exe "normal! gvy" 484a08b0dcSBram Moolenaar elseif a:type == 'line' 494a08b0dcSBram Moolenaar silent exe "normal! '[V']y" 504a08b0dcSBram Moolenaar else 514a08b0dcSBram Moolenaar silent exe "normal! `[v`]y" 524a08b0dcSBram Moolenaar endif 534a08b0dcSBram Moolenaar " Create a new dummy window 544a08b0dcSBram Moolenaar new 554a08b0dcSBram Moolenaar let g:bufnr = bufnr('%') 562931f2a5SBram Moolenaarendfunc 5787bc3f74SBram Moolenaar 581671f448SBram Moolenaarfunc Test_normal00_optrans() 5987bc3f74SBram Moolenaar new 6087bc3f74SBram Moolenaar call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line']) 6187bc3f74SBram Moolenaar 1 6287bc3f74SBram Moolenaar exe "norm! Sfoobar\<esc>" 6387bc3f74SBram Moolenaar call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$')) 6487bc3f74SBram Moolenaar 2 6587bc3f74SBram Moolenaar exe "norm! $vbsone" 6687bc3f74SBram Moolenaar call assert_equal(['foobar', '2 This is the second one', '3 this is the third line', ''], getline(1,'$')) 6787bc3f74SBram Moolenaar norm! VS Second line here 6887bc3f74SBram Moolenaar call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$')) 6987bc3f74SBram Moolenaar %d 7087bc3f74SBram Moolenaar call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line']) 7187bc3f74SBram Moolenaar call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line']) 7287bc3f74SBram Moolenaar 7387bc3f74SBram Moolenaar 1 7487bc3f74SBram Moolenaar norm! 2D 7587bc3f74SBram Moolenaar call assert_equal(['3 this is the third line', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$')) 7687bc3f74SBram Moolenaar set cpo+=# 7787bc3f74SBram Moolenaar norm! 4D 7887bc3f74SBram Moolenaar call assert_equal(['', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$')) 7987bc3f74SBram Moolenaar 8087bc3f74SBram Moolenaar " clean up 8187bc3f74SBram Moolenaar set cpo-=# 8287bc3f74SBram Moolenaar bw! 832931f2a5SBram Moolenaarendfunc 8487bc3f74SBram Moolenaar 851bbb6194SBram Moolenaarfunc Test_normal01_keymodel() 8687bc3f74SBram Moolenaar call Setup_NewWindow() 8787bc3f74SBram Moolenaar " Test 1: depending on 'keymodel' <s-down> does something different 882931f2a5SBram Moolenaar 50 8987bc3f74SBram Moolenaar call feedkeys("V\<S-Up>y", 'tx') 9087bc3f74SBram Moolenaar call assert_equal(['47', '48', '49', '50'], getline("'<", "'>")) 912931f2a5SBram Moolenaar set keymodel=startsel 922931f2a5SBram Moolenaar 50 9387bc3f74SBram Moolenaar call feedkeys("V\<S-Up>y", 'tx') 9487bc3f74SBram Moolenaar call assert_equal(['49', '50'], getline("'<", "'>")) 9587bc3f74SBram Moolenaar " Start visual mode when keymodel = startsel 962931f2a5SBram Moolenaar 50 9787bc3f74SBram Moolenaar call feedkeys("\<S-Up>y", 'tx') 9887bc3f74SBram Moolenaar call assert_equal(['49', '5'], getreg(0, 0, 1)) 991671f448SBram Moolenaar " Use the different Shift special keys 1001671f448SBram Moolenaar 50 1011671f448SBram Moolenaar call feedkeys("\<S-Right>\<S-Left>\<S-Up>\<S-Down>\<S-Home>\<S-End>y", 'tx') 1021671f448SBram Moolenaar call assert_equal(['50'], getline("'<", "'>")) 1031671f448SBram Moolenaar call assert_equal(['50', ''], getreg(0, 0, 1)) 1041671f448SBram Moolenaar 10587bc3f74SBram Moolenaar " Do not start visual mode when keymodel= 1062931f2a5SBram Moolenaar set keymodel= 1072931f2a5SBram Moolenaar 50 10887bc3f74SBram Moolenaar call feedkeys("\<S-Up>y$", 'tx') 10987bc3f74SBram Moolenaar call assert_equal(['42'], getreg(0, 0, 1)) 1102931f2a5SBram Moolenaar " Stop visual mode when keymodel=stopsel 1112931f2a5SBram Moolenaar set keymodel=stopsel 1122931f2a5SBram Moolenaar 50 1132931f2a5SBram Moolenaar call feedkeys("Vkk\<Up>yy", 'tx') 1142931f2a5SBram Moolenaar call assert_equal(['47'], getreg(0, 0, 1)) 1152931f2a5SBram Moolenaar 1162931f2a5SBram Moolenaar set keymodel= 1172931f2a5SBram Moolenaar 50 1182931f2a5SBram Moolenaar call feedkeys("Vkk\<Up>yy", 'tx') 1192931f2a5SBram Moolenaar call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1)) 12087bc3f74SBram Moolenaar 121d7e5e943SBram Moolenaar " Test for using special keys to start visual selection 122d7e5e943SBram Moolenaar %d 123d7e5e943SBram Moolenaar call setline(1, ['red fox tail', 'red fox tail', 'red fox tail']) 124d7e5e943SBram Moolenaar set keymodel=startsel 125d7e5e943SBram Moolenaar " Test for <S-PageUp> and <S-PageDown> 126d7e5e943SBram Moolenaar call cursor(1, 1) 127d7e5e943SBram Moolenaar call feedkeys("\<S-PageDown>y", 'xt') 128d7e5e943SBram Moolenaar call assert_equal([0, 1, 1, 0], getpos("'<")) 129d7e5e943SBram Moolenaar call assert_equal([0, 3, 1, 0], getpos("'>")) 130d7e5e943SBram Moolenaar call feedkeys("Gz\<CR>8|\<S-PageUp>y", 'xt') 131d7e5e943SBram Moolenaar call assert_equal([0, 2, 1, 0], getpos("'<")) 132d7e5e943SBram Moolenaar call assert_equal([0, 3, 8, 0], getpos("'>")) 133d7e5e943SBram Moolenaar " Test for <S-C-Home> and <S-C-End> 134d7e5e943SBram Moolenaar call cursor(2, 12) 135d7e5e943SBram Moolenaar call feedkeys("\<S-C-Home>y", 'xt') 136d7e5e943SBram Moolenaar call assert_equal([0, 1, 1, 0], getpos("'<")) 137d7e5e943SBram Moolenaar call assert_equal([0, 2, 12, 0], getpos("'>")) 138d7e5e943SBram Moolenaar call cursor(1, 4) 139d7e5e943SBram Moolenaar call feedkeys("\<S-C-End>y", 'xt') 140d7e5e943SBram Moolenaar call assert_equal([0, 1, 4, 0], getpos("'<")) 141d7e5e943SBram Moolenaar call assert_equal([0, 3, 13, 0], getpos("'>")) 142d7e5e943SBram Moolenaar " Test for <S-C-Left> and <S-C-Right> 143d7e5e943SBram Moolenaar call cursor(2, 5) 144d7e5e943SBram Moolenaar call feedkeys("\<S-C-Right>y", 'xt') 145d7e5e943SBram Moolenaar call assert_equal([0, 2, 5, 0], getpos("'<")) 146d7e5e943SBram Moolenaar call assert_equal([0, 2, 9, 0], getpos("'>")) 147d7e5e943SBram Moolenaar call cursor(2, 9) 148d7e5e943SBram Moolenaar call feedkeys("\<S-C-Left>y", 'xt') 149d7e5e943SBram Moolenaar call assert_equal([0, 2, 5, 0], getpos("'<")) 150d7e5e943SBram Moolenaar call assert_equal([0, 2, 9, 0], getpos("'>")) 151d7e5e943SBram Moolenaar 152d7e5e943SBram Moolenaar set keymodel& 153d7e5e943SBram Moolenaar 15487bc3f74SBram Moolenaar " clean up 15587bc3f74SBram Moolenaar bw! 15687bc3f74SBram Moolenaarendfunc 15787bc3f74SBram Moolenaar 1581bbb6194SBram Moolenaarfunc Test_normal03_join() 15987bc3f74SBram Moolenaar " basic join test 16087bc3f74SBram Moolenaar call Setup_NewWindow() 16187bc3f74SBram Moolenaar 50 16287bc3f74SBram Moolenaar norm! VJ 16387bc3f74SBram Moolenaar call assert_equal('50 51', getline('.')) 16487bc3f74SBram Moolenaar $ 16587bc3f74SBram Moolenaar norm! J 16687bc3f74SBram Moolenaar call assert_equal('100', getline('.')) 16787bc3f74SBram Moolenaar $ 16887bc3f74SBram Moolenaar norm! V9-gJ 16987bc3f74SBram Moolenaar call assert_equal('919293949596979899100', getline('.')) 17087bc3f74SBram Moolenaar call setline(1, range(1,100)) 17187bc3f74SBram Moolenaar $ 17287bc3f74SBram Moolenaar :j 10 17387bc3f74SBram Moolenaar call assert_equal('100', getline('.')) 174004a6781SBram Moolenaar call assert_beeps('normal GVJ') 17587bc3f74SBram Moolenaar " clean up 17687bc3f74SBram Moolenaar bw! 1772931f2a5SBram Moolenaarendfunc 17887bc3f74SBram Moolenaar 17987bc3f74SBram Moolenaar" basic filter test 180004a6781SBram Moolenaarfunc Test_normal04_filter() 18187bc3f74SBram Moolenaar " only test on non windows platform 182004a6781SBram Moolenaar CheckNotMSWindows 18387bc3f74SBram Moolenaar call Setup_NewWindow() 18487bc3f74SBram Moolenaar 1 18587bc3f74SBram Moolenaar call feedkeys("!!sed -e 's/^/| /'\n", 'tx') 18687bc3f74SBram Moolenaar call assert_equal('| 1', getline('.')) 18787bc3f74SBram Moolenaar 90 18887bc3f74SBram Moolenaar :sil :!echo one 18987bc3f74SBram Moolenaar call feedkeys('.', 'tx') 19087bc3f74SBram Moolenaar call assert_equal('| 90', getline('.')) 19187bc3f74SBram Moolenaar 95 19287bc3f74SBram Moolenaar set cpo+=! 19387bc3f74SBram Moolenaar " 2 <CR>, 1: for executing the command, 19487bc3f74SBram Moolenaar " 2: clear hit-enter-prompt 19587bc3f74SBram Moolenaar call feedkeys("!!\n", 'tx') 19687bc3f74SBram Moolenaar call feedkeys(":!echo one\n\n", 'tx') 19787bc3f74SBram Moolenaar call feedkeys(".", 'tx') 19887bc3f74SBram Moolenaar call assert_equal('one', getline('.')) 19987bc3f74SBram Moolenaar set cpo-=! 20087bc3f74SBram Moolenaar bw! 2012931f2a5SBram Moolenaarendfunc 20287bc3f74SBram Moolenaar 2031bbb6194SBram Moolenaarfunc Test_normal05_formatexpr() 20487bc3f74SBram Moolenaar " basic formatexpr test 20587bc3f74SBram Moolenaar call Setup_NewWindow() 20687bc3f74SBram Moolenaar %d_ 20787bc3f74SBram Moolenaar call setline(1, ['here: 1 ', '2', 'here: 3 ', '4', 'not here: ']) 20887bc3f74SBram Moolenaar 1 20987bc3f74SBram Moolenaar set formatexpr=MyFormatExpr() 21087bc3f74SBram Moolenaar norm! gqG 21187bc3f74SBram Moolenaar call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here: '], getline(1,'$')) 21287bc3f74SBram Moolenaar set formatexpr= 21387bc3f74SBram Moolenaar bw! 2142931f2a5SBram Moolenaarendfunc 21587bc3f74SBram Moolenaar 216d77f9d59SBram Moolenaarfunc Test_normal05_formatexpr_newbuf() 217d77f9d59SBram Moolenaar " Edit another buffer in the 'formatexpr' function 218d77f9d59SBram Moolenaar new 219d77f9d59SBram Moolenaar func! Format() 220d77f9d59SBram Moolenaar edit another 221d77f9d59SBram Moolenaar endfunc 222d77f9d59SBram Moolenaar set formatexpr=Format() 223d77f9d59SBram Moolenaar norm gqG 224d77f9d59SBram Moolenaar bw! 225d77f9d59SBram Moolenaar set formatexpr= 226d77f9d59SBram Moolenaarendfunc 227d77f9d59SBram Moolenaar 228d77f9d59SBram Moolenaarfunc Test_normal05_formatexpr_setopt() 229d77f9d59SBram Moolenaar " Change the 'formatexpr' value in the function 230d77f9d59SBram Moolenaar new 231d77f9d59SBram Moolenaar func! Format() 232d77f9d59SBram Moolenaar set formatexpr= 233d77f9d59SBram Moolenaar endfunc 234d77f9d59SBram Moolenaar set formatexpr=Format() 235d77f9d59SBram Moolenaar norm gqG 236d77f9d59SBram Moolenaar bw! 237d77f9d59SBram Moolenaar set formatexpr= 238d77f9d59SBram Moolenaarendfunc 239d77f9d59SBram Moolenaar 2402eaeaf3cSBram Moolenaar" When 'formatexpr' returns non-zero, internal formatting is used. 2412eaeaf3cSBram Moolenaarfunc Test_normal_formatexpr_returns_nonzero() 2422eaeaf3cSBram Moolenaar new 2432eaeaf3cSBram Moolenaar call setline(1, ['one', 'two']) 2442eaeaf3cSBram Moolenaar func! Format() 2452eaeaf3cSBram Moolenaar return 1 2462eaeaf3cSBram Moolenaar endfunc 2472eaeaf3cSBram Moolenaar setlocal formatexpr=Format() 2482eaeaf3cSBram Moolenaar normal VGgq 2492eaeaf3cSBram Moolenaar call assert_equal(['one two'], getline(1, '$')) 2502eaeaf3cSBram Moolenaar setlocal formatexpr= 2512eaeaf3cSBram Moolenaar delfunc Format 2522eaeaf3cSBram Moolenaar close! 2532eaeaf3cSBram Moolenaarendfunc 2542eaeaf3cSBram Moolenaar 25587bc3f74SBram Moolenaar" basic test for formatprg 256004a6781SBram Moolenaarfunc Test_normal06_formatprg() 25787bc3f74SBram Moolenaar " only test on non windows platform 258004a6781SBram Moolenaar CheckNotMSWindows 2599be7c04eSBram Moolenaar 26087bc3f74SBram Moolenaar " uses sed to number non-empty lines 26187bc3f74SBram Moolenaar call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/ /', '}'''], 'Xsed_format.sh') 26287bc3f74SBram Moolenaar call system('chmod +x ./Xsed_format.sh') 2639be7c04eSBram Moolenaar let text = ['a', '', 'c', '', ' ', 'd', 'e'] 2649be7c04eSBram Moolenaar let expected = ['1 a', '', '3 c', '', '5 ', '6 d', '7 e'] 2659be7c04eSBram Moolenaar 2669be7c04eSBram Moolenaar 10new 2679be7c04eSBram Moolenaar call setline(1, text) 26887bc3f74SBram Moolenaar set formatprg=./Xsed_format.sh 26987bc3f74SBram Moolenaar norm! gggqG 2709be7c04eSBram Moolenaar call assert_equal(expected, getline(1, '$')) 271004a6781SBram Moolenaar %d 2729be7c04eSBram Moolenaar 2739be7c04eSBram Moolenaar call setline(1, text) 2749be7c04eSBram Moolenaar set formatprg=donothing 2759be7c04eSBram Moolenaar setlocal formatprg=./Xsed_format.sh 2769be7c04eSBram Moolenaar norm! gggqG 2779be7c04eSBram Moolenaar call assert_equal(expected, getline(1, '$')) 278004a6781SBram Moolenaar %d 2799be7c04eSBram Moolenaar 280004a6781SBram Moolenaar " Check for the command-line ranges added to 'formatprg' 281004a6781SBram Moolenaar set formatprg=cat 282004a6781SBram Moolenaar call setline(1, ['one', 'two', 'three', 'four', 'five']) 283004a6781SBram Moolenaar call feedkeys('gggqG', 'xt') 284004a6781SBram Moolenaar call assert_equal('.,$!cat', @:) 285004a6781SBram Moolenaar call feedkeys('2Ggq2j', 'xt') 286004a6781SBram Moolenaar call assert_equal('.,.+2!cat', @:) 287004a6781SBram Moolenaar 288004a6781SBram Moolenaar bw! 28987bc3f74SBram Moolenaar " clean up 29087bc3f74SBram Moolenaar set formatprg= 2919be7c04eSBram Moolenaar setlocal formatprg= 29287bc3f74SBram Moolenaar call delete('Xsed_format.sh') 2932931f2a5SBram Moolenaarendfunc 29487bc3f74SBram Moolenaar 2951bbb6194SBram Moolenaarfunc Test_normal07_internalfmt() 29687bc3f74SBram Moolenaar " basic test for internal formmatter to textwidth of 12 29787bc3f74SBram Moolenaar let list=range(1,11) 29887bc3f74SBram Moolenaar call map(list, 'v:val." "') 29987bc3f74SBram Moolenaar 10new 30087bc3f74SBram Moolenaar call setline(1, list) 30187bc3f74SBram Moolenaar set tw=12 302004a6781SBram Moolenaar norm! ggVGgq 30387bc3f74SBram Moolenaar call assert_equal(['1 2 3', '4 5 6', '7 8 9', '10 11 '], getline(1, '$')) 30487bc3f74SBram Moolenaar " clean up 3059be7c04eSBram Moolenaar set tw=0 30687bc3f74SBram Moolenaar bw! 3072931f2a5SBram Moolenaarendfunc 30887bc3f74SBram Moolenaar 30987bc3f74SBram Moolenaar" basic tests for foldopen/folddelete 310004a6781SBram Moolenaarfunc Test_normal08_fold() 311004a6781SBram Moolenaar CheckFeature folding 31287bc3f74SBram Moolenaar call Setup_NewWindow() 31387bc3f74SBram Moolenaar 50 31487bc3f74SBram Moolenaar setl foldenable fdm=marker 31587bc3f74SBram Moolenaar " First fold 31687bc3f74SBram Moolenaar norm! V4jzf 31787bc3f74SBram Moolenaar " check that folds have been created 31887bc3f74SBram Moolenaar call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54)) 31987bc3f74SBram Moolenaar " Second fold 32087bc3f74SBram Moolenaar 46 32187bc3f74SBram Moolenaar norm! V10jzf 32287bc3f74SBram Moolenaar " check that folds have been created 32387bc3f74SBram Moolenaar call assert_equal('46/*{{{*/', getline(46)) 32487bc3f74SBram Moolenaar call assert_equal('60/*}}}*/', getline(60)) 32587bc3f74SBram Moolenaar norm! k 32687bc3f74SBram Moolenaar call assert_equal('45', getline('.')) 32787bc3f74SBram Moolenaar norm! j 32887bc3f74SBram Moolenaar call assert_equal('46/*{{{*/', getline('.')) 32987bc3f74SBram Moolenaar norm! j 33087bc3f74SBram Moolenaar call assert_equal('61', getline('.')) 33187bc3f74SBram Moolenaar norm! k 33287bc3f74SBram Moolenaar " open a fold 33387bc3f74SBram Moolenaar norm! Vzo 33487bc3f74SBram Moolenaar norm! k 33587bc3f74SBram Moolenaar call assert_equal('45', getline('.')) 33687bc3f74SBram Moolenaar norm! j 33787bc3f74SBram Moolenaar call assert_equal('46/*{{{*/', getline('.')) 33887bc3f74SBram Moolenaar norm! j 33987bc3f74SBram Moolenaar call assert_equal('47', getline('.')) 34087bc3f74SBram Moolenaar norm! k 34187bc3f74SBram Moolenaar norm! zcVzO 34287bc3f74SBram Moolenaar call assert_equal('46/*{{{*/', getline('.')) 34387bc3f74SBram Moolenaar norm! j 34487bc3f74SBram Moolenaar call assert_equal('47', getline('.')) 34587bc3f74SBram Moolenaar norm! j 34687bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 34787bc3f74SBram Moolenaar norm! j 34887bc3f74SBram Moolenaar call assert_equal('49', getline('.')) 34987bc3f74SBram Moolenaar norm! j 35087bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 35187bc3f74SBram Moolenaar norm! j 35287bc3f74SBram Moolenaar call assert_equal('51', getline('.')) 35387bc3f74SBram Moolenaar " delete folds 35487bc3f74SBram Moolenaar :46 35587bc3f74SBram Moolenaar " collapse fold 35687bc3f74SBram Moolenaar norm! V14jzC 35787bc3f74SBram Moolenaar " delete all folds recursively 35887bc3f74SBram Moolenaar norm! VzD 35987bc3f74SBram Moolenaar call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60)) 36087bc3f74SBram Moolenaar 36187bc3f74SBram Moolenaar " clean up 36287bc3f74SBram Moolenaar setl nofoldenable fdm=marker 36387bc3f74SBram Moolenaar bw! 3642931f2a5SBram Moolenaarendfunc 36587bc3f74SBram Moolenaar 3661bbb6194SBram Moolenaarfunc Test_normal09_operatorfunc() 36787bc3f74SBram Moolenaar " Test operatorfunc 36887bc3f74SBram Moolenaar call Setup_NewWindow() 36987bc3f74SBram Moolenaar " Add some spaces for counting 37087bc3f74SBram Moolenaar 50,60s/$/ / 37187bc3f74SBram Moolenaar unlet! g:a 37287bc3f74SBram Moolenaar let g:a=0 37387bc3f74SBram Moolenaar nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@ 37487bc3f74SBram Moolenaar vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR> 37587bc3f74SBram Moolenaar 50 37687bc3f74SBram Moolenaar norm V2j,, 37787bc3f74SBram Moolenaar call assert_equal(6, g:a) 37887bc3f74SBram Moolenaar norm V,, 37987bc3f74SBram Moolenaar call assert_equal(2, g:a) 38087bc3f74SBram Moolenaar norm ,,l 38187bc3f74SBram Moolenaar call assert_equal(0, g:a) 38287bc3f74SBram Moolenaar 50 38387bc3f74SBram Moolenaar exe "norm 0\<c-v>10j2l,," 38487bc3f74SBram Moolenaar call assert_equal(11, g:a) 38587bc3f74SBram Moolenaar 50 38687bc3f74SBram Moolenaar norm V10j,, 38787bc3f74SBram Moolenaar call assert_equal(22, g:a) 38887bc3f74SBram Moolenaar 389*777175b0SYegappan Lakshmanan " Use a lambda function for 'opfunc' 390*777175b0SYegappan Lakshmanan unmap <buffer> ,, 391*777175b0SYegappan Lakshmanan call cursor(1, 1) 392*777175b0SYegappan Lakshmanan let g:a=0 393*777175b0SYegappan Lakshmanan nmap <buffer><silent> ,, :set opfunc={type\ ->\ CountSpaces(type)}<CR>g@ 394*777175b0SYegappan Lakshmanan vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR> 395*777175b0SYegappan Lakshmanan 50 396*777175b0SYegappan Lakshmanan norm V2j,, 397*777175b0SYegappan Lakshmanan call assert_equal(6, g:a) 398*777175b0SYegappan Lakshmanan norm V,, 399*777175b0SYegappan Lakshmanan call assert_equal(2, g:a) 400*777175b0SYegappan Lakshmanan norm ,,l 401*777175b0SYegappan Lakshmanan call assert_equal(0, g:a) 402*777175b0SYegappan Lakshmanan 50 403*777175b0SYegappan Lakshmanan exe "norm 0\<c-v>10j2l,," 404*777175b0SYegappan Lakshmanan call assert_equal(11, g:a) 405*777175b0SYegappan Lakshmanan 50 406*777175b0SYegappan Lakshmanan norm V10j,, 407*777175b0SYegappan Lakshmanan call assert_equal(22, g:a) 408*777175b0SYegappan Lakshmanan 409*777175b0SYegappan Lakshmanan " use a partial function for 'opfunc' 410*777175b0SYegappan Lakshmanan let g:OpVal = 0 411*777175b0SYegappan Lakshmanan func! Test_opfunc1(x, y, type) 412*777175b0SYegappan Lakshmanan let g:OpVal = a:x + a:y 413*777175b0SYegappan Lakshmanan endfunc 414*777175b0SYegappan Lakshmanan set opfunc=function('Test_opfunc1',\ [5,\ 7]) 415*777175b0SYegappan Lakshmanan normal! g@l 416*777175b0SYegappan Lakshmanan call assert_equal(12, g:OpVal) 417*777175b0SYegappan Lakshmanan " delete the function and try to use g@ 418*777175b0SYegappan Lakshmanan delfunc Test_opfunc1 419*777175b0SYegappan Lakshmanan call test_garbagecollect_now() 420*777175b0SYegappan Lakshmanan call assert_fails('normal! g@l', 'E117:') 421*777175b0SYegappan Lakshmanan set opfunc= 422*777175b0SYegappan Lakshmanan 423*777175b0SYegappan Lakshmanan " use a funcref for 'opfunc' 424*777175b0SYegappan Lakshmanan let g:OpVal = 0 425*777175b0SYegappan Lakshmanan func! Test_opfunc2(x, y, type) 426*777175b0SYegappan Lakshmanan let g:OpVal = a:x + a:y 427*777175b0SYegappan Lakshmanan endfunc 428*777175b0SYegappan Lakshmanan set opfunc=funcref('Test_opfunc2',\ [4,\ 3]) 429*777175b0SYegappan Lakshmanan normal! g@l 430*777175b0SYegappan Lakshmanan call assert_equal(7, g:OpVal) 431*777175b0SYegappan Lakshmanan " delete the function and try to use g@ 432*777175b0SYegappan Lakshmanan delfunc Test_opfunc2 433*777175b0SYegappan Lakshmanan call test_garbagecollect_now() 434*777175b0SYegappan Lakshmanan call assert_fails('normal! g@l', 'E933:') 435*777175b0SYegappan Lakshmanan set opfunc= 436*777175b0SYegappan Lakshmanan 437*777175b0SYegappan Lakshmanan " Try to use a function with two arguments for 'operatorfunc' 438*777175b0SYegappan Lakshmanan let g:OpVal = 0 439*777175b0SYegappan Lakshmanan func! Test_opfunc3(x, y) 440*777175b0SYegappan Lakshmanan let g:OpVal = 4 441*777175b0SYegappan Lakshmanan endfunc 442*777175b0SYegappan Lakshmanan set opfunc=Test_opfunc3 443*777175b0SYegappan Lakshmanan call assert_fails('normal! g@l', 'E119:') 444*777175b0SYegappan Lakshmanan call assert_equal(0, g:OpVal) 445*777175b0SYegappan Lakshmanan set opfunc= 446*777175b0SYegappan Lakshmanan delfunc Test_opfunc3 447*777175b0SYegappan Lakshmanan unlet g:OpVal 448*777175b0SYegappan Lakshmanan 449*777175b0SYegappan Lakshmanan " Try to use a lambda function with two arguments for 'operatorfunc' 450*777175b0SYegappan Lakshmanan set opfunc={x,\ y\ ->\ 'done'} 451*777175b0SYegappan Lakshmanan call assert_fails('normal! g@l', 'E119:') 452*777175b0SYegappan Lakshmanan 45387bc3f74SBram Moolenaar " clean up 45487bc3f74SBram Moolenaar unmap <buffer> ,, 45587bc3f74SBram Moolenaar set opfunc= 4564a08b0dcSBram Moolenaar unlet! g:a 45787bc3f74SBram Moolenaar bw! 4582931f2a5SBram Moolenaarendfunc 45987bc3f74SBram Moolenaar 4601bbb6194SBram Moolenaarfunc Test_normal09a_operatorfunc() 4614a08b0dcSBram Moolenaar " Test operatorfunc 4624a08b0dcSBram Moolenaar call Setup_NewWindow() 4634a08b0dcSBram Moolenaar " Add some spaces for counting 4644a08b0dcSBram Moolenaar 50,60s/$/ / 4654a08b0dcSBram Moolenaar unlet! g:opt 4664a08b0dcSBram Moolenaar set linebreak 4674a08b0dcSBram Moolenaar nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@ 4684a08b0dcSBram Moolenaar 50 4694a08b0dcSBram Moolenaar norm ,,j 4704a08b0dcSBram Moolenaar exe "bd!" g:bufnr 4714a08b0dcSBram Moolenaar call assert_true(&linebreak) 4724a08b0dcSBram Moolenaar call assert_equal(g:opt, &linebreak) 4734a08b0dcSBram Moolenaar set nolinebreak 4744a08b0dcSBram Moolenaar norm ,,j 4754a08b0dcSBram Moolenaar exe "bd!" g:bufnr 4764a08b0dcSBram Moolenaar call assert_false(&linebreak) 4774a08b0dcSBram Moolenaar call assert_equal(g:opt, &linebreak) 4784a08b0dcSBram Moolenaar 4794a08b0dcSBram Moolenaar " clean up 4804a08b0dcSBram Moolenaar unmap <buffer> ,, 4814a08b0dcSBram Moolenaar set opfunc= 482ee4e0c1eSBram Moolenaar call assert_fails('normal Vg@', 'E774:') 4834a08b0dcSBram Moolenaar bw! 4844a08b0dcSBram Moolenaar unlet! g:opt 4854a08b0dcSBram Moolenaarendfunc 4864a08b0dcSBram Moolenaar 4871bbb6194SBram Moolenaarfunc Test_normal10_expand() 48887bc3f74SBram Moolenaar " Test for expand() 48987bc3f74SBram Moolenaar 10new 49087bc3f74SBram Moolenaar call setline(1, ['1', 'ifooar,,cbar']) 49187bc3f74SBram Moolenaar 2 49287bc3f74SBram Moolenaar norm! $ 49365f08474SBram Moolenaar call assert_equal('cbar', expand('<cword>')) 49465f08474SBram Moolenaar call assert_equal('ifooar,,cbar', expand('<cWORD>')) 49565f08474SBram Moolenaar 49665f08474SBram Moolenaar call setline(1, ['prx = list[idx];']) 49765f08474SBram Moolenaar 1 49865f08474SBram Moolenaar let expected = ['', 'prx', 'prx', 'prx', 49965f08474SBram Moolenaar \ 'list', 'list', 'list', 'list', 'list', 'list', 'list', 50065f08474SBram Moolenaar \ 'idx', 'idx', 'idx', 'idx', 50165f08474SBram Moolenaar \ 'list[idx]', 50265f08474SBram Moolenaar \ '];', 50365f08474SBram Moolenaar \ ] 50465f08474SBram Moolenaar for i in range(1, 16) 50565f08474SBram Moolenaar exe 'norm ' . i . '|' 50665f08474SBram Moolenaar call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i) 50765f08474SBram Moolenaar endfor 50865f08474SBram Moolenaar 509d7e5e943SBram Moolenaar " Test for <cexpr> in state.val and ptr->val 510d7e5e943SBram Moolenaar call setline(1, 'x = state.val;') 511d7e5e943SBram Moolenaar call cursor(1, 10) 512d7e5e943SBram Moolenaar call assert_equal('state.val', expand('<cexpr>')) 513d7e5e943SBram Moolenaar call setline(1, 'x = ptr->val;') 514d7e5e943SBram Moolenaar call cursor(1, 9) 515d7e5e943SBram Moolenaar call assert_equal('ptr->val', expand('<cexpr>')) 516d7e5e943SBram Moolenaar 517ae6f8651SBram Moolenaar if executable('echo') 518ae6f8651SBram Moolenaar " Test expand(`...`) i.e. backticks command expansion. 519077ff436SBram Moolenaar call assert_equal('abcde', expand('`echo abcde`')) 520ae6f8651SBram Moolenaar endif 521ae6f8651SBram Moolenaar 522ae6f8651SBram Moolenaar " Test expand(`=...`) i.e. backticks expression expansion 523ae6f8651SBram Moolenaar call assert_equal('5', expand('`=2+3`')) 5248b633135SBram Moolenaar call assert_equal('3.14', expand('`=3.14`')) 525ae6f8651SBram Moolenaar 52687bc3f74SBram Moolenaar " clean up 52787bc3f74SBram Moolenaar bw! 5282931f2a5SBram Moolenaarendfunc 52987bc3f74SBram Moolenaar 530d7e5e943SBram Moolenaar" Test for expand() in latin1 encoding 531d7e5e943SBram Moolenaarfunc Test_normal_expand_latin1() 532d7e5e943SBram Moolenaar new 533d7e5e943SBram Moolenaar let save_enc = &encoding 534d7e5e943SBram Moolenaar set encoding=latin1 535d7e5e943SBram Moolenaar call setline(1, 'val = item->color;') 536d7e5e943SBram Moolenaar call cursor(1, 11) 537d7e5e943SBram Moolenaar call assert_equal('color', expand("<cword>")) 538d7e5e943SBram Moolenaar call assert_equal('item->color', expand("<cexpr>")) 539d7e5e943SBram Moolenaar let &encoding = save_enc 540d7e5e943SBram Moolenaar bw! 541d7e5e943SBram Moolenaarendfunc 542d7e5e943SBram Moolenaar 5431bbb6194SBram Moolenaarfunc Test_normal11_showcmd() 54487bc3f74SBram Moolenaar " test for 'showcmd' 54587bc3f74SBram Moolenaar 10new 54687bc3f74SBram Moolenaar exe "norm! ofoobar\<esc>" 54787bc3f74SBram Moolenaar call assert_equal(2, line('$')) 54887bc3f74SBram Moolenaar set showcmd 54987bc3f74SBram Moolenaar exe "norm! ofoobar2\<esc>" 55087bc3f74SBram Moolenaar call assert_equal(3, line('$')) 55187bc3f74SBram Moolenaar exe "norm! VAfoobar3\<esc>" 55287bc3f74SBram Moolenaar call assert_equal(3, line('$')) 55387bc3f74SBram Moolenaar exe "norm! 0d3\<del>2l" 55487bc3f74SBram Moolenaar call assert_equal('obar2foobar3', getline('.')) 555d1ad99b6SBram Moolenaar " test for the visual block size displayed in the status line 556d1ad99b6SBram Moolenaar call setline(1, ['aaaaa', 'bbbbb', 'ccccc']) 557d1ad99b6SBram Moolenaar call feedkeys("ggl\<C-V>lljj", 'xt') 558d1ad99b6SBram Moolenaar redraw! 559d1ad99b6SBram Moolenaar call assert_match('3x3$', Screenline(&lines)) 560d1ad99b6SBram Moolenaar call feedkeys("\<C-V>", 'xt') 561d1ad99b6SBram Moolenaar " test for visually selecting a multi-byte character 562d1ad99b6SBram Moolenaar call setline(1, ["\U2206"]) 563d1ad99b6SBram Moolenaar call feedkeys("ggv", 'xt') 564d1ad99b6SBram Moolenaar redraw! 565d1ad99b6SBram Moolenaar call assert_match('1-3$', Screenline(&lines)) 566d1ad99b6SBram Moolenaar call feedkeys("v", 'xt') 567d7e5e943SBram Moolenaar " test for visually selecting the end of line 568d7e5e943SBram Moolenaar call setline(1, ["foobar"]) 569d7e5e943SBram Moolenaar call feedkeys("$vl", 'xt') 570d7e5e943SBram Moolenaar redraw! 571d7e5e943SBram Moolenaar call assert_match('2$', Screenline(&lines)) 572d7e5e943SBram Moolenaar call feedkeys("y", 'xt') 573d7e5e943SBram Moolenaar call assert_equal("r\n", @") 57487bc3f74SBram Moolenaar bw! 5752931f2a5SBram Moolenaarendfunc 57687bc3f74SBram Moolenaar 5771671f448SBram Moolenaar" Test for nv_error and normal command errors 5781bbb6194SBram Moolenaarfunc Test_normal12_nv_error() 57987bc3f74SBram Moolenaar 10new 58087bc3f74SBram Moolenaar call setline(1, range(1,5)) 58187bc3f74SBram Moolenaar " should not do anything, just beep 582f5f1e10dSBram Moolenaar call assert_beeps('exe "norm! <c-k>"') 58387bc3f74SBram Moolenaar call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$')) 584f5f1e10dSBram Moolenaar call assert_beeps('normal! G2dd') 585f5f1e10dSBram Moolenaar call assert_beeps("normal! g\<C-A>") 586f5f1e10dSBram Moolenaar call assert_beeps("normal! g\<C-X>") 587f5f1e10dSBram Moolenaar call assert_beeps("normal! g\<C-B>") 5881671f448SBram Moolenaar call assert_beeps("normal! vQ\<Esc>") 5891671f448SBram Moolenaar call assert_beeps("normal! 2[[") 5901671f448SBram Moolenaar call assert_beeps("normal! 2]]") 5911671f448SBram Moolenaar call assert_beeps("normal! 2[]") 5921671f448SBram Moolenaar call assert_beeps("normal! 2][") 5931671f448SBram Moolenaar call assert_beeps("normal! 4[z") 5941671f448SBram Moolenaar call assert_beeps("normal! 4]z") 5951671f448SBram Moolenaar call assert_beeps("normal! 4[c") 5961671f448SBram Moolenaar call assert_beeps("normal! 4]c") 5971671f448SBram Moolenaar call assert_beeps("normal! 200%") 5981671f448SBram Moolenaar call assert_beeps("normal! %") 5991671f448SBram Moolenaar call assert_beeps("normal! 2{") 6001671f448SBram Moolenaar call assert_beeps("normal! 2}") 6011671f448SBram Moolenaar call assert_beeps("normal! r\<Right>") 6021671f448SBram Moolenaar call assert_beeps("normal! 8ry") 6031671f448SBram Moolenaar call assert_beeps('normal! "@') 60487bc3f74SBram Moolenaar bw! 6052931f2a5SBram Moolenaarendfunc 60687bc3f74SBram Moolenaar 6071bbb6194SBram Moolenaarfunc Test_normal13_help() 60887bc3f74SBram Moolenaar " Test for F1 60987bc3f74SBram Moolenaar call assert_equal(1, winnr()) 61087bc3f74SBram Moolenaar call feedkeys("\<f1>", 'txi') 61187bc3f74SBram Moolenaar call assert_match('help\.txt', bufname('%')) 61287bc3f74SBram Moolenaar call assert_equal(2, winnr('$')) 61387bc3f74SBram Moolenaar bw! 6142931f2a5SBram Moolenaarendfunc 61587bc3f74SBram Moolenaar 6161bbb6194SBram Moolenaarfunc Test_normal14_page() 61787bc3f74SBram Moolenaar " basic test for Ctrl-F and Ctrl-B 61887bc3f74SBram Moolenaar call Setup_NewWindow() 61987bc3f74SBram Moolenaar exe "norm! \<c-f>" 62087bc3f74SBram Moolenaar call assert_equal('9', getline('.')) 62187bc3f74SBram Moolenaar exe "norm! 2\<c-f>" 62287bc3f74SBram Moolenaar call assert_equal('25', getline('.')) 62387bc3f74SBram Moolenaar exe "norm! 2\<c-b>" 62487bc3f74SBram Moolenaar call assert_equal('18', getline('.')) 62587bc3f74SBram Moolenaar 1 62687bc3f74SBram Moolenaar set scrolloff=5 62787bc3f74SBram Moolenaar exe "norm! 2\<c-f>" 62887bc3f74SBram Moolenaar call assert_equal('21', getline('.')) 62987bc3f74SBram Moolenaar exe "norm! \<c-b>" 63087bc3f74SBram Moolenaar call assert_equal('13', getline('.')) 63187bc3f74SBram Moolenaar 1 63287bc3f74SBram Moolenaar set scrolloff=99 63387bc3f74SBram Moolenaar exe "norm! \<c-f>" 63487bc3f74SBram Moolenaar call assert_equal('13', getline('.')) 63587bc3f74SBram Moolenaar set scrolloff=0 63687bc3f74SBram Moolenaar 100 63787bc3f74SBram Moolenaar exe "norm! $\<c-b>" 63887bc3f74SBram Moolenaar call assert_equal('92', getline('.')) 63987bc3f74SBram Moolenaar call assert_equal([0, 92, 1, 0, 1], getcurpos()) 64087bc3f74SBram Moolenaar 100 64187bc3f74SBram Moolenaar set nostartofline 64287bc3f74SBram Moolenaar exe "norm! $\<c-b>" 64387bc3f74SBram Moolenaar call assert_equal('92', getline('.')) 64487bc3f74SBram Moolenaar call assert_equal([0, 92, 2, 0, 2147483647], getcurpos()) 64587bc3f74SBram Moolenaar " cleanup 64687bc3f74SBram Moolenaar set startofline 64787bc3f74SBram Moolenaar bw! 6482931f2a5SBram Moolenaarendfunc 64987bc3f74SBram Moolenaar 6501bbb6194SBram Moolenaarfunc Test_normal14_page_eol() 651bc54f3f3SBram Moolenaar 10new 652bc54f3f3SBram Moolenaar norm oxxxxxxx 653bc54f3f3SBram Moolenaar exe "norm 2\<c-f>" 654bc54f3f3SBram Moolenaar " check with valgrind that cursor is put back in column 1 655bc54f3f3SBram Moolenaar exe "norm 2\<c-b>" 656bc54f3f3SBram Moolenaar bw! 657bc54f3f3SBram Moolenaarendfunc 658bc54f3f3SBram Moolenaar 6591671f448SBram Moolenaar" Test for errors with z command 6601671f448SBram Moolenaarfunc Test_normal_z_error() 6611671f448SBram Moolenaar call assert_beeps('normal! z2p') 6622fa9384cSChristian Brabandt call assert_beeps('normal! zq') 6631671f448SBram Moolenaarendfunc 6641671f448SBram Moolenaar 6651bbb6194SBram Moolenaarfunc Test_normal15_z_scroll_vert() 66687bc3f74SBram Moolenaar " basic test for z commands that scroll the window 66787bc3f74SBram Moolenaar call Setup_NewWindow() 66887bc3f74SBram Moolenaar 100 66987bc3f74SBram Moolenaar norm! >> 67087bc3f74SBram Moolenaar " Test for z<cr> 67187bc3f74SBram Moolenaar exe "norm! z\<cr>" 67287bc3f74SBram Moolenaar call assert_equal(' 100', getline('.')) 67387bc3f74SBram Moolenaar call assert_equal(100, winsaveview()['topline']) 67487bc3f74SBram Moolenaar call assert_equal([0, 100, 2, 0, 9], getcurpos()) 67587bc3f74SBram Moolenaar 67687bc3f74SBram Moolenaar " Test for zt 67787bc3f74SBram Moolenaar 21 67887bc3f74SBram Moolenaar norm! >>0zt 67987bc3f74SBram Moolenaar call assert_equal(' 21', getline('.')) 68087bc3f74SBram Moolenaar call assert_equal(21, winsaveview()['topline']) 68187bc3f74SBram Moolenaar call assert_equal([0, 21, 1, 0, 8], getcurpos()) 68287bc3f74SBram Moolenaar 68387bc3f74SBram Moolenaar " Test for zb 68487bc3f74SBram Moolenaar 30 68587bc3f74SBram Moolenaar norm! >>$ztzb 68687bc3f74SBram Moolenaar call assert_equal(' 30', getline('.')) 68787bc3f74SBram Moolenaar call assert_equal(30, winsaveview()['topline']+winheight(0)-1) 68887bc3f74SBram Moolenaar call assert_equal([0, 30, 3, 0, 2147483647], getcurpos()) 68987bc3f74SBram Moolenaar 69087bc3f74SBram Moolenaar " Test for z- 69187bc3f74SBram Moolenaar 1 69287bc3f74SBram Moolenaar 30 69387bc3f74SBram Moolenaar norm! 0z- 69487bc3f74SBram Moolenaar call assert_equal(' 30', getline('.')) 69587bc3f74SBram Moolenaar call assert_equal(30, winsaveview()['topline']+winheight(0)-1) 69687bc3f74SBram Moolenaar call assert_equal([0, 30, 2, 0, 9], getcurpos()) 69787bc3f74SBram Moolenaar 69887bc3f74SBram Moolenaar " Test for z{height}<cr> 69987bc3f74SBram Moolenaar call assert_equal(10, winheight(0)) 70087bc3f74SBram Moolenaar exe "norm! z12\<cr>" 70187bc3f74SBram Moolenaar call assert_equal(12, winheight(0)) 70287bc3f74SBram Moolenaar exe "norm! z10\<cr>" 70387bc3f74SBram Moolenaar call assert_equal(10, winheight(0)) 70487bc3f74SBram Moolenaar 70587bc3f74SBram Moolenaar " Test for z. 70687bc3f74SBram Moolenaar 1 70787bc3f74SBram Moolenaar 21 70887bc3f74SBram Moolenaar norm! 0z. 70987bc3f74SBram Moolenaar call assert_equal(' 21', getline('.')) 71087bc3f74SBram Moolenaar call assert_equal(17, winsaveview()['topline']) 71187bc3f74SBram Moolenaar call assert_equal([0, 21, 2, 0, 9], getcurpos()) 71287bc3f74SBram Moolenaar 71387bc3f74SBram Moolenaar " Test for zz 71487bc3f74SBram Moolenaar 1 71587bc3f74SBram Moolenaar 21 71687bc3f74SBram Moolenaar norm! 0zz 71787bc3f74SBram Moolenaar call assert_equal(' 21', getline('.')) 71887bc3f74SBram Moolenaar call assert_equal(17, winsaveview()['topline']) 71987bc3f74SBram Moolenaar call assert_equal([0, 21, 1, 0, 8], getcurpos()) 72087bc3f74SBram Moolenaar 72187bc3f74SBram Moolenaar " Test for z+ 72287bc3f74SBram Moolenaar 11 72387bc3f74SBram Moolenaar norm! zt 72487bc3f74SBram Moolenaar norm! z+ 72587bc3f74SBram Moolenaar call assert_equal(' 21', getline('.')) 72687bc3f74SBram Moolenaar call assert_equal(21, winsaveview()['topline']) 72787bc3f74SBram Moolenaar call assert_equal([0, 21, 2, 0, 9], getcurpos()) 72887bc3f74SBram Moolenaar 72987bc3f74SBram Moolenaar " Test for [count]z+ 73087bc3f74SBram Moolenaar 1 73187bc3f74SBram Moolenaar norm! 21z+ 73287bc3f74SBram Moolenaar call assert_equal(' 21', getline('.')) 73387bc3f74SBram Moolenaar call assert_equal(21, winsaveview()['topline']) 73487bc3f74SBram Moolenaar call assert_equal([0, 21, 2, 0, 9], getcurpos()) 73587bc3f74SBram Moolenaar 7368a9bc95eSBram Moolenaar " Test for z+ with [count] greater than buffer size 7378a9bc95eSBram Moolenaar 1 7388a9bc95eSBram Moolenaar norm! 1000z+ 7398a9bc95eSBram Moolenaar call assert_equal(' 100', getline('.')) 7408a9bc95eSBram Moolenaar call assert_equal(100, winsaveview()['topline']) 7418a9bc95eSBram Moolenaar call assert_equal([0, 100, 2, 0, 9], getcurpos()) 7428a9bc95eSBram Moolenaar 7438a9bc95eSBram Moolenaar " Test for z+ from the last buffer line 7448a9bc95eSBram Moolenaar norm! Gz.z+ 7458a9bc95eSBram Moolenaar call assert_equal(' 100', getline('.')) 7468a9bc95eSBram Moolenaar call assert_equal(100, winsaveview()['topline']) 7478a9bc95eSBram Moolenaar call assert_equal([0, 100, 2, 0, 9], getcurpos()) 7488a9bc95eSBram Moolenaar 74987bc3f74SBram Moolenaar " Test for z^ 75087bc3f74SBram Moolenaar norm! 22z+0 75187bc3f74SBram Moolenaar norm! z^ 75287bc3f74SBram Moolenaar call assert_equal(' 21', getline('.')) 75387bc3f74SBram Moolenaar call assert_equal(12, winsaveview()['topline']) 75487bc3f74SBram Moolenaar call assert_equal([0, 21, 2, 0, 9], getcurpos()) 75587bc3f74SBram Moolenaar 7568a9bc95eSBram Moolenaar " Test for z^ from first buffer line 7578a9bc95eSBram Moolenaar norm! ggz^ 7588a9bc95eSBram Moolenaar call assert_equal('1', getline('.')) 7598a9bc95eSBram Moolenaar call assert_equal(1, winsaveview()['topline']) 7608a9bc95eSBram Moolenaar call assert_equal([0, 1, 1, 0, 1], getcurpos()) 7618a9bc95eSBram Moolenaar 76287bc3f74SBram Moolenaar " Test for [count]z^ 76387bc3f74SBram Moolenaar 1 76487bc3f74SBram Moolenaar norm! 30z^ 76587bc3f74SBram Moolenaar call assert_equal(' 21', getline('.')) 76687bc3f74SBram Moolenaar call assert_equal(12, winsaveview()['topline']) 76787bc3f74SBram Moolenaar call assert_equal([0, 21, 2, 0, 9], getcurpos()) 76887bc3f74SBram Moolenaar 76987bc3f74SBram Moolenaar " cleanup 77087bc3f74SBram Moolenaar bw! 7712931f2a5SBram Moolenaarendfunc 77287bc3f74SBram Moolenaar 7731bbb6194SBram Moolenaarfunc Test_normal16_z_scroll_hor() 77487bc3f74SBram Moolenaar " basic test for z commands that scroll the window 77587bc3f74SBram Moolenaar 10new 77687bc3f74SBram Moolenaar 15vsp 77787bc3f74SBram Moolenaar set nowrap listchars= 77887bc3f74SBram Moolenaar let lineA='abcdefghijklmnopqrstuvwxyz' 77987bc3f74SBram Moolenaar let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' 78087bc3f74SBram Moolenaar $put =lineA 78187bc3f74SBram Moolenaar $put =lineB 78287bc3f74SBram Moolenaar 1d 78387bc3f74SBram Moolenaar 7841671f448SBram Moolenaar " Test for zl and zh with a count 7851671f448SBram Moolenaar norm! 0z10l 7861671f448SBram Moolenaar call assert_equal([11, 1], [col('.'), wincol()]) 7871671f448SBram Moolenaar norm! z4h 7881671f448SBram Moolenaar call assert_equal([11, 5], [col('.'), wincol()]) 7891671f448SBram Moolenaar normal! 2gg 7901671f448SBram Moolenaar 79187bc3f74SBram Moolenaar " Test for zl 79287bc3f74SBram Moolenaar 1 79387bc3f74SBram Moolenaar norm! 5zl 79487bc3f74SBram Moolenaar call assert_equal(lineA, getline('.')) 79587bc3f74SBram Moolenaar call assert_equal(6, col('.')) 79687bc3f74SBram Moolenaar call assert_equal(5, winsaveview()['leftcol']) 79787bc3f74SBram Moolenaar norm! yl 79887bc3f74SBram Moolenaar call assert_equal('f', @0) 79987bc3f74SBram Moolenaar 80087bc3f74SBram Moolenaar " Test for zh 80187bc3f74SBram Moolenaar norm! 2zh 80287bc3f74SBram Moolenaar call assert_equal(lineA, getline('.')) 80387bc3f74SBram Moolenaar call assert_equal(6, col('.')) 80487bc3f74SBram Moolenaar norm! yl 80587bc3f74SBram Moolenaar call assert_equal('f', @0) 80687bc3f74SBram Moolenaar call assert_equal(3, winsaveview()['leftcol']) 80787bc3f74SBram Moolenaar 80887bc3f74SBram Moolenaar " Test for zL 80987bc3f74SBram Moolenaar norm! zL 81087bc3f74SBram Moolenaar call assert_equal(11, col('.')) 81187bc3f74SBram Moolenaar norm! yl 81287bc3f74SBram Moolenaar call assert_equal('k', @0) 81387bc3f74SBram Moolenaar call assert_equal(10, winsaveview()['leftcol']) 81487bc3f74SBram Moolenaar norm! 2zL 81587bc3f74SBram Moolenaar call assert_equal(25, col('.')) 81687bc3f74SBram Moolenaar norm! yl 81787bc3f74SBram Moolenaar call assert_equal('y', @0) 81887bc3f74SBram Moolenaar call assert_equal(24, winsaveview()['leftcol']) 81987bc3f74SBram Moolenaar 82087bc3f74SBram Moolenaar " Test for zH 82187bc3f74SBram Moolenaar norm! 2zH 82287bc3f74SBram Moolenaar call assert_equal(25, col('.')) 82387bc3f74SBram Moolenaar call assert_equal(10, winsaveview()['leftcol']) 82487bc3f74SBram Moolenaar norm! yl 82587bc3f74SBram Moolenaar call assert_equal('y', @0) 82687bc3f74SBram Moolenaar 82787bc3f74SBram Moolenaar " Test for zs 82887bc3f74SBram Moolenaar norm! $zs 82987bc3f74SBram Moolenaar call assert_equal(26, col('.')) 83087bc3f74SBram Moolenaar call assert_equal(25, winsaveview()['leftcol']) 83187bc3f74SBram Moolenaar norm! yl 83287bc3f74SBram Moolenaar call assert_equal('z', @0) 83387bc3f74SBram Moolenaar 83487bc3f74SBram Moolenaar " Test for ze 83587bc3f74SBram Moolenaar norm! ze 83687bc3f74SBram Moolenaar call assert_equal(26, col('.')) 83787bc3f74SBram Moolenaar call assert_equal(11, winsaveview()['leftcol']) 83887bc3f74SBram Moolenaar norm! yl 83987bc3f74SBram Moolenaar call assert_equal('z', @0) 84087bc3f74SBram Moolenaar 8418a9bc95eSBram Moolenaar " Test for zs and ze with folds 8428a9bc95eSBram Moolenaar %fold 8438a9bc95eSBram Moolenaar norm! $zs 8448a9bc95eSBram Moolenaar call assert_equal(26, col('.')) 8458a9bc95eSBram Moolenaar call assert_equal(0, winsaveview()['leftcol']) 8468a9bc95eSBram Moolenaar norm! yl 8478a9bc95eSBram Moolenaar call assert_equal('z', @0) 8488a9bc95eSBram Moolenaar norm! ze 8498a9bc95eSBram Moolenaar call assert_equal(26, col('.')) 8508a9bc95eSBram Moolenaar call assert_equal(0, winsaveview()['leftcol']) 8518a9bc95eSBram Moolenaar norm! yl 8528a9bc95eSBram Moolenaar call assert_equal('z', @0) 8538a9bc95eSBram Moolenaar 85487bc3f74SBram Moolenaar " cleanup 85587bc3f74SBram Moolenaar set wrap listchars=eol:$ 85687bc3f74SBram Moolenaar bw! 8572931f2a5SBram Moolenaarendfunc 85887bc3f74SBram Moolenaar 8591bbb6194SBram Moolenaarfunc Test_normal17_z_scroll_hor2() 86087bc3f74SBram Moolenaar " basic test for z commands that scroll the window 86187bc3f74SBram Moolenaar " using 'sidescrolloff' setting 86287bc3f74SBram Moolenaar 10new 86387bc3f74SBram Moolenaar 20vsp 86487bc3f74SBram Moolenaar set nowrap listchars= sidescrolloff=5 86587bc3f74SBram Moolenaar let lineA='abcdefghijklmnopqrstuvwxyz' 86687bc3f74SBram Moolenaar let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' 86787bc3f74SBram Moolenaar $put =lineA 86887bc3f74SBram Moolenaar $put =lineB 86987bc3f74SBram Moolenaar 1d 87087bc3f74SBram Moolenaar 87187bc3f74SBram Moolenaar " Test for zl 87287bc3f74SBram Moolenaar 1 87387bc3f74SBram Moolenaar norm! 5zl 87487bc3f74SBram Moolenaar call assert_equal(lineA, getline('.')) 87587bc3f74SBram Moolenaar call assert_equal(11, col('.')) 87687bc3f74SBram Moolenaar call assert_equal(5, winsaveview()['leftcol']) 87787bc3f74SBram Moolenaar norm! yl 87887bc3f74SBram Moolenaar call assert_equal('k', @0) 87987bc3f74SBram Moolenaar 88087bc3f74SBram Moolenaar " Test for zh 88187bc3f74SBram Moolenaar norm! 2zh 88287bc3f74SBram Moolenaar call assert_equal(lineA, getline('.')) 88387bc3f74SBram Moolenaar call assert_equal(11, col('.')) 88487bc3f74SBram Moolenaar norm! yl 88587bc3f74SBram Moolenaar call assert_equal('k', @0) 88687bc3f74SBram Moolenaar call assert_equal(3, winsaveview()['leftcol']) 88787bc3f74SBram Moolenaar 88887bc3f74SBram Moolenaar " Test for zL 88987bc3f74SBram Moolenaar norm! 0zL 89087bc3f74SBram Moolenaar call assert_equal(16, col('.')) 89187bc3f74SBram Moolenaar norm! yl 89287bc3f74SBram Moolenaar call assert_equal('p', @0) 89387bc3f74SBram Moolenaar call assert_equal(10, winsaveview()['leftcol']) 89487bc3f74SBram Moolenaar norm! 2zL 89587bc3f74SBram Moolenaar call assert_equal(26, col('.')) 89687bc3f74SBram Moolenaar norm! yl 89787bc3f74SBram Moolenaar call assert_equal('z', @0) 89887bc3f74SBram Moolenaar call assert_equal(15, winsaveview()['leftcol']) 89987bc3f74SBram Moolenaar 90087bc3f74SBram Moolenaar " Test for zH 90187bc3f74SBram Moolenaar norm! 2zH 90287bc3f74SBram Moolenaar call assert_equal(15, col('.')) 90387bc3f74SBram Moolenaar call assert_equal(0, winsaveview()['leftcol']) 90487bc3f74SBram Moolenaar norm! yl 90587bc3f74SBram Moolenaar call assert_equal('o', @0) 90687bc3f74SBram Moolenaar 90787bc3f74SBram Moolenaar " Test for zs 90887bc3f74SBram Moolenaar norm! $zs 90987bc3f74SBram Moolenaar call assert_equal(26, col('.')) 91087bc3f74SBram Moolenaar call assert_equal(20, winsaveview()['leftcol']) 91187bc3f74SBram Moolenaar norm! yl 91287bc3f74SBram Moolenaar call assert_equal('z', @0) 91387bc3f74SBram Moolenaar 91487bc3f74SBram Moolenaar " Test for ze 91587bc3f74SBram Moolenaar norm! ze 91687bc3f74SBram Moolenaar call assert_equal(26, col('.')) 91787bc3f74SBram Moolenaar call assert_equal(11, winsaveview()['leftcol']) 91887bc3f74SBram Moolenaar norm! yl 91987bc3f74SBram Moolenaar call assert_equal('z', @0) 92087bc3f74SBram Moolenaar 92187bc3f74SBram Moolenaar " cleanup 92287bc3f74SBram Moolenaar set wrap listchars=eol:$ sidescrolloff=0 92387bc3f74SBram Moolenaar bw! 9242931f2a5SBram Moolenaarendfunc 92587bc3f74SBram Moolenaar 926bdd2c290SBram Moolenaar" Test for commands that scroll the window horizontally. Test with folds. 927bdd2c290SBram Moolenaar" H, M, L, CTRL-E, CTRL-Y, CTRL-U, CTRL-D, PageUp, PageDown commands 928bdd2c290SBram Moolenaarfunc Test_vert_scroll_cmds() 9291671f448SBram Moolenaar 15new 9301671f448SBram Moolenaar call setline(1, range(1, 100)) 9311671f448SBram Moolenaar exe "normal! 30ggz\<CR>" 9321671f448SBram Moolenaar set foldenable 9331671f448SBram Moolenaar 33,36fold 9341671f448SBram Moolenaar 40,43fold 9351671f448SBram Moolenaar 46,49fold 9361671f448SBram Moolenaar let h = winheight(0) 937bdd2c290SBram Moolenaar 938bdd2c290SBram Moolenaar " Test for H, M and L commands 9391671f448SBram Moolenaar " Top of the screen = 30 9401671f448SBram Moolenaar " Folded lines = 9 9411671f448SBram Moolenaar " Bottom of the screen = 30 + h + 9 - 1 9421671f448SBram Moolenaar normal! 4L 9431671f448SBram Moolenaar call assert_equal(35 + h, line('.')) 9441671f448SBram Moolenaar normal! 4H 9451671f448SBram Moolenaar call assert_equal(33, line('.')) 946bdd2c290SBram Moolenaar 9478a9bc95eSBram Moolenaar " Test for using a large count value 9488a9bc95eSBram Moolenaar %d 9498a9bc95eSBram Moolenaar call setline(1, range(1, 4)) 9508a9bc95eSBram Moolenaar norm! 6H 9518a9bc95eSBram Moolenaar call assert_equal(4, line('.')) 9528a9bc95eSBram Moolenaar 9538a9bc95eSBram Moolenaar " Test for 'M' with folded lines 9548a9bc95eSBram Moolenaar %d 9558a9bc95eSBram Moolenaar call setline(1, range(1, 20)) 9568a9bc95eSBram Moolenaar 1,5fold 9578a9bc95eSBram Moolenaar norm! LM 9588a9bc95eSBram Moolenaar call assert_equal(12, line('.')) 9598a9bc95eSBram Moolenaar 960bdd2c290SBram Moolenaar " Test for the CTRL-E and CTRL-Y commands with folds 961bdd2c290SBram Moolenaar %d 962bdd2c290SBram Moolenaar call setline(1, range(1, 10)) 963bdd2c290SBram Moolenaar 3,5fold 964bdd2c290SBram Moolenaar exe "normal 6G3\<C-E>" 965bdd2c290SBram Moolenaar call assert_equal(6, line('w0')) 966bdd2c290SBram Moolenaar exe "normal 2\<C-Y>" 967bdd2c290SBram Moolenaar call assert_equal(2, line('w0')) 968bdd2c290SBram Moolenaar 969bdd2c290SBram Moolenaar " Test for CTRL-Y on a folded line 970bdd2c290SBram Moolenaar %d 971bdd2c290SBram Moolenaar call setline(1, range(1, 100)) 972bdd2c290SBram Moolenaar exe (h + 2) .. "," .. (h + 4) .. "fold" 973bdd2c290SBram Moolenaar exe h + 5 974bdd2c290SBram Moolenaar normal z- 975bdd2c290SBram Moolenaar exe "normal \<C-Y>\<C-Y>" 976bdd2c290SBram Moolenaar call assert_equal(h + 1, line('w$')) 977bdd2c290SBram Moolenaar 978d1ad99b6SBram Moolenaar " Test for CTRL-Y from the first line and CTRL-E from the last line 979d1ad99b6SBram Moolenaar %d 980d1ad99b6SBram Moolenaar set scrolloff=2 981d1ad99b6SBram Moolenaar call setline(1, range(1, 4)) 982d1ad99b6SBram Moolenaar exe "normal gg\<C-Y>" 983d1ad99b6SBram Moolenaar call assert_equal(1, line('w0')) 984d1ad99b6SBram Moolenaar call assert_equal(1, line('.')) 985d1ad99b6SBram Moolenaar exe "normal G4\<C-E>\<C-E>" 986d1ad99b6SBram Moolenaar call assert_equal(4, line('w$')) 987d1ad99b6SBram Moolenaar call assert_equal(4, line('.')) 988d1ad99b6SBram Moolenaar set scrolloff& 989d1ad99b6SBram Moolenaar 990bdd2c290SBram Moolenaar " Using <PageUp> and <PageDown> in an empty buffer should beep 991bdd2c290SBram Moolenaar %d 992bdd2c290SBram Moolenaar call assert_beeps('exe "normal \<PageUp>"') 993bdd2c290SBram Moolenaar call assert_beeps('exe "normal \<C-B>"') 994bdd2c290SBram Moolenaar call assert_beeps('exe "normal \<PageDown>"') 995bdd2c290SBram Moolenaar call assert_beeps('exe "normal \<C-F>"') 996bdd2c290SBram Moolenaar 997bdd2c290SBram Moolenaar " Test for <C-U> and <C-D> with fold 998bdd2c290SBram Moolenaar %d 999bdd2c290SBram Moolenaar call setline(1, range(1, 100)) 1000bdd2c290SBram Moolenaar 10,35fold 1001bdd2c290SBram Moolenaar set scroll=10 1002bdd2c290SBram Moolenaar exe "normal \<C-D>" 1003bdd2c290SBram Moolenaar call assert_equal(36, line('.')) 1004bdd2c290SBram Moolenaar exe "normal \<C-D>" 1005bdd2c290SBram Moolenaar call assert_equal(46, line('.')) 1006bdd2c290SBram Moolenaar exe "normal \<C-U>" 1007bdd2c290SBram Moolenaar call assert_equal(36, line('.')) 1008bdd2c290SBram Moolenaar exe "normal \<C-U>" 1009bdd2c290SBram Moolenaar call assert_equal(10, line('.')) 1010bdd2c290SBram Moolenaar exe "normal \<C-U>" 1011bdd2c290SBram Moolenaar call assert_equal(1, line('.')) 1012bdd2c290SBram Moolenaar set scroll& 1013bdd2c290SBram Moolenaar 1014bdd2c290SBram Moolenaar " Test for scrolling to the top of the file with <C-U> and a fold 1015bdd2c290SBram Moolenaar 10 1016bdd2c290SBram Moolenaar normal ztL 1017bdd2c290SBram Moolenaar exe "normal \<C-U>\<C-U>" 1018bdd2c290SBram Moolenaar call assert_equal(1, line('w0')) 1019bdd2c290SBram Moolenaar 1020bdd2c290SBram Moolenaar " Test for CTRL-D on a folded line 1021bdd2c290SBram Moolenaar %d 1022bdd2c290SBram Moolenaar call setline(1, range(1, 100)) 1023bdd2c290SBram Moolenaar 50,100fold 1024bdd2c290SBram Moolenaar 75 1025bdd2c290SBram Moolenaar normal z- 1026bdd2c290SBram Moolenaar exe "normal \<C-D>" 1027bdd2c290SBram Moolenaar call assert_equal(50, line('.')) 1028bdd2c290SBram Moolenaar call assert_equal(100, line('w$')) 1029bdd2c290SBram Moolenaar normal z. 1030bdd2c290SBram Moolenaar let lnum = winline() 1031bdd2c290SBram Moolenaar exe "normal \<C-D>" 1032bdd2c290SBram Moolenaar call assert_equal(lnum, winline()) 1033bdd2c290SBram Moolenaar call assert_equal(50, line('.')) 1034bdd2c290SBram Moolenaar normal zt 1035bdd2c290SBram Moolenaar exe "normal \<C-D>" 1036bdd2c290SBram Moolenaar call assert_equal(50, line('w0')) 1037bdd2c290SBram Moolenaar 1038d1ad99b6SBram Moolenaar " Test for <S-CR>. Page down. 1039d1ad99b6SBram Moolenaar %d 1040d1ad99b6SBram Moolenaar call setline(1, range(1, 100)) 1041d1ad99b6SBram Moolenaar call feedkeys("\<S-CR>", 'xt') 1042d1ad99b6SBram Moolenaar call assert_equal(14, line('w0')) 1043d1ad99b6SBram Moolenaar call assert_equal(28, line('w$')) 1044d1ad99b6SBram Moolenaar 1045d1ad99b6SBram Moolenaar " Test for <S-->. Page up. 1046d1ad99b6SBram Moolenaar call feedkeys("\<S-->", 'xt') 1047d1ad99b6SBram Moolenaar call assert_equal(1, line('w0')) 1048d1ad99b6SBram Moolenaar call assert_equal(15, line('w$')) 1049d1ad99b6SBram Moolenaar 10501671f448SBram Moolenaar set foldenable& 10511671f448SBram Moolenaar close! 1052777e7c21SBram Moolenaarendfunc 1053777e7c21SBram Moolenaar 1054777e7c21SBram Moolenaarfunc Test_scroll_in_ex_mode() 1055777e7c21SBram Moolenaar " This was using invalid memory because w_botline was invalid. 1056777e7c21SBram Moolenaar let lines =<< trim END 1057777e7c21SBram Moolenaar diffsplit 1058777e7c21SBram Moolenaar norm os00( 1059777e7c21SBram Moolenaar call writefile(['done'], 'Xdone') 1060777e7c21SBram Moolenaar qa! 1061777e7c21SBram Moolenaar END 1062777e7c21SBram Moolenaar call writefile(lines, 'Xscript') 1063777e7c21SBram Moolenaar call assert_equal(1, RunVim([], [], '--clean -X -Z -e -s -S Xscript')) 1064777e7c21SBram Moolenaar call assert_equal(['done'], readfile('Xdone')) 1065777e7c21SBram Moolenaar 1066777e7c21SBram Moolenaar call delete('Xscript') 1067777e7c21SBram Moolenaar call delete('Xdone') 10681671f448SBram Moolenaarendfunc 10691671f448SBram Moolenaar 1070bdd2c290SBram Moolenaar" Test for the 'sidescroll' option 1071bdd2c290SBram Moolenaarfunc Test_sidescroll_opt() 1072bdd2c290SBram Moolenaar new 1073bdd2c290SBram Moolenaar 20vnew 1074bdd2c290SBram Moolenaar 1075bdd2c290SBram Moolenaar " scroll by 2 characters horizontally 1076bdd2c290SBram Moolenaar set sidescroll=2 nowrap 1077bdd2c290SBram Moolenaar call setline(1, repeat('a', 40)) 1078bdd2c290SBram Moolenaar normal g$l 1079bdd2c290SBram Moolenaar call assert_equal(19, screenpos(0, 1, 21).col) 1080bdd2c290SBram Moolenaar normal l 1081bdd2c290SBram Moolenaar call assert_equal(20, screenpos(0, 1, 22).col) 1082bdd2c290SBram Moolenaar normal g0h 1083bdd2c290SBram Moolenaar call assert_equal(2, screenpos(0, 1, 2).col) 1084bdd2c290SBram Moolenaar call assert_equal(20, screenpos(0, 1, 20).col) 1085bdd2c290SBram Moolenaar 1086bdd2c290SBram Moolenaar " when 'sidescroll' is 0, cursor positioned at the center 1087bdd2c290SBram Moolenaar set sidescroll=0 1088bdd2c290SBram Moolenaar normal g$l 1089bdd2c290SBram Moolenaar call assert_equal(11, screenpos(0, 1, 21).col) 1090bdd2c290SBram Moolenaar normal g0h 1091bdd2c290SBram Moolenaar call assert_equal(10, screenpos(0, 1, 10).col) 1092bdd2c290SBram Moolenaar 1093bdd2c290SBram Moolenaar %bw! 1094bdd2c290SBram Moolenaar set wrap& sidescroll& 1095bdd2c290SBram Moolenaarendfunc 1096bdd2c290SBram Moolenaar 109787bc3f74SBram Moolenaar" basic tests for foldopen/folddelete 1098004a6781SBram Moolenaarfunc Test_normal18_z_fold() 1099004a6781SBram Moolenaar CheckFeature folding 110087bc3f74SBram Moolenaar call Setup_NewWindow() 110187bc3f74SBram Moolenaar 50 110287bc3f74SBram Moolenaar setl foldenable fdm=marker foldlevel=5 110387bc3f74SBram Moolenaar 11041671f448SBram Moolenaar call assert_beeps('normal! zj') 11051671f448SBram Moolenaar call assert_beeps('normal! zk') 11061671f448SBram Moolenaar 110787bc3f74SBram Moolenaar " Test for zF 110887bc3f74SBram Moolenaar " First fold 110987bc3f74SBram Moolenaar norm! 4zF 111087bc3f74SBram Moolenaar " check that folds have been created 111187bc3f74SBram Moolenaar call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53)) 111287bc3f74SBram Moolenaar 111387bc3f74SBram Moolenaar " Test for zd 111487bc3f74SBram Moolenaar 51 111587bc3f74SBram Moolenaar norm! 2zF 111687bc3f74SBram Moolenaar call assert_equal(2, foldlevel('.')) 111787bc3f74SBram Moolenaar norm! kzd 111887bc3f74SBram Moolenaar call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53)) 111987bc3f74SBram Moolenaar norm! j 112087bc3f74SBram Moolenaar call assert_equal(1, foldlevel('.')) 112187bc3f74SBram Moolenaar 112287bc3f74SBram Moolenaar " Test for zD 112387bc3f74SBram Moolenaar " also deletes partially selected folds recursively 112487bc3f74SBram Moolenaar 51 112587bc3f74SBram Moolenaar norm! zF 112687bc3f74SBram Moolenaar call assert_equal(2, foldlevel('.')) 112787bc3f74SBram Moolenaar norm! kV2jzD 112887bc3f74SBram Moolenaar call assert_equal(['50', '51', '52', '53'], getline(50,53)) 112987bc3f74SBram Moolenaar 113087bc3f74SBram Moolenaar " Test for zE 113187bc3f74SBram Moolenaar 85 113287bc3f74SBram Moolenaar norm! 4zF 113387bc3f74SBram Moolenaar 86 113487bc3f74SBram Moolenaar norm! 2zF 113587bc3f74SBram Moolenaar 90 113687bc3f74SBram Moolenaar norm! 4zF 113787bc3f74SBram Moolenaar call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93)) 113887bc3f74SBram Moolenaar norm! zE 113987bc3f74SBram Moolenaar call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93)) 114087bc3f74SBram Moolenaar 114187bc3f74SBram Moolenaar " Test for zn 114287bc3f74SBram Moolenaar 50 114387bc3f74SBram Moolenaar set foldlevel=0 114487bc3f74SBram Moolenaar norm! 2zF 114587bc3f74SBram Moolenaar norm! zn 114687bc3f74SBram Moolenaar norm! k 114787bc3f74SBram Moolenaar call assert_equal('49', getline('.')) 114887bc3f74SBram Moolenaar norm! j 114987bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 115087bc3f74SBram Moolenaar norm! j 115187bc3f74SBram Moolenaar call assert_equal('51/*}}}*/', getline('.')) 115287bc3f74SBram Moolenaar norm! j 115387bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 115487bc3f74SBram Moolenaar call assert_equal(0, &foldenable) 115587bc3f74SBram Moolenaar 115687bc3f74SBram Moolenaar " Test for zN 115787bc3f74SBram Moolenaar 49 115887bc3f74SBram Moolenaar norm! zN 115987bc3f74SBram Moolenaar call assert_equal('49', getline('.')) 116087bc3f74SBram Moolenaar norm! j 116187bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 116287bc3f74SBram Moolenaar norm! j 116387bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 116487bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 116587bc3f74SBram Moolenaar 116687bc3f74SBram Moolenaar " Test for zi 116787bc3f74SBram Moolenaar norm! zi 116887bc3f74SBram Moolenaar call assert_equal(0, &foldenable) 116987bc3f74SBram Moolenaar norm! zi 117087bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 117187bc3f74SBram Moolenaar norm! zi 117287bc3f74SBram Moolenaar call assert_equal(0, &foldenable) 117387bc3f74SBram Moolenaar norm! zi 117487bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 117587bc3f74SBram Moolenaar 117687bc3f74SBram Moolenaar " Test for za 117787bc3f74SBram Moolenaar 50 117887bc3f74SBram Moolenaar norm! za 117987bc3f74SBram Moolenaar norm! k 118087bc3f74SBram Moolenaar call assert_equal('49', getline('.')) 118187bc3f74SBram Moolenaar norm! j 118287bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 118387bc3f74SBram Moolenaar norm! j 118487bc3f74SBram Moolenaar call assert_equal('51/*}}}*/', getline('.')) 118587bc3f74SBram Moolenaar norm! j 118687bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 118787bc3f74SBram Moolenaar 50 118887bc3f74SBram Moolenaar norm! za 118987bc3f74SBram Moolenaar norm! k 119087bc3f74SBram Moolenaar call assert_equal('49', getline('.')) 119187bc3f74SBram Moolenaar norm! j 119287bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 119387bc3f74SBram Moolenaar norm! j 119487bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 119587bc3f74SBram Moolenaar 119687bc3f74SBram Moolenaar 49 119787bc3f74SBram Moolenaar norm! 5zF 119887bc3f74SBram Moolenaar norm! k 119987bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 120087bc3f74SBram Moolenaar norm! j 120187bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 120287bc3f74SBram Moolenaar norm! j 120387bc3f74SBram Moolenaar call assert_equal('55', getline('.')) 120487bc3f74SBram Moolenaar 49 120587bc3f74SBram Moolenaar norm! za 120687bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 120787bc3f74SBram Moolenaar norm! j 120887bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 120987bc3f74SBram Moolenaar norm! j 121087bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 121187bc3f74SBram Moolenaar set nofoldenable 121287bc3f74SBram Moolenaar " close fold and set foldenable 121387bc3f74SBram Moolenaar norm! za 121487bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 121587bc3f74SBram Moolenaar 121687bc3f74SBram Moolenaar 50 121787bc3f74SBram Moolenaar " have to use {count}za to open all folds and make the cursor visible 121887bc3f74SBram Moolenaar norm! 2za 121987bc3f74SBram Moolenaar norm! 2k 122087bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 122187bc3f74SBram Moolenaar norm! j 122287bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 122387bc3f74SBram Moolenaar norm! j 122487bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 122587bc3f74SBram Moolenaar norm! j 122687bc3f74SBram Moolenaar call assert_equal('51/*}}}*/', getline('.')) 122787bc3f74SBram Moolenaar norm! j 122887bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 122987bc3f74SBram Moolenaar 123087bc3f74SBram Moolenaar " Test for zA 123187bc3f74SBram Moolenaar 49 123287bc3f74SBram Moolenaar set foldlevel=0 123387bc3f74SBram Moolenaar 50 123487bc3f74SBram Moolenaar norm! zA 123587bc3f74SBram Moolenaar norm! 2k 123687bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 123787bc3f74SBram Moolenaar norm! j 123887bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 123987bc3f74SBram Moolenaar norm! j 124087bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 124187bc3f74SBram Moolenaar norm! j 124287bc3f74SBram Moolenaar call assert_equal('51/*}}}*/', getline('.')) 124387bc3f74SBram Moolenaar norm! j 124487bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 124587bc3f74SBram Moolenaar 1246395b6babSBram Moolenaar " zA on a opened fold when foldenable is not set 124787bc3f74SBram Moolenaar 50 124887bc3f74SBram Moolenaar set nofoldenable 124987bc3f74SBram Moolenaar norm! zA 125087bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 125187bc3f74SBram Moolenaar norm! k 125287bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 125387bc3f74SBram Moolenaar norm! j 125487bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 125587bc3f74SBram Moolenaar norm! j 125687bc3f74SBram Moolenaar call assert_equal('55', getline('.')) 125787bc3f74SBram Moolenaar 125887bc3f74SBram Moolenaar " Test for zc 125987bc3f74SBram Moolenaar norm! zE 126087bc3f74SBram Moolenaar 50 126187bc3f74SBram Moolenaar norm! 2zF 126287bc3f74SBram Moolenaar 49 126387bc3f74SBram Moolenaar norm! 5zF 126487bc3f74SBram Moolenaar set nofoldenable 126587bc3f74SBram Moolenaar 50 126687bc3f74SBram Moolenaar " There most likely is a bug somewhere: 126787bc3f74SBram Moolenaar " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ 126887bc3f74SBram Moolenaar " TODO: Should this only close the inner most fold or both folds? 126987bc3f74SBram Moolenaar norm! zc 127087bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 127187bc3f74SBram Moolenaar norm! k 127287bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 127387bc3f74SBram Moolenaar norm! j 127487bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 127587bc3f74SBram Moolenaar norm! j 127687bc3f74SBram Moolenaar call assert_equal('55', getline('.')) 127787bc3f74SBram Moolenaar set nofoldenable 127887bc3f74SBram Moolenaar 50 127987bc3f74SBram Moolenaar norm! Vjzc 128087bc3f74SBram Moolenaar norm! k 128187bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 128287bc3f74SBram Moolenaar norm! j 128387bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 128487bc3f74SBram Moolenaar norm! j 128587bc3f74SBram Moolenaar call assert_equal('55', getline('.')) 128687bc3f74SBram Moolenaar 128787bc3f74SBram Moolenaar " Test for zC 128887bc3f74SBram Moolenaar set nofoldenable 128987bc3f74SBram Moolenaar 50 129087bc3f74SBram Moolenaar norm! zCk 129187bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 129287bc3f74SBram Moolenaar norm! j 129387bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 129487bc3f74SBram Moolenaar norm! j 129587bc3f74SBram Moolenaar call assert_equal('55', getline('.')) 129687bc3f74SBram Moolenaar 129787bc3f74SBram Moolenaar " Test for zx 129887bc3f74SBram Moolenaar " 1) close folds at line 49-54 129987bc3f74SBram Moolenaar set nofoldenable 130087bc3f74SBram Moolenaar 48 130187bc3f74SBram Moolenaar norm! zx 130287bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 130387bc3f74SBram Moolenaar norm! j 130487bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 130587bc3f74SBram Moolenaar norm! j 130687bc3f74SBram Moolenaar call assert_equal('55', getline('.')) 130787bc3f74SBram Moolenaar 1308395b6babSBram Moolenaar " 2) do not close fold under cursor 130987bc3f74SBram Moolenaar 51 131087bc3f74SBram Moolenaar set nofoldenable 131187bc3f74SBram Moolenaar norm! zx 131287bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 131387bc3f74SBram Moolenaar norm! 3k 131487bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 131587bc3f74SBram Moolenaar norm! j 131687bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 131787bc3f74SBram Moolenaar norm! j 131887bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 131987bc3f74SBram Moolenaar norm! j 132087bc3f74SBram Moolenaar call assert_equal('51/*}}}*/', getline('.')) 132187bc3f74SBram Moolenaar norm! j 132287bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 132387bc3f74SBram Moolenaar norm! j 132487bc3f74SBram Moolenaar call assert_equal('53', getline('.')) 132587bc3f74SBram Moolenaar norm! j 132687bc3f74SBram Moolenaar call assert_equal('54/*}}}*/', getline('.')) 132787bc3f74SBram Moolenaar norm! j 132887bc3f74SBram Moolenaar call assert_equal('55', getline('.')) 132987bc3f74SBram Moolenaar 133087bc3f74SBram Moolenaar " 3) close one level of folds 133187bc3f74SBram Moolenaar 48 133287bc3f74SBram Moolenaar set nofoldenable 133387bc3f74SBram Moolenaar set foldlevel=1 133487bc3f74SBram Moolenaar norm! zx 133587bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 133687bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 133787bc3f74SBram Moolenaar norm! j 133887bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 133987bc3f74SBram Moolenaar norm! j 134087bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 134187bc3f74SBram Moolenaar norm! j 134287bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 134387bc3f74SBram Moolenaar norm! j 134487bc3f74SBram Moolenaar call assert_equal('53', getline('.')) 134587bc3f74SBram Moolenaar norm! j 134687bc3f74SBram Moolenaar call assert_equal('54/*}}}*/', getline('.')) 134787bc3f74SBram Moolenaar norm! j 134887bc3f74SBram Moolenaar call assert_equal('55', getline('.')) 134987bc3f74SBram Moolenaar 135087bc3f74SBram Moolenaar " Test for zX 135187bc3f74SBram Moolenaar " Close all folds 135287bc3f74SBram Moolenaar set foldlevel=0 nofoldenable 135387bc3f74SBram Moolenaar 50 135487bc3f74SBram Moolenaar norm! zX 135587bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 135687bc3f74SBram Moolenaar norm! k 135787bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 135887bc3f74SBram Moolenaar norm! j 135987bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 136087bc3f74SBram Moolenaar norm! j 136187bc3f74SBram Moolenaar call assert_equal('55', getline('.')) 136287bc3f74SBram Moolenaar 136387bc3f74SBram Moolenaar " Test for zm 136487bc3f74SBram Moolenaar 50 136587bc3f74SBram Moolenaar set nofoldenable foldlevel=2 136687bc3f74SBram Moolenaar norm! zm 136787bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 136887bc3f74SBram Moolenaar call assert_equal(1, &foldlevel) 136987bc3f74SBram Moolenaar norm! zm 137087bc3f74SBram Moolenaar call assert_equal(0, &foldlevel) 137187bc3f74SBram Moolenaar norm! zm 137287bc3f74SBram Moolenaar call assert_equal(0, &foldlevel) 137387bc3f74SBram Moolenaar norm! k 137487bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 137587bc3f74SBram Moolenaar norm! j 137687bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 137787bc3f74SBram Moolenaar norm! j 137887bc3f74SBram Moolenaar call assert_equal('55', getline('.')) 137987bc3f74SBram Moolenaar 13808a9bc95eSBram Moolenaar " Test for zm with a count 13818a9bc95eSBram Moolenaar 50 13828a9bc95eSBram Moolenaar set foldlevel=2 13838a9bc95eSBram Moolenaar norm! 3zm 13848a9bc95eSBram Moolenaar call assert_equal(0, &foldlevel) 13858a9bc95eSBram Moolenaar call assert_equal(49, foldclosed(line('.'))) 13868a9bc95eSBram Moolenaar 138787bc3f74SBram Moolenaar " Test for zM 138887bc3f74SBram Moolenaar 48 138987bc3f74SBram Moolenaar set nofoldenable foldlevel=99 139087bc3f74SBram Moolenaar norm! zM 139187bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 139287bc3f74SBram Moolenaar call assert_equal(0, &foldlevel) 139387bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 139487bc3f74SBram Moolenaar norm! j 139587bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 139687bc3f74SBram Moolenaar norm! j 139787bc3f74SBram Moolenaar call assert_equal('55', getline('.')) 139887bc3f74SBram Moolenaar 139987bc3f74SBram Moolenaar " Test for zr 140087bc3f74SBram Moolenaar 48 140187bc3f74SBram Moolenaar set nofoldenable foldlevel=0 140287bc3f74SBram Moolenaar norm! zr 140387bc3f74SBram Moolenaar call assert_equal(0, &foldenable) 140487bc3f74SBram Moolenaar call assert_equal(1, &foldlevel) 140587bc3f74SBram Moolenaar set foldlevel=0 foldenable 140687bc3f74SBram Moolenaar norm! zr 140787bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 140887bc3f74SBram Moolenaar call assert_equal(1, &foldlevel) 140987bc3f74SBram Moolenaar norm! zr 141087bc3f74SBram Moolenaar call assert_equal(2, &foldlevel) 141187bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 141287bc3f74SBram Moolenaar norm! j 141387bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 141487bc3f74SBram Moolenaar norm! j 141587bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 141687bc3f74SBram Moolenaar norm! j 141787bc3f74SBram Moolenaar call assert_equal('51/*}}}*/', getline('.')) 141887bc3f74SBram Moolenaar norm! j 141987bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 142087bc3f74SBram Moolenaar 142187bc3f74SBram Moolenaar " Test for zR 142287bc3f74SBram Moolenaar 48 142387bc3f74SBram Moolenaar set nofoldenable foldlevel=0 142487bc3f74SBram Moolenaar norm! zR 142587bc3f74SBram Moolenaar call assert_equal(0, &foldenable) 142687bc3f74SBram Moolenaar call assert_equal(2, &foldlevel) 142787bc3f74SBram Moolenaar set foldenable foldlevel=0 142887bc3f74SBram Moolenaar norm! zR 142987bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 143087bc3f74SBram Moolenaar call assert_equal(2, &foldlevel) 143187bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 143287bc3f74SBram Moolenaar norm! j 143387bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 143487bc3f74SBram Moolenaar norm! j 143587bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 143687bc3f74SBram Moolenaar norm! j 143787bc3f74SBram Moolenaar call assert_equal('51/*}}}*/', getline('.')) 143887bc3f74SBram Moolenaar norm! j 143987bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 144087bc3f74SBram Moolenaar call append(50, ['a /*{{{*/', 'b /*}}}*/']) 144187bc3f74SBram Moolenaar 48 144287bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 144387bc3f74SBram Moolenaar norm! j 144487bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 144587bc3f74SBram Moolenaar norm! j 144687bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 144787bc3f74SBram Moolenaar norm! j 144887bc3f74SBram Moolenaar call assert_equal('a /*{{{*/', getline('.')) 144987bc3f74SBram Moolenaar norm! j 145087bc3f74SBram Moolenaar call assert_equal('51/*}}}*/', getline('.')) 145187bc3f74SBram Moolenaar norm! j 145287bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 145387bc3f74SBram Moolenaar 48 145487bc3f74SBram Moolenaar norm! zR 145587bc3f74SBram Moolenaar call assert_equal(1, &foldenable) 145687bc3f74SBram Moolenaar call assert_equal(3, &foldlevel) 145787bc3f74SBram Moolenaar call assert_equal('48', getline('.')) 145887bc3f74SBram Moolenaar norm! j 145987bc3f74SBram Moolenaar call assert_equal('49/*{{{*/', getline('.')) 146087bc3f74SBram Moolenaar norm! j 146187bc3f74SBram Moolenaar call assert_equal('50/*{{{*/', getline('.')) 146287bc3f74SBram Moolenaar norm! j 146387bc3f74SBram Moolenaar call assert_equal('a /*{{{*/', getline('.')) 146487bc3f74SBram Moolenaar norm! j 146587bc3f74SBram Moolenaar call assert_equal('b /*}}}*/', getline('.')) 146687bc3f74SBram Moolenaar norm! j 146787bc3f74SBram Moolenaar call assert_equal('51/*}}}*/', getline('.')) 146887bc3f74SBram Moolenaar norm! j 146987bc3f74SBram Moolenaar call assert_equal('52', getline('.')) 147087bc3f74SBram Moolenaar 147187bc3f74SBram Moolenaar " clean up 147287bc3f74SBram Moolenaar setl nofoldenable fdm=marker foldlevel=0 147387bc3f74SBram Moolenaar bw! 14742931f2a5SBram Moolenaarendfunc 147587bc3f74SBram Moolenaar 14761bbb6194SBram Moolenaarfunc Test_normal20_exmode() 14770913a108SBram Moolenaar " Reading from redirected file doesn't work on MS-Windows 1478004a6781SBram Moolenaar CheckNotMSWindows 147987bc3f74SBram Moolenaar call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript') 148087bc3f74SBram Moolenaar call writefile(['1', '2'], 'Xfile') 148193344c2dSBram Moolenaar call system(GetVimCommand() .. ' -e -s < Xscript Xfile') 148287bc3f74SBram Moolenaar let a=readfile('Xfile2') 148387bc3f74SBram Moolenaar call assert_equal(['1', 'foo', 'bar', '2'], a) 148487bc3f74SBram Moolenaar 148587bc3f74SBram Moolenaar " clean up 148687bc3f74SBram Moolenaar for file in ['Xfile', 'Xfile2', 'Xscript'] 148787bc3f74SBram Moolenaar call delete(file) 148887bc3f74SBram Moolenaar endfor 148987bc3f74SBram Moolenaar bw! 14902931f2a5SBram Moolenaarendfunc 149187bc3f74SBram Moolenaar 14921bbb6194SBram Moolenaarfunc Test_normal21_nv_hat() 14931bbb6194SBram Moolenaar 14941bbb6194SBram Moolenaar " Edit a fresh file and wipe the buffer list so that there is no alternate 14951bbb6194SBram Moolenaar " file present. Next, check for the expected command failures. 14961bbb6194SBram Moolenaar edit Xfoo | %bw 1497e2e4075fSBram Moolenaar call assert_fails(':buffer #', 'E86:') 1498e2e4075fSBram Moolenaar call assert_fails(':execute "normal! \<C-^>"', 'E23:') 1499b7e24836SBram Moolenaar call assert_fails("normal i\<C-R>#", 'E23:') 15001bbb6194SBram Moolenaar 15011bbb6194SBram Moolenaar " Test for the expected behavior when switching between two named buffers. 15021bbb6194SBram Moolenaar edit Xfoo | edit Xbar 15031bbb6194SBram Moolenaar call feedkeys("\<C-^>", 'tx') 15041bbb6194SBram Moolenaar call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t')) 15051bbb6194SBram Moolenaar call feedkeys("\<C-^>", 'tx') 15061bbb6194SBram Moolenaar call assert_equal('Xbar', fnamemodify(bufname('%'), ':t')) 15071bbb6194SBram Moolenaar 15081bbb6194SBram Moolenaar " Test for the expected behavior when only one buffer is named. 15091bbb6194SBram Moolenaar enew | let l:nr = bufnr('%') 15101bbb6194SBram Moolenaar call feedkeys("\<C-^>", 'tx') 15111bbb6194SBram Moolenaar call assert_equal('Xbar', fnamemodify(bufname('%'), ':t')) 15121bbb6194SBram Moolenaar call feedkeys("\<C-^>", 'tx') 15131bbb6194SBram Moolenaar call assert_equal('', bufname('%')) 15141bbb6194SBram Moolenaar call assert_equal(l:nr, bufnr('%')) 15151bbb6194SBram Moolenaar 15161bbb6194SBram Moolenaar " Test that no action is taken by "<C-^>" when an operator is pending. 15171bbb6194SBram Moolenaar edit Xfoo 15181bbb6194SBram Moolenaar call feedkeys("ci\<C-^>", 'tx') 15191bbb6194SBram Moolenaar call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t')) 15201bbb6194SBram Moolenaar 15211bbb6194SBram Moolenaar %bw! 15222931f2a5SBram Moolenaarendfunc 152387bc3f74SBram Moolenaar 15241bbb6194SBram Moolenaarfunc Test_normal22_zet() 152587bc3f74SBram Moolenaar " Test for ZZ 15260913a108SBram Moolenaar " let shell = &shell 15270913a108SBram Moolenaar " let &shell = 'sh' 152887bc3f74SBram Moolenaar call writefile(['1', '2'], 'Xfile') 152993344c2dSBram Moolenaar let args = ' -N -i NONE --noplugins -X --not-a-term' 153093344c2dSBram Moolenaar call system(GetVimCommand() .. args .. ' -c "%d" -c ":norm! ZZ" Xfile') 153187bc3f74SBram Moolenaar let a = readfile('Xfile') 153287bc3f74SBram Moolenaar call assert_equal([], a) 153387bc3f74SBram Moolenaar " Test for ZQ 153487bc3f74SBram Moolenaar call writefile(['1', '2'], 'Xfile') 153593344c2dSBram Moolenaar call system(GetVimCommand() . args . ' -c "%d" -c ":norm! ZQ" Xfile') 153687bc3f74SBram Moolenaar let a = readfile('Xfile') 153787bc3f74SBram Moolenaar call assert_equal(['1', '2'], a) 153887bc3f74SBram Moolenaar 15391671f448SBram Moolenaar " Unsupported Z command 15401671f448SBram Moolenaar call assert_beeps('normal! ZW') 15411671f448SBram Moolenaar 154287bc3f74SBram Moolenaar " clean up 154387bc3f74SBram Moolenaar for file in ['Xfile'] 154487bc3f74SBram Moolenaar call delete(file) 154587bc3f74SBram Moolenaar endfor 15460913a108SBram Moolenaar " let &shell = shell 15472931f2a5SBram Moolenaarendfunc 154887bc3f74SBram Moolenaar 15491bbb6194SBram Moolenaarfunc Test_normal23_K() 155087bc3f74SBram Moolenaar " Test for K command 155187bc3f74SBram Moolenaar new 1552426f3754SBram Moolenaar call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd']) 155387bc3f74SBram Moolenaar let k = &keywordprg 155487bc3f74SBram Moolenaar set keywordprg=:help 155587bc3f74SBram Moolenaar 1 155687bc3f74SBram Moolenaar norm! VK 155787bc3f74SBram Moolenaar call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t')) 155887bc3f74SBram Moolenaar call assert_equal('help', &ft) 155987bc3f74SBram Moolenaar call assert_match('\*version8.txt\*', getline('.')) 156087bc3f74SBram Moolenaar helpclose 156187bc3f74SBram Moolenaar norm! 0K 156287bc3f74SBram Moolenaar call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t')) 156387bc3f74SBram Moolenaar call assert_equal('help', &ft) 1564b1c9198aSBram Moolenaar call assert_match('\*version8\.\d\*', getline('.')) 156587bc3f74SBram Moolenaar helpclose 156687bc3f74SBram Moolenaar 1567426f3754SBram Moolenaar set keywordprg=:new 1568426f3754SBram Moolenaar set iskeyword+=% 1569426f3754SBram Moolenaar set iskeyword+=\| 1570426f3754SBram Moolenaar 2 1571426f3754SBram Moolenaar norm! K 1572426f3754SBram Moolenaar call assert_equal('man', fnamemodify(bufname('%'), ':t')) 1573426f3754SBram Moolenaar bwipe! 1574426f3754SBram Moolenaar 3 1575426f3754SBram Moolenaar norm! K 1576426f3754SBram Moolenaar call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t')) 1577426f3754SBram Moolenaar bwipe! 1578eb828d01SBram Moolenaar if !has('win32') 1579426f3754SBram Moolenaar 4 1580426f3754SBram Moolenaar norm! K 1581426f3754SBram Moolenaar call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t')) 1582426f3754SBram Moolenaar bwipe! 1583eb828d01SBram Moolenaar endif 1584426f3754SBram Moolenaar set iskeyword-=% 1585426f3754SBram Moolenaar set iskeyword-=\| 1586426f3754SBram Moolenaar 15878a9bc95eSBram Moolenaar " Test for specifying a count to K 15888a9bc95eSBram Moolenaar 1 15898a9bc95eSBram Moolenaar com! -nargs=* Kprog let g:Kprog_Args = <q-args> 15908a9bc95eSBram Moolenaar set keywordprg=:Kprog 15918a9bc95eSBram Moolenaar norm! 3K 15928a9bc95eSBram Moolenaar call assert_equal('3 version8', g:Kprog_Args) 15938a9bc95eSBram Moolenaar delcom Kprog 15948a9bc95eSBram Moolenaar 15950913a108SBram Moolenaar " Only expect "man" to work on Unix 15960913a108SBram Moolenaar if !has("unix") 159787bc3f74SBram Moolenaar let &keywordprg = k 159887bc3f74SBram Moolenaar bw! 159987bc3f74SBram Moolenaar return 160087bc3f74SBram Moolenaar endif 1601c6b37db1SBram Moolenaar 16029134f1ecSBram Moolenaar let not_gnu_man = has('mac') || has('bsd') 16039134f1ecSBram Moolenaar if not_gnu_man 1604c7d2a57bSBram Moolenaar " In MacOS and BSD, the option for specifying a pager is different 1605c6b37db1SBram Moolenaar set keywordprg=man\ -P\ cat 1606c6b37db1SBram Moolenaar else 160787bc3f74SBram Moolenaar set keywordprg=man\ --pager=cat 1608c6b37db1SBram Moolenaar endif 160987bc3f74SBram Moolenaar " Test for using man 161087bc3f74SBram Moolenaar 2 161187bc3f74SBram Moolenaar let a = execute('unsilent norm! K') 16129134f1ecSBram Moolenaar if not_gnu_man 1613c6b37db1SBram Moolenaar call assert_match("man -P cat 'man'", a) 1614c6b37db1SBram Moolenaar else 161587bc3f74SBram Moolenaar call assert_match("man --pager=cat 'man'", a) 1616c6b37db1SBram Moolenaar endif 161787bc3f74SBram Moolenaar 16181671f448SBram Moolenaar " Error cases 16191671f448SBram Moolenaar call setline(1, '#$#') 16201671f448SBram Moolenaar call assert_fails('normal! ggK', 'E349:') 16211671f448SBram Moolenaar call setline(1, '---') 16221671f448SBram Moolenaar call assert_fails('normal! ggv2lK', 'E349:') 16231671f448SBram Moolenaar call setline(1, ['abc', 'xyz']) 16249b7bf9e9SBram Moolenaar call assert_fails("normal! gg2lv2h\<C-]>", 'E433:') 16251671f448SBram Moolenaar call assert_beeps("normal! ggVjK") 16268a9bc95eSBram Moolenaar norm! V 16278a9bc95eSBram Moolenaar call assert_beeps("norm! cK") 16281671f448SBram Moolenaar 162987bc3f74SBram Moolenaar " clean up 163087bc3f74SBram Moolenaar let &keywordprg = k 163187bc3f74SBram Moolenaar bw! 16322931f2a5SBram Moolenaarendfunc 163387bc3f74SBram Moolenaar 16341bbb6194SBram Moolenaarfunc Test_normal24_rot13() 163587bc3f74SBram Moolenaar " Testing for g?? g?g? 163687bc3f74SBram Moolenaar new 163787bc3f74SBram Moolenaar call append(0, 'abcdefghijklmnopqrstuvwxyzäüö') 163887bc3f74SBram Moolenaar 1 163987bc3f74SBram Moolenaar norm! g?? 164087bc3f74SBram Moolenaar call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.')) 164187bc3f74SBram Moolenaar norm! g?g? 164287bc3f74SBram Moolenaar call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.')) 164387bc3f74SBram Moolenaar 164487bc3f74SBram Moolenaar " clean up 164587bc3f74SBram Moolenaar bw! 16462931f2a5SBram Moolenaarendfunc 164787bc3f74SBram Moolenaar 16481bbb6194SBram Moolenaarfunc Test_normal25_tag() 16495a4c3082SBram Moolenaar CheckFeature quickfix 16505a4c3082SBram Moolenaar 165187bc3f74SBram Moolenaar " Testing for CTRL-] g CTRL-] g] 165287bc3f74SBram Moolenaar " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-] 165387bc3f74SBram Moolenaar h 165487bc3f74SBram Moolenaar " Test for CTRL-] 165587bc3f74SBram Moolenaar call search('\<x\>$') 165687bc3f74SBram Moolenaar exe "norm! \<c-]>" 165787bc3f74SBram Moolenaar call assert_equal("change.txt", fnamemodify(bufname('%'), ':t')) 165887bc3f74SBram Moolenaar norm! yiW 165987bc3f74SBram Moolenaar call assert_equal("*x*", @0) 166087bc3f74SBram Moolenaar exe ":norm \<c-o>" 166187bc3f74SBram Moolenaar 166287bc3f74SBram Moolenaar " Test for g_CTRL-] 166387bc3f74SBram Moolenaar call search('\<v_u\>$') 166487bc3f74SBram Moolenaar exe "norm! g\<c-]>" 166587bc3f74SBram Moolenaar call assert_equal("change.txt", fnamemodify(bufname('%'), ':t')) 166687bc3f74SBram Moolenaar norm! yiW 166787bc3f74SBram Moolenaar call assert_equal("*v_u*", @0) 166887bc3f74SBram Moolenaar exe ":norm \<c-o>" 166987bc3f74SBram Moolenaar 167087bc3f74SBram Moolenaar " Test for g] 167187bc3f74SBram Moolenaar call search('\<i_<Esc>$') 167287bc3f74SBram Moolenaar let a = execute(":norm! g]") 167387bc3f74SBram Moolenaar call assert_match('i_<Esc>.*insert.txt', a) 167487bc3f74SBram Moolenaar 167587bc3f74SBram Moolenaar if !empty(exepath('cscope')) && has('cscope') 167687bc3f74SBram Moolenaar " setting cscopetag changes how g] works 167787bc3f74SBram Moolenaar set cst 167887bc3f74SBram Moolenaar exe "norm! g]" 167987bc3f74SBram Moolenaar call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t')) 168087bc3f74SBram Moolenaar norm! yiW 168187bc3f74SBram Moolenaar call assert_equal("*i_<Esc>*", @0) 168287bc3f74SBram Moolenaar exe ":norm \<c-o>" 168387bc3f74SBram Moolenaar " Test for CTRL-W g] 168487bc3f74SBram Moolenaar exe "norm! \<C-W>g]" 168587bc3f74SBram Moolenaar call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t')) 168687bc3f74SBram Moolenaar norm! yiW 168787bc3f74SBram Moolenaar call assert_equal("*i_<Esc>*", @0) 168887bc3f74SBram Moolenaar call assert_equal(3, winnr('$')) 168987bc3f74SBram Moolenaar helpclose 169087bc3f74SBram Moolenaar set nocst 169187bc3f74SBram Moolenaar endif 169287bc3f74SBram Moolenaar 169387bc3f74SBram Moolenaar " Test for CTRL-W g] 169487bc3f74SBram Moolenaar let a = execute("norm! \<C-W>g]") 169587bc3f74SBram Moolenaar call assert_match('i_<Esc>.*insert.txt', a) 169687bc3f74SBram Moolenaar 169787bc3f74SBram Moolenaar " Test for CTRL-W CTRL-] 169887bc3f74SBram Moolenaar exe "norm! \<C-W>\<C-]>" 169987bc3f74SBram Moolenaar call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t')) 170087bc3f74SBram Moolenaar norm! yiW 170187bc3f74SBram Moolenaar call assert_equal("*i_<Esc>*", @0) 170287bc3f74SBram Moolenaar call assert_equal(3, winnr('$')) 170387bc3f74SBram Moolenaar helpclose 170487bc3f74SBram Moolenaar 170587bc3f74SBram Moolenaar " Test for CTRL-W g CTRL-] 170687bc3f74SBram Moolenaar exe "norm! \<C-W>g\<C-]>" 170787bc3f74SBram Moolenaar call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t')) 170887bc3f74SBram Moolenaar norm! yiW 170987bc3f74SBram Moolenaar call assert_equal("*i_<Esc>*", @0) 171087bc3f74SBram Moolenaar call assert_equal(3, winnr('$')) 171187bc3f74SBram Moolenaar helpclose 171287bc3f74SBram Moolenaar 171387bc3f74SBram Moolenaar " clean up 171487bc3f74SBram Moolenaar helpclose 17152931f2a5SBram Moolenaarendfunc 171687bc3f74SBram Moolenaar 17171bbb6194SBram Moolenaarfunc Test_normal26_put() 171887bc3f74SBram Moolenaar " Test for ]p ]P [p and [P 171987bc3f74SBram Moolenaar new 172087bc3f74SBram Moolenaar call append(0, ['while read LINE', 'do', ' ((count++))', ' if [ $? -ne 0 ]; then', " echo 'Error writing file'", ' fi', 'done']) 172187bc3f74SBram Moolenaar 1 172287bc3f74SBram Moolenaar /Error/y a 172387bc3f74SBram Moolenaar 2 172487bc3f74SBram Moolenaar norm! "a]pj"a[p 172587bc3f74SBram Moolenaar call assert_equal(['do', "echo 'Error writing file'", " echo 'Error writing file'", ' ((count++))'], getline(2,5)) 172687bc3f74SBram Moolenaar 1 172787bc3f74SBram Moolenaar /^\s\{4}/ 172887bc3f74SBram Moolenaar exe "norm! \"a]P3Eldt'" 172987bc3f74SBram Moolenaar exe "norm! j\"a[P2Eldt'" 173087bc3f74SBram Moolenaar call assert_equal([' if [ $? -ne 0 ]; then', " echo 'Error writing'", " echo 'Error'", " echo 'Error writing file'", ' fi'], getline(6,10)) 173187bc3f74SBram Moolenaar 173287bc3f74SBram Moolenaar " clean up 173387bc3f74SBram Moolenaar bw! 17342931f2a5SBram Moolenaarendfunc 173587bc3f74SBram Moolenaar 17361bbb6194SBram Moolenaarfunc Test_normal27_bracket() 173787bc3f74SBram Moolenaar " Test for [' [` ]' ]` 173887bc3f74SBram Moolenaar call Setup_NewWindow() 173987bc3f74SBram Moolenaar 1,21s/.\+/ & b/ 174087bc3f74SBram Moolenaar 1 174187bc3f74SBram Moolenaar norm! $ma 174287bc3f74SBram Moolenaar 5 174387bc3f74SBram Moolenaar norm! $mb 174487bc3f74SBram Moolenaar 10 174587bc3f74SBram Moolenaar norm! $mc 174687bc3f74SBram Moolenaar 15 174787bc3f74SBram Moolenaar norm! $md 174887bc3f74SBram Moolenaar 20 174987bc3f74SBram Moolenaar norm! $me 175087bc3f74SBram Moolenaar 175187bc3f74SBram Moolenaar " Test for [' 175287bc3f74SBram Moolenaar 9 175387bc3f74SBram Moolenaar norm! 2[' 175487bc3f74SBram Moolenaar call assert_equal(' 1 b', getline('.')) 175587bc3f74SBram Moolenaar call assert_equal(1, line('.')) 175687bc3f74SBram Moolenaar call assert_equal(3, col('.')) 175787bc3f74SBram Moolenaar 175887bc3f74SBram Moolenaar " Test for ]' 175987bc3f74SBram Moolenaar norm! ]' 176087bc3f74SBram Moolenaar call assert_equal(' 5 b', getline('.')) 176187bc3f74SBram Moolenaar call assert_equal(5, line('.')) 176287bc3f74SBram Moolenaar call assert_equal(3, col('.')) 176387bc3f74SBram Moolenaar 176487bc3f74SBram Moolenaar " No mark after line 21, cursor moves to first non blank on current line 176587bc3f74SBram Moolenaar 21 176687bc3f74SBram Moolenaar norm! $]' 176787bc3f74SBram Moolenaar call assert_equal(' 21 b', getline('.')) 176887bc3f74SBram Moolenaar call assert_equal(21, line('.')) 176987bc3f74SBram Moolenaar call assert_equal(3, col('.')) 177087bc3f74SBram Moolenaar 177187bc3f74SBram Moolenaar " Test for [` 177287bc3f74SBram Moolenaar norm! 2[` 177387bc3f74SBram Moolenaar call assert_equal(' 15 b', getline('.')) 177487bc3f74SBram Moolenaar call assert_equal(15, line('.')) 177587bc3f74SBram Moolenaar call assert_equal(8, col('.')) 177687bc3f74SBram Moolenaar 177787bc3f74SBram Moolenaar " Test for ]` 177887bc3f74SBram Moolenaar norm! ]` 177987bc3f74SBram Moolenaar call assert_equal(' 20 b', getline('.')) 178087bc3f74SBram Moolenaar call assert_equal(20, line('.')) 178187bc3f74SBram Moolenaar call assert_equal(8, col('.')) 178287bc3f74SBram Moolenaar 178387bc3f74SBram Moolenaar " clean up 178487bc3f74SBram Moolenaar bw! 17852931f2a5SBram Moolenaarendfunc 178687bc3f74SBram Moolenaar 17871671f448SBram Moolenaar" Test for ( and ) sentence movements 17881bbb6194SBram Moolenaarfunc Test_normal28_parenthesis() 178987bc3f74SBram Moolenaar new 179087bc3f74SBram Moolenaar call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here']) 179187bc3f74SBram Moolenaar 179287bc3f74SBram Moolenaar $ 179387bc3f74SBram Moolenaar norm! d( 179487bc3f74SBram Moolenaar call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$')) 179587bc3f74SBram Moolenaar norm! 2d( 179687bc3f74SBram Moolenaar call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$')) 179787bc3f74SBram Moolenaar 1 179887bc3f74SBram Moolenaar norm! 0d) 179987bc3f74SBram Moolenaar call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$')) 180087bc3f74SBram Moolenaar 180187bc3f74SBram Moolenaar call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. ']) 180287bc3f74SBram Moolenaar $ 180387bc3f74SBram Moolenaar norm! $d( 180487bc3f74SBram Moolenaar call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$')) 180587bc3f74SBram Moolenaar 1806224a5f17SBram Moolenaar " Move to the next sentence from a paragraph macro 1807224a5f17SBram Moolenaar %d 1808224a5f17SBram Moolenaar call setline(1, ['.LP', 'blue sky!. blue sky.', 'blue sky. blue sky.']) 1809224a5f17SBram Moolenaar call cursor(1, 1) 1810224a5f17SBram Moolenaar normal ) 1811224a5f17SBram Moolenaar call assert_equal([2, 1], [line('.'), col('.')]) 1812224a5f17SBram Moolenaar normal ) 1813224a5f17SBram Moolenaar call assert_equal([2, 12], [line('.'), col('.')]) 1814224a5f17SBram Moolenaar normal (( 1815224a5f17SBram Moolenaar call assert_equal([1, 1], [line('.'), col('.')]) 1816224a5f17SBram Moolenaar 18171671f448SBram Moolenaar " It is an error if a next sentence is not found 18181671f448SBram Moolenaar %d 18191671f448SBram Moolenaar call setline(1, '.SH') 18201671f448SBram Moolenaar call assert_beeps('normal )') 18211671f448SBram Moolenaar 1822224a5f17SBram Moolenaar " If only dot is present, don't treat that as a sentence 1823224a5f17SBram Moolenaar call setline(1, '. This is a sentence.') 1824224a5f17SBram Moolenaar normal $(( 1825224a5f17SBram Moolenaar call assert_equal(3, col('.')) 1826224a5f17SBram Moolenaar 18271671f448SBram Moolenaar " Jumping to a fold should open the fold 18281671f448SBram Moolenaar call setline(1, ['', '', 'one', 'two', 'three']) 18291671f448SBram Moolenaar set foldenable 18301671f448SBram Moolenaar 2,$fold 18311671f448SBram Moolenaar call feedkeys(')', 'xt') 18321671f448SBram Moolenaar call assert_equal(3, line('.')) 18331671f448SBram Moolenaar call assert_equal(1, foldlevel('.')) 18341671f448SBram Moolenaar call assert_equal(-1, foldclosed('.')) 18351671f448SBram Moolenaar set foldenable& 18361671f448SBram Moolenaar 183787bc3f74SBram Moolenaar " clean up 183887bc3f74SBram Moolenaar bw! 18392931f2a5SBram Moolenaarendfunc 184087bc3f74SBram Moolenaar 18411671f448SBram Moolenaar" Test for { and } paragraph movements 18421671f448SBram Moolenaarfunc Test_normal29_brace() 1843c79745a8SBram Moolenaar let text =<< trim [DATA] 1844c79745a8SBram Moolenaar A paragraph begins after each empty line, and also at each of a set of 1845c79745a8SBram Moolenaar paragraph macros, specified by the pairs of characters in the 'paragraphs' 1846c79745a8SBram Moolenaar option. The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to 1847c79745a8SBram Moolenaar the macros ".IP", ".LP", etc. (These are nroff macros, so the dot must be in 1848c79745a8SBram Moolenaar the first column). A section boundary is also a paragraph boundary. 1849c79745a8SBram Moolenaar Note that a blank line (only containing white space) is NOT a paragraph 1850c79745a8SBram Moolenaar boundary. 1851c79745a8SBram Moolenaar 1852c79745a8SBram Moolenaar 1853c79745a8SBram Moolenaar Also note that this does not include a '{' or '}' in the first column. When 1854c79745a8SBram Moolenaar the '{' flag is in 'cpoptions' then '{' in the first column is used as a 1855c79745a8SBram Moolenaar paragraph boundary |posix|. 1856c79745a8SBram Moolenaar { 1857c79745a8SBram Moolenaar This is no paragraph 1858c79745a8SBram Moolenaar unless the '{' is set 1859c79745a8SBram Moolenaar in 'cpoptions' 1860c79745a8SBram Moolenaar } 1861c79745a8SBram Moolenaar .IP 1862c79745a8SBram Moolenaar The nroff macros IP separates a paragraph 1863c79745a8SBram Moolenaar That means, it must be a '.' 1864c79745a8SBram Moolenaar followed by IP 1865c79745a8SBram Moolenaar .LPIt does not matter, if afterwards some 1866c79745a8SBram Moolenaar more characters follow. 1867c79745a8SBram Moolenaar .SHAlso section boundaries from the nroff 1868c79745a8SBram Moolenaar macros terminate a paragraph. That means 1869c79745a8SBram Moolenaar a character like this: 1870c79745a8SBram Moolenaar .NH 1871c79745a8SBram Moolenaar End of text here 1872c79745a8SBram Moolenaar [DATA] 1873c79745a8SBram Moolenaar 187487bc3f74SBram Moolenaar new 187587bc3f74SBram Moolenaar call append(0, text) 187687bc3f74SBram Moolenaar 1 187787bc3f74SBram Moolenaar norm! 0d2} 1878c79745a8SBram Moolenaar 1879c79745a8SBram Moolenaar let expected =<< trim [DATA] 1880c79745a8SBram Moolenaar .IP 1881c79745a8SBram Moolenaar The nroff macros IP separates a paragraph 1882c79745a8SBram Moolenaar That means, it must be a '.' 1883c79745a8SBram Moolenaar followed by IP 1884c79745a8SBram Moolenaar .LPIt does not matter, if afterwards some 1885c79745a8SBram Moolenaar more characters follow. 1886c79745a8SBram Moolenaar .SHAlso section boundaries from the nroff 1887c79745a8SBram Moolenaar macros terminate a paragraph. That means 1888c79745a8SBram Moolenaar a character like this: 1889c79745a8SBram Moolenaar .NH 1890c79745a8SBram Moolenaar End of text here 1891c79745a8SBram Moolenaar 1892c79745a8SBram Moolenaar [DATA] 1893c79745a8SBram Moolenaar call assert_equal(expected, getline(1, '$')) 1894c79745a8SBram Moolenaar 189587bc3f74SBram Moolenaar norm! 0d} 1896c79745a8SBram Moolenaar 1897c79745a8SBram Moolenaar let expected =<< trim [DATA] 1898c79745a8SBram Moolenaar .LPIt does not matter, if afterwards some 1899c79745a8SBram Moolenaar more characters follow. 1900c79745a8SBram Moolenaar .SHAlso section boundaries from the nroff 1901c79745a8SBram Moolenaar macros terminate a paragraph. That means 1902c79745a8SBram Moolenaar a character like this: 1903c79745a8SBram Moolenaar .NH 1904c79745a8SBram Moolenaar End of text here 1905c79745a8SBram Moolenaar 1906c79745a8SBram Moolenaar [DATA] 1907c79745a8SBram Moolenaar call assert_equal(expected, getline(1, '$')) 1908c79745a8SBram Moolenaar 190987bc3f74SBram Moolenaar $ 191087bc3f74SBram Moolenaar norm! d{ 1911c79745a8SBram Moolenaar 1912c79745a8SBram Moolenaar let expected =<< trim [DATA] 1913c79745a8SBram Moolenaar .LPIt does not matter, if afterwards some 1914c79745a8SBram Moolenaar more characters follow. 1915c79745a8SBram Moolenaar .SHAlso section boundaries from the nroff 1916c79745a8SBram Moolenaar macros terminate a paragraph. That means 1917c79745a8SBram Moolenaar a character like this: 1918c79745a8SBram Moolenaar 1919c79745a8SBram Moolenaar [DATA] 1920c79745a8SBram Moolenaar call assert_equal(expected, getline(1, '$')) 1921c79745a8SBram Moolenaar 192287bc3f74SBram Moolenaar norm! d{ 1923c79745a8SBram Moolenaar 1924c79745a8SBram Moolenaar let expected =<< trim [DATA] 1925c79745a8SBram Moolenaar .LPIt does not matter, if afterwards some 1926c79745a8SBram Moolenaar more characters follow. 1927c79745a8SBram Moolenaar 1928c79745a8SBram Moolenaar [DATA] 1929c79745a8SBram Moolenaar call assert_equal(expected, getline(1, '$')) 1930c79745a8SBram Moolenaar 193187bc3f74SBram Moolenaar " Test with { in cpooptions 193287bc3f74SBram Moolenaar %d 193387bc3f74SBram Moolenaar call append(0, text) 193487bc3f74SBram Moolenaar set cpo+={ 193587bc3f74SBram Moolenaar 1 193687bc3f74SBram Moolenaar norm! 0d2} 1937c79745a8SBram Moolenaar 1938c79745a8SBram Moolenaar let expected =<< trim [DATA] 1939c79745a8SBram Moolenaar { 1940c79745a8SBram Moolenaar This is no paragraph 1941c79745a8SBram Moolenaar unless the '{' is set 1942c79745a8SBram Moolenaar in 'cpoptions' 1943c79745a8SBram Moolenaar } 1944c79745a8SBram Moolenaar .IP 1945c79745a8SBram Moolenaar The nroff macros IP separates a paragraph 1946c79745a8SBram Moolenaar That means, it must be a '.' 1947c79745a8SBram Moolenaar followed by IP 1948c79745a8SBram Moolenaar .LPIt does not matter, if afterwards some 1949c79745a8SBram Moolenaar more characters follow. 1950c79745a8SBram Moolenaar .SHAlso section boundaries from the nroff 1951c79745a8SBram Moolenaar macros terminate a paragraph. That means 1952c79745a8SBram Moolenaar a character like this: 1953c79745a8SBram Moolenaar .NH 1954c79745a8SBram Moolenaar End of text here 1955c79745a8SBram Moolenaar 1956c79745a8SBram Moolenaar [DATA] 1957c79745a8SBram Moolenaar call assert_equal(expected, getline(1, '$')) 1958c79745a8SBram Moolenaar 195987bc3f74SBram Moolenaar $ 196087bc3f74SBram Moolenaar norm! d} 1961c79745a8SBram Moolenaar 1962c79745a8SBram Moolenaar let expected =<< trim [DATA] 1963c79745a8SBram Moolenaar { 1964c79745a8SBram Moolenaar This is no paragraph 1965c79745a8SBram Moolenaar unless the '{' is set 1966c79745a8SBram Moolenaar in 'cpoptions' 1967c79745a8SBram Moolenaar } 1968c79745a8SBram Moolenaar .IP 1969c79745a8SBram Moolenaar The nroff macros IP separates a paragraph 1970c79745a8SBram Moolenaar That means, it must be a '.' 1971c79745a8SBram Moolenaar followed by IP 1972c79745a8SBram Moolenaar .LPIt does not matter, if afterwards some 1973c79745a8SBram Moolenaar more characters follow. 1974c79745a8SBram Moolenaar .SHAlso section boundaries from the nroff 1975c79745a8SBram Moolenaar macros terminate a paragraph. That means 1976c79745a8SBram Moolenaar a character like this: 1977c79745a8SBram Moolenaar .NH 1978c79745a8SBram Moolenaar End of text here 1979c79745a8SBram Moolenaar 1980c79745a8SBram Moolenaar [DATA] 1981c79745a8SBram Moolenaar call assert_equal(expected, getline(1, '$')) 1982c79745a8SBram Moolenaar 198387bc3f74SBram Moolenaar norm! gg} 198487bc3f74SBram Moolenaar norm! d5} 1985c79745a8SBram Moolenaar 1986c79745a8SBram Moolenaar let expected =<< trim [DATA] 1987c79745a8SBram Moolenaar { 1988c79745a8SBram Moolenaar This is no paragraph 1989c79745a8SBram Moolenaar unless the '{' is set 1990c79745a8SBram Moolenaar in 'cpoptions' 1991c79745a8SBram Moolenaar } 1992c79745a8SBram Moolenaar 1993c79745a8SBram Moolenaar [DATA] 1994c79745a8SBram Moolenaar call assert_equal(expected, getline(1, '$')) 199587bc3f74SBram Moolenaar 19961671f448SBram Moolenaar " Jumping to a fold should open the fold 19971671f448SBram Moolenaar %d 19981671f448SBram Moolenaar call setline(1, ['', 'one', 'two', '']) 19991671f448SBram Moolenaar set foldenable 20001671f448SBram Moolenaar 2,$fold 20011671f448SBram Moolenaar call feedkeys('}', 'xt') 20021671f448SBram Moolenaar call assert_equal(4, line('.')) 20031671f448SBram Moolenaar call assert_equal(1, foldlevel('.')) 20041671f448SBram Moolenaar call assert_equal(-1, foldclosed('.')) 20051671f448SBram Moolenaar set foldenable& 20061671f448SBram Moolenaar 200787bc3f74SBram Moolenaar " clean up 200887bc3f74SBram Moolenaar set cpo-={ 200987bc3f74SBram Moolenaar bw! 20102931f2a5SBram Moolenaarendfunc 201187bc3f74SBram Moolenaar 20128a9bc95eSBram Moolenaar" Test for section movements 20138a9bc95eSBram Moolenaarfunc Test_normal_section() 20148a9bc95eSBram Moolenaar new 20158a9bc95eSBram Moolenaar let lines =<< trim [END] 20168a9bc95eSBram Moolenaar int foo() 20178a9bc95eSBram Moolenaar { 20188a9bc95eSBram Moolenaar if (1) 20198a9bc95eSBram Moolenaar { 20208a9bc95eSBram Moolenaar a = 1; 20218a9bc95eSBram Moolenaar } 20228a9bc95eSBram Moolenaar } 20238a9bc95eSBram Moolenaar [END] 20248a9bc95eSBram Moolenaar call setline(1, lines) 20258a9bc95eSBram Moolenaar 20268a9bc95eSBram Moolenaar " jumping to a folded line using [[ should open the fold 20278a9bc95eSBram Moolenaar 2,3fold 20288a9bc95eSBram Moolenaar call cursor(5, 1) 20298a9bc95eSBram Moolenaar call feedkeys("[[", 'xt') 20308a9bc95eSBram Moolenaar call assert_equal(2, line('.')) 20318a9bc95eSBram Moolenaar call assert_equal(-1, foldclosedend(line('.'))) 20328a9bc95eSBram Moolenaar 20338a9bc95eSBram Moolenaar close! 20348a9bc95eSBram Moolenaarendfunc 20358a9bc95eSBram Moolenaar 2036d1ad99b6SBram Moolenaar" Test for changing case using u, U, gu, gU and ~ (tilde) commands 20371671f448SBram Moolenaarfunc Test_normal30_changecase() 203887bc3f74SBram Moolenaar new 203987bc3f74SBram Moolenaar call append(0, 'This is a simple test: äüöß') 204087bc3f74SBram Moolenaar norm! 1ggVu 204187bc3f74SBram Moolenaar call assert_equal('this is a simple test: äüöß', getline('.')) 204287bc3f74SBram Moolenaar norm! VU 204387bc3f74SBram Moolenaar call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.')) 204487bc3f74SBram Moolenaar norm! guu 204587bc3f74SBram Moolenaar call assert_equal('this is a simple test: äüöss', getline('.')) 204687bc3f74SBram Moolenaar norm! gUgU 204787bc3f74SBram Moolenaar call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.')) 204887bc3f74SBram Moolenaar norm! gugu 204987bc3f74SBram Moolenaar call assert_equal('this is a simple test: äüöss', getline('.')) 205087bc3f74SBram Moolenaar norm! gUU 205187bc3f74SBram Moolenaar call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.')) 205287bc3f74SBram Moolenaar norm! 010~ 205387bc3f74SBram Moolenaar call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.')) 205487bc3f74SBram Moolenaar norm! V~ 205587bc3f74SBram Moolenaar call assert_equal('THIS IS A simple test: äüöss', getline('.')) 2056d1ad99b6SBram Moolenaar call assert_beeps('norm! c~') 2057d1ad99b6SBram Moolenaar %d 2058d1ad99b6SBram Moolenaar call assert_beeps('norm! ~') 205987bc3f74SBram Moolenaar 20601671f448SBram Moolenaar " Test for changing case across lines using 'whichwrap' 20611671f448SBram Moolenaar call setline(1, ['aaaaaa', 'aaaaaa']) 20621671f448SBram Moolenaar normal! gg10~ 20631671f448SBram Moolenaar call assert_equal(['AAAAAA', 'aaaaaa'], getline(1, 2)) 20641671f448SBram Moolenaar set whichwrap+=~ 20651671f448SBram Moolenaar normal! gg10~ 20661671f448SBram Moolenaar call assert_equal(['aaaaaa', 'AAAAaa'], getline(1, 2)) 20671671f448SBram Moolenaar set whichwrap& 20681671f448SBram Moolenaar 20693e72dcadSBram Moolenaar " try changing the case with a double byte encoding (DBCS) 20703e72dcadSBram Moolenaar %bw! 20713e72dcadSBram Moolenaar let enc = &enc 20723e72dcadSBram Moolenaar set encoding=cp932 20733e72dcadSBram Moolenaar call setline(1, "\u8470") 20743e72dcadSBram Moolenaar normal ~ 20753e72dcadSBram Moolenaar normal gU$gu$gUgUg~g~gugu 20763e72dcadSBram Moolenaar call assert_equal("\u8470", getline(1)) 20773e72dcadSBram Moolenaar let &encoding = enc 20783e72dcadSBram Moolenaar 20791671f448SBram Moolenaar " clean up 20801671f448SBram Moolenaar bw! 20811671f448SBram Moolenaarendfunc 20821671f448SBram Moolenaar 2083f1c118beSBram Moolenaar" Turkish ASCII turns to multi-byte. On some systems Turkish locale 2084f1c118beSBram Moolenaar" is available but toupper()/tolower() don't do the right thing. 20851671f448SBram Moolenaarfunc Test_normal_changecase_turkish() 20861671f448SBram Moolenaar new 20873317d5ebSBram Moolenaar try 20883317d5ebSBram Moolenaar lang tr_TR.UTF-8 20893317d5ebSBram Moolenaar set casemap= 2090f1c118beSBram Moolenaar let iupper = toupper('i') 2091f1c118beSBram Moolenaar if iupper == "\u0130" 20923317d5ebSBram Moolenaar call setline(1, 'iI') 20933317d5ebSBram Moolenaar 1normal gUU 20943317d5ebSBram Moolenaar call assert_equal("\u0130I", getline(1)) 20953317d5ebSBram Moolenaar call assert_equal("\u0130I", toupper("iI")) 20963317d5ebSBram Moolenaar 20973317d5ebSBram Moolenaar call setline(1, 'iI') 20983317d5ebSBram Moolenaar 1normal guu 20993317d5ebSBram Moolenaar call assert_equal("i\u0131", getline(1)) 21003317d5ebSBram Moolenaar call assert_equal("i\u0131", tolower("iI")) 2101f1c118beSBram Moolenaar elseif iupper == "I" 2102f1c118beSBram Moolenaar call setline(1, 'iI') 2103f1c118beSBram Moolenaar 1normal gUU 2104f1c118beSBram Moolenaar call assert_equal("II", getline(1)) 2105f1c118beSBram Moolenaar call assert_equal("II", toupper("iI")) 21063317d5ebSBram Moolenaar 2107f1c118beSBram Moolenaar call setline(1, 'iI') 2108f1c118beSBram Moolenaar 1normal guu 2109f1c118beSBram Moolenaar call assert_equal("ii", getline(1)) 2110f1c118beSBram Moolenaar call assert_equal("ii", tolower("iI")) 2111f1c118beSBram Moolenaar else 2112f1c118beSBram Moolenaar call assert_true(false, "expected toupper('i') to be either 'I' or '\u0130'") 2113f1c118beSBram Moolenaar endif 21141cc48206SBram Moolenaar set casemap& 21151cc48206SBram Moolenaar call setline(1, 'iI') 21161cc48206SBram Moolenaar 1normal gUU 21171cc48206SBram Moolenaar call assert_equal("II", getline(1)) 21181cc48206SBram Moolenaar call assert_equal("II", toupper("iI")) 21191cc48206SBram Moolenaar 21201cc48206SBram Moolenaar call setline(1, 'iI') 21211cc48206SBram Moolenaar 1normal guu 21221cc48206SBram Moolenaar call assert_equal("ii", getline(1)) 21231cc48206SBram Moolenaar call assert_equal("ii", tolower("iI")) 21241cc48206SBram Moolenaar 21253317d5ebSBram Moolenaar lang en_US.UTF-8 21263317d5ebSBram Moolenaar catch /E197:/ 21273317d5ebSBram Moolenaar " can't use Turkish locale 21283317d5ebSBram Moolenaar throw 'Skipped: Turkish locale not available' 21293317d5ebSBram Moolenaar endtry 21301671f448SBram Moolenaar close! 21312931f2a5SBram Moolenaarendfunc 213287bc3f74SBram Moolenaar 21331671f448SBram Moolenaar" Test for r (replace) command 21341671f448SBram Moolenaarfunc Test_normal31_r_cmd() 213587bc3f74SBram Moolenaar new 213687bc3f74SBram Moolenaar call append(0, 'This is a simple test: abcd') 213787bc3f74SBram Moolenaar exe "norm! 1gg$r\<cr>" 213887bc3f74SBram Moolenaar call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$')) 213987bc3f74SBram Moolenaar exe "norm! 1gg2wlr\<cr>" 214087bc3f74SBram Moolenaar call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$')) 214187bc3f74SBram Moolenaar exe "norm! 2gg0W5r\<cr>" 214287bc3f74SBram Moolenaar call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$')) 214387bc3f74SBram Moolenaar set autoindent 214487bc3f74SBram Moolenaar call setline(2, ['simple test: abc', '']) 214587bc3f74SBram Moolenaar exe "norm! 2gg0W5r\<cr>" 214687bc3f74SBram Moolenaar call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$')) 214787bc3f74SBram Moolenaar exe "norm! 1ggVr\<cr>" 214887bc3f74SBram Moolenaar call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1))) 214987bc3f74SBram Moolenaar call setline(1, 'This is a') 215087bc3f74SBram Moolenaar exe "norm! 1gg05rf" 215187bc3f74SBram Moolenaar call assert_equal('fffffis a', getline(1)) 215287bc3f74SBram Moolenaar 21531671f448SBram Moolenaar " When replacing characters, copy characters from above and below lines 21541671f448SBram Moolenaar " using CTRL-Y and CTRL-E. 21551671f448SBram Moolenaar " Different code paths are used for utf-8 and latin1 encodings 21561671f448SBram Moolenaar set showmatch 21571671f448SBram Moolenaar for enc in ['latin1', 'utf-8'] 21581671f448SBram Moolenaar enew! 21591671f448SBram Moolenaar let &encoding = enc 21601671f448SBram Moolenaar call setline(1, [' {a}', 'xxxxxxxxxx', ' [b]']) 21611671f448SBram Moolenaar exe "norm! 2gg5r\<C-Y>l5r\<C-E>" 21621671f448SBram Moolenaar call assert_equal(' {a}x [b]x', getline(2)) 21631671f448SBram Moolenaar endfor 21641671f448SBram Moolenaar set showmatch& 21651671f448SBram Moolenaar 21661671f448SBram Moolenaar " r command should fail in operator pending mode 21671671f448SBram Moolenaar call assert_beeps('normal! cr') 21681671f448SBram Moolenaar 2169004a6781SBram Moolenaar " replace a tab character in visual mode 2170004a6781SBram Moolenaar %d 2171004a6781SBram Moolenaar call setline(1, ["a\tb", "c\td", "e\tf"]) 2172004a6781SBram Moolenaar normal gglvjjrx 2173004a6781SBram Moolenaar call assert_equal(['axx', 'xxx', 'xxf'], getline(1, '$')) 2174004a6781SBram Moolenaar 2175d7e5e943SBram Moolenaar " replace with a multibyte character (with multiple composing characters) 2176d7e5e943SBram Moolenaar %d 2177d7e5e943SBram Moolenaar new 2178d7e5e943SBram Moolenaar call setline(1, 'aaa') 2179d7e5e943SBram Moolenaar exe "normal $ra\u0328\u0301" 2180d7e5e943SBram Moolenaar call assert_equal("aaa\u0328\u0301", getline(1)) 2181d7e5e943SBram Moolenaar 218287bc3f74SBram Moolenaar " clean up 218387bc3f74SBram Moolenaar set noautoindent 218487bc3f74SBram Moolenaar bw! 21852931f2a5SBram Moolenaarendfunc 218687bc3f74SBram Moolenaar 218787bc3f74SBram Moolenaar" Test for g*, g# 2188f5f1e10dSBram Moolenaarfunc Test_normal32_g_cmd1() 218987bc3f74SBram Moolenaar new 219087bc3f74SBram Moolenaar call append(0, ['abc.x_foo', 'x_foobar.abc']) 219187bc3f74SBram Moolenaar 1 219287bc3f74SBram Moolenaar norm! $g* 219387bc3f74SBram Moolenaar call assert_equal('x_foo', @/) 219487bc3f74SBram Moolenaar call assert_equal('x_foobar.abc', getline('.')) 219587bc3f74SBram Moolenaar norm! $g# 219687bc3f74SBram Moolenaar call assert_equal('abc', @/) 219787bc3f74SBram Moolenaar call assert_equal('abc.x_foo', getline('.')) 219887bc3f74SBram Moolenaar 219987bc3f74SBram Moolenaar " clean up 220087bc3f74SBram Moolenaar bw! 22012931f2a5SBram Moolenaarendfunc 220287bc3f74SBram Moolenaar 2203f5f1e10dSBram Moolenaar" Test for g`, g;, g,, g&, gv, gk, gj, gJ, g0, g^, g_, gm, g$, gM, g CTRL-G, 2204f5f1e10dSBram Moolenaar" gi and gI commands 22051671f448SBram Moolenaarfunc Test_normal33_g_cmd2() 2206004a6781SBram Moolenaar CheckFeature jumplist 220787bc3f74SBram Moolenaar call Setup_NewWindow() 220887bc3f74SBram Moolenaar " Test for g` 220987bc3f74SBram Moolenaar clearjumps 221087bc3f74SBram Moolenaar norm! ma10j 221187bc3f74SBram Moolenaar let a=execute(':jumps') 221287bc3f74SBram Moolenaar " empty jumplist 221387bc3f74SBram Moolenaar call assert_equal('>', a[-1:]) 221487bc3f74SBram Moolenaar norm! g`a 221587bc3f74SBram Moolenaar call assert_equal('>', a[-1:]) 221687bc3f74SBram Moolenaar call assert_equal(1, line('.')) 221787bc3f74SBram Moolenaar call assert_equal('1', getline('.')) 2218f5f1e10dSBram Moolenaar call cursor(10, 1) 2219f5f1e10dSBram Moolenaar norm! g'a 2220f5f1e10dSBram Moolenaar call assert_equal('>', a[-1:]) 2221f5f1e10dSBram Moolenaar call assert_equal(1, line('.')) 222287bc3f74SBram Moolenaar 222387bc3f74SBram Moolenaar " Test for g; and g, 222487bc3f74SBram Moolenaar norm! g; 222587bc3f74SBram Moolenaar " there is only one change in the changelist 222687bc3f74SBram Moolenaar " currently, when we setup the window 222787bc3f74SBram Moolenaar call assert_equal(2, line('.')) 2228e2e4075fSBram Moolenaar call assert_fails(':norm! g;', 'E662:') 2229e2e4075fSBram Moolenaar call assert_fails(':norm! g,', 'E663:') 223087bc3f74SBram Moolenaar let &ul=&ul 223187bc3f74SBram Moolenaar call append('$', ['a', 'b', 'c', 'd']) 223287bc3f74SBram Moolenaar let &ul=&ul 223387bc3f74SBram Moolenaar call append('$', ['Z', 'Y', 'X', 'W']) 223487bc3f74SBram Moolenaar let a = execute(':changes') 223587bc3f74SBram Moolenaar call assert_match('2\s\+0\s\+2', a) 223687bc3f74SBram Moolenaar call assert_match('101\s\+0\s\+a', a) 223787bc3f74SBram Moolenaar call assert_match('105\s\+0\s\+Z', a) 223887bc3f74SBram Moolenaar norm! 3g; 223987bc3f74SBram Moolenaar call assert_equal(2, line('.')) 224087bc3f74SBram Moolenaar norm! 2g, 224187bc3f74SBram Moolenaar call assert_equal(105, line('.')) 224287bc3f74SBram Moolenaar 224387bc3f74SBram Moolenaar " Test for g& - global substitute 224487bc3f74SBram Moolenaar %d 224587bc3f74SBram Moolenaar call setline(1, range(1,10)) 224687bc3f74SBram Moolenaar call append('$', ['a', 'b', 'c', 'd']) 224787bc3f74SBram Moolenaar $s/\w/&&/g 224887bc3f74SBram Moolenaar exe "norm! /[1-8]\<cr>" 224987bc3f74SBram Moolenaar norm! g& 225087bc3f74SBram Moolenaar call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$')) 225187bc3f74SBram Moolenaar 22521671f448SBram Moolenaar " Jumping to a fold using gg should open the fold 22531671f448SBram Moolenaar set foldenable 22541671f448SBram Moolenaar set foldopen+=jump 22551671f448SBram Moolenaar 5,8fold 22561671f448SBram Moolenaar call feedkeys('6gg', 'xt') 22571671f448SBram Moolenaar call assert_equal(1, foldlevel('.')) 22581671f448SBram Moolenaar call assert_equal(-1, foldclosed('.')) 22591671f448SBram Moolenaar set foldopen-=jump 22601671f448SBram Moolenaar set foldenable& 22611671f448SBram Moolenaar 226287bc3f74SBram Moolenaar " Test for gv 226387bc3f74SBram Moolenaar %d 226487bc3f74SBram Moolenaar call append('$', repeat(['abcdefgh'], 8)) 226587bc3f74SBram Moolenaar exe "norm! 2gg02l\<c-v>2j2ly" 226687bc3f74SBram Moolenaar call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1)) 226787bc3f74SBram Moolenaar " in visual mode, gv swaps current and last selected region 226887bc3f74SBram Moolenaar exe "norm! G0\<c-v>4k4lgvd" 226987bc3f74SBram Moolenaar call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$')) 227087bc3f74SBram Moolenaar exe "norm! G0\<c-v>4k4ly" 227187bc3f74SBram Moolenaar exe "norm! gvood" 227287bc3f74SBram Moolenaar call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$')) 2273f5f1e10dSBram Moolenaar " gv cannot be used in operator pending mode 2274f5f1e10dSBram Moolenaar call assert_beeps('normal! cgv') 2275f5f1e10dSBram Moolenaar " gv should beep without a previously selected visual area 2276f5f1e10dSBram Moolenaar new 2277f5f1e10dSBram Moolenaar call assert_beeps('normal! gv') 2278f5f1e10dSBram Moolenaar close 227987bc3f74SBram Moolenaar 228087bc3f74SBram Moolenaar " Test for gk/gj 228187bc3f74SBram Moolenaar %d 228287bc3f74SBram Moolenaar 15vsp 228387bc3f74SBram Moolenaar set wrap listchars= sbr= 228487bc3f74SBram Moolenaar let lineA = 'abcdefghijklmnopqrstuvwxyz' 228587bc3f74SBram Moolenaar let lineB = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' 22868b530c1fSBram Moolenaar let lineC = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' 228787bc3f74SBram Moolenaar $put =lineA 228887bc3f74SBram Moolenaar $put =lineB 228987bc3f74SBram Moolenaar 229087bc3f74SBram Moolenaar norm! 3gg0dgk 229187bc3f74SBram Moolenaar call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$')) 229287bc3f74SBram Moolenaar set nu 229387bc3f74SBram Moolenaar norm! 3gg0gjdgj 229487bc3f74SBram Moolenaar call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$')) 229587bc3f74SBram Moolenaar 229687bc3f74SBram Moolenaar " Test for gJ 229787bc3f74SBram Moolenaar norm! 2gggJ 229887bc3f74SBram Moolenaar call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$')) 229987bc3f74SBram Moolenaar call assert_equal(16, col('.')) 230087bc3f74SBram Moolenaar " shouldn't do anything 230187bc3f74SBram Moolenaar norm! 10gJ 230287bc3f74SBram Moolenaar call assert_equal(1, col('.')) 230387bc3f74SBram Moolenaar 230487bc3f74SBram Moolenaar " Test for g0 g^ gm g$ 230587bc3f74SBram Moolenaar exe "norm! 2gg0gji " 230687bc3f74SBram Moolenaar call assert_equal(['', 'abcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$')) 230787bc3f74SBram Moolenaar norm! g0yl 230887bc3f74SBram Moolenaar call assert_equal(12, col('.')) 230987bc3f74SBram Moolenaar call assert_equal(' ', getreg(0)) 231087bc3f74SBram Moolenaar norm! g$yl 231187bc3f74SBram Moolenaar call assert_equal(22, col('.')) 231287bc3f74SBram Moolenaar call assert_equal('3', getreg(0)) 231387bc3f74SBram Moolenaar norm! gmyl 231487bc3f74SBram Moolenaar call assert_equal(17, col('.')) 231587bc3f74SBram Moolenaar call assert_equal('n', getreg(0)) 231687bc3f74SBram Moolenaar norm! g^yl 231787bc3f74SBram Moolenaar call assert_equal(15, col('.')) 231887bc3f74SBram Moolenaar call assert_equal('l', getreg(0)) 2319f5f1e10dSBram Moolenaar call assert_beeps('normal 5g$') 232074ede80aSBram Moolenaar 232174ede80aSBram Moolenaar " Test for g$ with double-width character half displayed 232274ede80aSBram Moolenaar vsplit 232374ede80aSBram Moolenaar 9wincmd | 232474ede80aSBram Moolenaar setlocal nowrap nonumber 232574ede80aSBram Moolenaar call setline(2, 'asdfasdfヨ') 232674ede80aSBram Moolenaar 2 232774ede80aSBram Moolenaar normal 0g$ 232874ede80aSBram Moolenaar call assert_equal(8, col('.')) 232974ede80aSBram Moolenaar 10wincmd | 233074ede80aSBram Moolenaar normal 0g$ 233174ede80aSBram Moolenaar call assert_equal(9, col('.')) 233274ede80aSBram Moolenaar 233374ede80aSBram Moolenaar setlocal signcolumn=yes 233474ede80aSBram Moolenaar 11wincmd | 233574ede80aSBram Moolenaar normal 0g$ 233674ede80aSBram Moolenaar call assert_equal(8, col('.')) 233774ede80aSBram Moolenaar 12wincmd | 233874ede80aSBram Moolenaar normal 0g$ 233974ede80aSBram Moolenaar call assert_equal(9, col('.')) 234074ede80aSBram Moolenaar 234174ede80aSBram Moolenaar close 234287bc3f74SBram Moolenaar 2343f5f1e10dSBram Moolenaar " Test for g_ 2344f5f1e10dSBram Moolenaar call assert_beeps('normal! 100g_') 2345f5f1e10dSBram Moolenaar call setline(2, [' foo ', ' foobar ']) 2346f5f1e10dSBram Moolenaar normal! 2ggg_ 2347f5f1e10dSBram Moolenaar call assert_equal(5, col('.')) 2348f5f1e10dSBram Moolenaar normal! 2g_ 2349f5f1e10dSBram Moolenaar call assert_equal(8, col('.')) 2350f5f1e10dSBram Moolenaar 2351f5f1e10dSBram Moolenaar norm! 2ggdG 23528b530c1fSBram Moolenaar $put =lineC 23538b530c1fSBram Moolenaar 23548b530c1fSBram Moolenaar " Test for gM 23558b530c1fSBram Moolenaar norm! gMyl 23568b530c1fSBram Moolenaar call assert_equal(73, col('.')) 23578b530c1fSBram Moolenaar call assert_equal('0', getreg(0)) 23588b530c1fSBram Moolenaar " Test for 20gM 23598b530c1fSBram Moolenaar norm! 20gMyl 23608b530c1fSBram Moolenaar call assert_equal(29, col('.')) 23618b530c1fSBram Moolenaar call assert_equal('S', getreg(0)) 23628b530c1fSBram Moolenaar " Test for 60gM 23638b530c1fSBram Moolenaar norm! 60gMyl 23648b530c1fSBram Moolenaar call assert_equal(87, col('.')) 23658b530c1fSBram Moolenaar call assert_equal('E', getreg(0)) 23668b530c1fSBram Moolenaar 23678b530c1fSBram Moolenaar " Test for g Ctrl-G 23688b530c1fSBram Moolenaar set ff=unix 23698b530c1fSBram Moolenaar let a=execute(":norm! g\<c-g>") 23708b530c1fSBram Moolenaar call assert_match('Col 87 of 144; Line 2 of 2; Word 1 of 1; Byte 88 of 146', a) 23718b530c1fSBram Moolenaar 237287bc3f74SBram Moolenaar " Test for gI 237387bc3f74SBram Moolenaar norm! gIfoo 23748b530c1fSBram Moolenaar call assert_equal(['', 'foo0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'], getline(1,'$')) 237587bc3f74SBram Moolenaar 237687bc3f74SBram Moolenaar " Test for gi 237787bc3f74SBram Moolenaar wincmd c 237887bc3f74SBram Moolenaar %d 237987bc3f74SBram Moolenaar set tw=0 238087bc3f74SBram Moolenaar call setline(1, ['foobar', 'new line']) 238187bc3f74SBram Moolenaar norm! A next word 238287bc3f74SBram Moolenaar $put ='third line' 238387bc3f74SBram Moolenaar norm! gi another word 238487bc3f74SBram Moolenaar call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$')) 2385f5f1e10dSBram Moolenaar call setline(1, 'foobar') 2386f5f1e10dSBram Moolenaar normal! Ggifirst line 2387f5f1e10dSBram Moolenaar call assert_equal('foobarfirst line', getline(1)) 2388f5f1e10dSBram Moolenaar " Test gi in 'virtualedit' mode with cursor after the end of the line 2389f5f1e10dSBram Moolenaar set virtualedit=all 2390f5f1e10dSBram Moolenaar call setline(1, 'foo') 2391f5f1e10dSBram Moolenaar exe "normal! Abar\<Right>\<Right>\<Right>\<Right>" 2392f5f1e10dSBram Moolenaar call setline(1, 'foo') 2393f5f1e10dSBram Moolenaar normal! Ggifirst line 2394f5f1e10dSBram Moolenaar call assert_equal('foo first line', getline(1)) 2395f5f1e10dSBram Moolenaar set virtualedit& 239687bc3f74SBram Moolenaar 23971671f448SBram Moolenaar " Test for aboring a g command using CTRL-\ CTRL-G 23981671f448SBram Moolenaar exe "normal! g\<C-\>\<C-G>" 23991671f448SBram Moolenaar call assert_equal('foo first line', getline('.')) 24001671f448SBram Moolenaar 240187bc3f74SBram Moolenaar " clean up 240287bc3f74SBram Moolenaar bw! 24032931f2a5SBram Moolenaarendfunc 240487bc3f74SBram Moolenaar 2405f5f1e10dSBram Moolenaar" Test for g CTRL-G 24061bbb6194SBram Moolenaarfunc Test_g_ctrl_g() 24070529583fSBram Moolenaar new 24080529583fSBram Moolenaar 24090529583fSBram Moolenaar let a = execute(":norm! g\<c-g>") 24100529583fSBram Moolenaar call assert_equal("\n--No lines in buffer--", a) 24110529583fSBram Moolenaar 24121671f448SBram Moolenaar " Test for CTRL-G (same as :file) 24131671f448SBram Moolenaar let a = execute(":norm! \<c-g>") 24141671f448SBram Moolenaar call assert_equal("\n\n\"[No Name]\" --No lines in buffer--", a) 24151671f448SBram Moolenaar 24160529583fSBram Moolenaar call setline(1, ['first line', 'second line']) 24170529583fSBram Moolenaar 24180529583fSBram Moolenaar " Test g CTRL-g with dos, mac and unix file type. 24190529583fSBram Moolenaar norm! gojll 24200529583fSBram Moolenaar set ff=dos 24210529583fSBram Moolenaar let a = execute(":norm! g\<c-g>") 24220529583fSBram Moolenaar call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 15 of 25", a) 24230529583fSBram Moolenaar 24240529583fSBram Moolenaar set ff=mac 24250529583fSBram Moolenaar let a = execute(":norm! g\<c-g>") 24260529583fSBram Moolenaar call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a) 24270529583fSBram Moolenaar 24280529583fSBram Moolenaar set ff=unix 24290529583fSBram Moolenaar let a = execute(":norm! g\<c-g>") 24300529583fSBram Moolenaar call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a) 24310529583fSBram Moolenaar 24320529583fSBram Moolenaar " Test g CTRL-g in visual mode (v) 24330529583fSBram Moolenaar let a = execute(":norm! gojllvlg\<c-g>") 24340529583fSBram Moolenaar call assert_equal("\nSelected 1 of 2 Lines; 1 of 4 Words; 2 of 23 Bytes", a) 24350529583fSBram Moolenaar 24360529583fSBram Moolenaar " Test g CTRL-g in visual mode (CTRL-V) with end col > start col 24370529583fSBram Moolenaar let a = execute(":norm! \<Esc>gojll\<C-V>kllg\<c-g>") 24380529583fSBram Moolenaar call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a) 24390529583fSBram Moolenaar 24400529583fSBram Moolenaar " Test g_CTRL-g in visual mode (CTRL-V) with end col < start col 24410529583fSBram Moolenaar let a = execute(":norm! \<Esc>goll\<C-V>jhhg\<c-g>") 24420529583fSBram Moolenaar call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a) 24430529583fSBram Moolenaar 24440529583fSBram Moolenaar " Test g CTRL-g in visual mode (CTRL-V) with end_vcol being MAXCOL 24450529583fSBram Moolenaar let a = execute(":norm! \<Esc>gojll\<C-V>k$g\<c-g>") 24460529583fSBram Moolenaar call assert_equal("\nSelected 2 of 2 Lines; 4 of 4 Words; 17 of 23 Bytes", a) 24470529583fSBram Moolenaar 24480529583fSBram Moolenaar " There should be one byte less with noeol 24490529583fSBram Moolenaar set bin noeol 24500529583fSBram Moolenaar let a = execute(":norm! \<Esc>gog\<c-g>") 24510529583fSBram Moolenaar call assert_equal("\nCol 1 of 10; Line 1 of 2; Word 1 of 4; Char 1 of 23; Byte 1 of 22", a) 24520529583fSBram Moolenaar set bin & eol& 24530529583fSBram Moolenaar 24540529583fSBram Moolenaar call setline(1, ['Français', '日本語']) 24550529583fSBram Moolenaar 24560529583fSBram Moolenaar let a = execute(":norm! \<Esc>gojlg\<c-g>") 24570529583fSBram Moolenaar call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20", a) 24580529583fSBram Moolenaar 24590529583fSBram Moolenaar let a = execute(":norm! \<Esc>gojvlg\<c-g>") 24600529583fSBram Moolenaar call assert_equal("\nSelected 1 of 2 Lines; 1 of 2 Words; 2 of 13 Chars; 6 of 20 Bytes", a) 24610529583fSBram Moolenaar 24620529583fSBram Moolenaar let a = execute(":norm! \<Esc>goll\<c-v>jlg\<c-g>") 24630529583fSBram Moolenaar call assert_equal("\nSelected 4 Cols; 2 of 2 Lines; 2 of 2 Words; 6 of 13 Chars; 11 of 20 Bytes", a) 24640529583fSBram Moolenaar 24650529583fSBram Moolenaar set fenc=utf8 bomb 24660529583fSBram Moolenaar let a = execute(":norm! \<Esc>gojlg\<c-g>") 24670529583fSBram Moolenaar call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+3 for BOM)", a) 24680529583fSBram Moolenaar 24690529583fSBram Moolenaar set fenc=utf16 bomb 24700529583fSBram Moolenaar let a = execute(":norm! g\<c-g>") 24710529583fSBram Moolenaar call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+2 for BOM)", a) 24720529583fSBram Moolenaar 24730529583fSBram Moolenaar set fenc=utf32 bomb 24740529583fSBram Moolenaar let a = execute(":norm! g\<c-g>") 24750529583fSBram Moolenaar call assert_equal("\nCol 4-3 of 9-6; Line 2 of 2; Word 2 of 2; Char 11 of 13; Byte 16 of 20(+4 for BOM)", a) 24760529583fSBram Moolenaar 24770529583fSBram Moolenaar set fenc& bomb& 24780529583fSBram Moolenaar 24790529583fSBram Moolenaar set ff& 24800529583fSBram Moolenaar bwipe! 24810529583fSBram Moolenaarendfunc 24820529583fSBram Moolenaar 248387bc3f74SBram Moolenaar" Test for g8 24841671f448SBram Moolenaarfunc Test_normal34_g_cmd3() 248587bc3f74SBram Moolenaar new 2486395b6babSBram Moolenaar let a=execute(':norm! 1G0g8') 2487395b6babSBram Moolenaar call assert_equal("\nNUL", a) 248887bc3f74SBram Moolenaar 2489395b6babSBram Moolenaar call setline(1, 'abcdefghijklmnopqrstuvwxyzäüö') 2490395b6babSBram Moolenaar let a=execute(':norm! 1G$g8') 2491395b6babSBram Moolenaar call assert_equal("\nc3 b6 ", a) 2492395b6babSBram Moolenaar 2493395b6babSBram Moolenaar call setline(1, "a\u0302") 2494395b6babSBram Moolenaar let a=execute(':norm! 1G0g8') 2495395b6babSBram Moolenaar call assert_equal("\n61 + cc 82 ", a) 2496395b6babSBram Moolenaar 249787bc3f74SBram Moolenaar " clean up 249887bc3f74SBram Moolenaar bw! 24992931f2a5SBram Moolenaarendfunc 250087bc3f74SBram Moolenaar 2501f5f1e10dSBram Moolenaar" Test 8g8 which finds invalid utf8 at or after the cursor. 2502395b6babSBram Moolenaarfunc Test_normal_8g8() 2503395b6babSBram Moolenaar new 2504395b6babSBram Moolenaar 2505395b6babSBram Moolenaar " With invalid byte. 2506395b6babSBram Moolenaar call setline(1, "___\xff___") 2507395b6babSBram Moolenaar norm! 1G08g8g 2508395b6babSBram Moolenaar call assert_equal([0, 1, 4, 0, 1], getcurpos()) 2509395b6babSBram Moolenaar 2510395b6babSBram Moolenaar " With invalid byte before the cursor. 2511395b6babSBram Moolenaar call setline(1, "___\xff___") 2512395b6babSBram Moolenaar norm! 1G$h8g8g 2513395b6babSBram Moolenaar call assert_equal([0, 1, 6, 0, 9], getcurpos()) 2514395b6babSBram Moolenaar 2515395b6babSBram Moolenaar " With truncated sequence. 2516395b6babSBram Moolenaar call setline(1, "___\xE2\x82___") 2517395b6babSBram Moolenaar norm! 1G08g8g 2518395b6babSBram Moolenaar call assert_equal([0, 1, 4, 0, 1], getcurpos()) 2519395b6babSBram Moolenaar 2520395b6babSBram Moolenaar " With overlong sequence. 2521395b6babSBram Moolenaar call setline(1, "___\xF0\x82\x82\xAC___") 2522395b6babSBram Moolenaar norm! 1G08g8g 2523395b6babSBram Moolenaar call assert_equal([0, 1, 4, 0, 1], getcurpos()) 2524395b6babSBram Moolenaar 2525395b6babSBram Moolenaar " With valid utf8. 2526395b6babSBram Moolenaar call setline(1, "café") 2527395b6babSBram Moolenaar norm! 1G08g8 2528395b6babSBram Moolenaar call assert_equal([0, 1, 1, 0, 1], getcurpos()) 2529395b6babSBram Moolenaar 2530395b6babSBram Moolenaar bw! 2531395b6babSBram Moolenaarendfunc 2532395b6babSBram Moolenaar 253387bc3f74SBram Moolenaar" Test for g< 25341671f448SBram Moolenaarfunc Test_normal35_g_cmd4() 253587bc3f74SBram Moolenaar " Cannot capture its output, 253687bc3f74SBram Moolenaar " probably a bug, therefore, test disabled: 253731845093SBram Moolenaar throw "Skipped: output of g< can't be tested currently" 253887bc3f74SBram Moolenaar echo "a\nb\nc\nd" 253987bc3f74SBram Moolenaar let b=execute(':norm! g<') 254087bc3f74SBram Moolenaar call assert_true(!empty(b), 'failed `execute(g<)`') 25412931f2a5SBram Moolenaarendfunc 254287bc3f74SBram Moolenaar 2543f5f1e10dSBram Moolenaar" Test for gp gP go 25441671f448SBram Moolenaarfunc Test_normal36_g_cmd5() 254587bc3f74SBram Moolenaar new 254687bc3f74SBram Moolenaar call append(0, 'abcdefghijklmnopqrstuvwxyz') 25470913a108SBram Moolenaar set ff=unix 254887bc3f74SBram Moolenaar " Test for gp gP 254987bc3f74SBram Moolenaar call append(1, range(1,10)) 255087bc3f74SBram Moolenaar 1 255187bc3f74SBram Moolenaar norm! 1yy 255287bc3f74SBram Moolenaar 3 255387bc3f74SBram Moolenaar norm! gp 255487bc3f74SBram Moolenaar call assert_equal([0, 5, 1, 0, 1], getcurpos()) 255587bc3f74SBram Moolenaar $ 255687bc3f74SBram Moolenaar norm! gP 255787bc3f74SBram Moolenaar call assert_equal([0, 14, 1, 0, 1], getcurpos()) 255887bc3f74SBram Moolenaar 255987bc3f74SBram Moolenaar " Test for go 256087bc3f74SBram Moolenaar norm! 26go 256187bc3f74SBram Moolenaar call assert_equal([0, 1, 26, 0, 26], getcurpos()) 256287bc3f74SBram Moolenaar norm! 27go 256387bc3f74SBram Moolenaar call assert_equal([0, 1, 26, 0, 26], getcurpos()) 256487bc3f74SBram Moolenaar norm! 28go 256587bc3f74SBram Moolenaar call assert_equal([0, 2, 1, 0, 1], getcurpos()) 256687bc3f74SBram Moolenaar set ff=dos 256787bc3f74SBram Moolenaar norm! 29go 256887bc3f74SBram Moolenaar call assert_equal([0, 2, 1, 0, 1], getcurpos()) 256987bc3f74SBram Moolenaar set ff=unix 257087bc3f74SBram Moolenaar norm! gg0 257187bc3f74SBram Moolenaar norm! 101go 257287bc3f74SBram Moolenaar call assert_equal([0, 13, 26, 0, 26], getcurpos()) 257387bc3f74SBram Moolenaar norm! 103go 257487bc3f74SBram Moolenaar call assert_equal([0, 14, 1, 0, 1], getcurpos()) 257587bc3f74SBram Moolenaar " count > buffer content 257687bc3f74SBram Moolenaar norm! 120go 257787bc3f74SBram Moolenaar call assert_equal([0, 14, 1, 0, 2147483647], getcurpos()) 257887bc3f74SBram Moolenaar " clean up 257987bc3f74SBram Moolenaar bw! 25802931f2a5SBram Moolenaarendfunc 258187bc3f74SBram Moolenaar 2582f5f1e10dSBram Moolenaar" Test for gt and gT 25831671f448SBram Moolenaarfunc Test_normal37_g_cmd6() 258487bc3f74SBram Moolenaar tabnew 1.txt 258587bc3f74SBram Moolenaar tabnew 2.txt 258687bc3f74SBram Moolenaar tabnew 3.txt 258787bc3f74SBram Moolenaar norm! 1gt 258887bc3f74SBram Moolenaar call assert_equal(1, tabpagenr()) 258987bc3f74SBram Moolenaar norm! 3gt 259087bc3f74SBram Moolenaar call assert_equal(3, tabpagenr()) 259187bc3f74SBram Moolenaar norm! 1gT 259287bc3f74SBram Moolenaar " count gT goes not to the absolute tabpagenumber 259387bc3f74SBram Moolenaar " but, but goes to the count previous tabpagenumber 259487bc3f74SBram Moolenaar call assert_equal(2, tabpagenr()) 259587bc3f74SBram Moolenaar " wrap around 259687bc3f74SBram Moolenaar norm! 3gT 259787bc3f74SBram Moolenaar call assert_equal(3, tabpagenr()) 259887bc3f74SBram Moolenaar " gt does not wrap around 259987bc3f74SBram Moolenaar norm! 5gt 260087bc3f74SBram Moolenaar call assert_equal(3, tabpagenr()) 260187bc3f74SBram Moolenaar 260287bc3f74SBram Moolenaar for i in range(3) 260387bc3f74SBram Moolenaar tabclose 260487bc3f74SBram Moolenaar endfor 260587bc3f74SBram Moolenaar " clean up 2606bc2b71d4SBram Moolenaar call assert_fails(':tabclose', 'E784:') 26072931f2a5SBram Moolenaarendfunc 260887bc3f74SBram Moolenaar 260987bc3f74SBram Moolenaar" Test for <Home> and <C-Home> key 26101671f448SBram Moolenaarfunc Test_normal38_nvhome() 261187bc3f74SBram Moolenaar new 261287bc3f74SBram Moolenaar call setline(1, range(10)) 261387bc3f74SBram Moolenaar $ 261487bc3f74SBram Moolenaar setl et sw=2 261587bc3f74SBram Moolenaar norm! V10>$ 261687bc3f74SBram Moolenaar " count is ignored 261787bc3f74SBram Moolenaar exe "norm! 10\<home>" 261887bc3f74SBram Moolenaar call assert_equal(1, col('.')) 261987bc3f74SBram Moolenaar exe "norm! \<home>" 262087bc3f74SBram Moolenaar call assert_equal([0, 10, 1, 0, 1], getcurpos()) 262187bc3f74SBram Moolenaar exe "norm! 5\<c-home>" 262287bc3f74SBram Moolenaar call assert_equal([0, 5, 1, 0, 1], getcurpos()) 262387bc3f74SBram Moolenaar exe "norm! \<c-home>" 262487bc3f74SBram Moolenaar call assert_equal([0, 1, 1, 0, 1], getcurpos()) 2625f5f1e10dSBram Moolenaar exe "norm! G\<c-kHome>" 2626f5f1e10dSBram Moolenaar call assert_equal([0, 1, 1, 0, 1], getcurpos()) 262787bc3f74SBram Moolenaar 262887bc3f74SBram Moolenaar " clean up 262987bc3f74SBram Moolenaar bw! 26302931f2a5SBram Moolenaarendfunc 263187bc3f74SBram Moolenaar 26321671f448SBram Moolenaar" Test for <End> and <C-End> keys 26331671f448SBram Moolenaarfunc Test_normal_nvend() 26341671f448SBram Moolenaar new 26351671f448SBram Moolenaar call setline(1, map(range(1, 10), '"line" .. v:val')) 26361671f448SBram Moolenaar exe "normal! \<End>" 26371671f448SBram Moolenaar call assert_equal(5, col('.')) 26381671f448SBram Moolenaar exe "normal! 4\<End>" 26391671f448SBram Moolenaar call assert_equal([4, 5], [line('.'), col('.')]) 26401671f448SBram Moolenaar exe "normal! \<C-End>" 26411671f448SBram Moolenaar call assert_equal([10, 6], [line('.'), col('.')]) 26421671f448SBram Moolenaar close! 26431671f448SBram Moolenaarendfunc 26441671f448SBram Moolenaar 2645f5f1e10dSBram Moolenaar" Test for cw cW ce 26461671f448SBram Moolenaarfunc Test_normal39_cw() 264787bc3f74SBram Moolenaar " Test for cw and cW on whitespace 264887bc3f74SBram Moolenaar new 264987bc3f74SBram Moolenaar set tw=0 265087bc3f74SBram Moolenaar call append(0, 'here are some words') 265187bc3f74SBram Moolenaar norm! 1gg0elcwZZZ 265287bc3f74SBram Moolenaar call assert_equal('hereZZZare some words', getline('.')) 265387bc3f74SBram Moolenaar norm! 1gg0elcWYYY 265487bc3f74SBram Moolenaar call assert_equal('hereZZZareYYYsome words', getline('.')) 265587bc3f74SBram Moolenaar norm! 2gg0cwfoo 265687bc3f74SBram Moolenaar call assert_equal('foo', getline('.')) 265787bc3f74SBram Moolenaar 2658f5f1e10dSBram Moolenaar call setline(1, 'one; two') 2659f5f1e10dSBram Moolenaar call cursor(1, 1) 2660f5f1e10dSBram Moolenaar call feedkeys('cwvim', 'xt') 2661f5f1e10dSBram Moolenaar call assert_equal('vim; two', getline(1)) 2662f5f1e10dSBram Moolenaar call feedkeys('0cWone', 'xt') 2663f5f1e10dSBram Moolenaar call assert_equal('one two', getline(1)) 2664f5f1e10dSBram Moolenaar "When cursor is at the end of a word 'ce' will change until the end of the 2665f5f1e10dSBram Moolenaar "next word, but 'cw' will change only one character 2666f5f1e10dSBram Moolenaar call setline(1, 'one two') 2667f5f1e10dSBram Moolenaar call feedkeys('0ecwce', 'xt') 2668f5f1e10dSBram Moolenaar call assert_equal('once two', getline(1)) 2669f5f1e10dSBram Moolenaar call setline(1, 'one two') 2670f5f1e10dSBram Moolenaar call feedkeys('0ecely', 'xt') 2671f5f1e10dSBram Moolenaar call assert_equal('only', getline(1)) 2672f5f1e10dSBram Moolenaar 267387bc3f74SBram Moolenaar " clean up 267487bc3f74SBram Moolenaar bw! 26752931f2a5SBram Moolenaarendfunc 267687bc3f74SBram Moolenaar 2677f5f1e10dSBram Moolenaar" Test for CTRL-\ commands 26781671f448SBram Moolenaarfunc Test_normal40_ctrl_bsl() 267987bc3f74SBram Moolenaar new 268087bc3f74SBram Moolenaar call append(0, 'here are some words') 268187bc3f74SBram Moolenaar exe "norm! 1gg0a\<C-\>\<C-N>" 268287bc3f74SBram Moolenaar call assert_equal('n', mode()) 268387bc3f74SBram Moolenaar call assert_equal(1, col('.')) 268487bc3f74SBram Moolenaar call assert_equal('', visualmode()) 268587bc3f74SBram Moolenaar exe "norm! 1gg0viw\<C-\>\<C-N>" 268687bc3f74SBram Moolenaar call assert_equal('n', mode()) 268787bc3f74SBram Moolenaar call assert_equal(4, col('.')) 268887bc3f74SBram Moolenaar exe "norm! 1gg0a\<C-\>\<C-G>" 268987bc3f74SBram Moolenaar call assert_equal('n', mode()) 269087bc3f74SBram Moolenaar call assert_equal(1, col('.')) 269187bc3f74SBram Moolenaar "imap <buffer> , <c-\><c-n> 269287bc3f74SBram Moolenaar set im 269387bc3f74SBram Moolenaar exe ":norm! \<c-\>\<c-n>dw" 269487bc3f74SBram Moolenaar set noim 269587bc3f74SBram Moolenaar call assert_equal('are some words', getline(1)) 269687bc3f74SBram Moolenaar call assert_false(&insertmode) 26971a71d31bSYegappan Lakshmanan call assert_beeps("normal! \<C-\>\<C-A>") 26981671f448SBram Moolenaar 269921829c5fSBram Moolenaar if has('cmdwin') 27001671f448SBram Moolenaar " Using CTRL-\ CTRL-N in cmd window should close the window 27011671f448SBram Moolenaar call feedkeys("q:\<C-\>\<C-N>", 'xt') 27021671f448SBram Moolenaar call assert_equal('', getcmdwintype()) 270321829c5fSBram Moolenaar endif 270487bc3f74SBram Moolenaar 270587bc3f74SBram Moolenaar " clean up 270687bc3f74SBram Moolenaar bw! 27072931f2a5SBram Moolenaarendfunc 270887bc3f74SBram Moolenaar 2709f5f1e10dSBram Moolenaar" Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>= in insert mode 27101671f448SBram Moolenaarfunc Test_normal41_insert_reg() 271187bc3f74SBram Moolenaar new 271287bc3f74SBram Moolenaar set sts=2 sw=2 ts=8 tw=0 271387bc3f74SBram Moolenaar call append(0, ["aaa\tbbb\tccc", '', '', '']) 271487bc3f74SBram Moolenaar let a=getline(1) 271587bc3f74SBram Moolenaar norm! 2gg0 271687bc3f74SBram Moolenaar exe "norm! a\<c-r>=a\<cr>" 271787bc3f74SBram Moolenaar norm! 3gg0 271887bc3f74SBram Moolenaar exe "norm! a\<c-r>\<c-r>=a\<cr>" 271987bc3f74SBram Moolenaar norm! 4gg0 272087bc3f74SBram Moolenaar exe "norm! a\<c-r>\<c-o>=a\<cr>" 272187bc3f74SBram Moolenaar call assert_equal(['aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', ''], getline(1, '$')) 272287bc3f74SBram Moolenaar 272387bc3f74SBram Moolenaar " clean up 272487bc3f74SBram Moolenaar set sts=0 sw=8 ts=8 272531845093SBram Moolenaar bw! 27262931f2a5SBram Moolenaarendfunc 272787bc3f74SBram Moolenaar 2728f5f1e10dSBram Moolenaar" Test for Ctrl-D and Ctrl-U 27291bbb6194SBram Moolenaarfunc Test_normal42_halfpage() 273087bc3f74SBram Moolenaar call Setup_NewWindow() 273187bc3f74SBram Moolenaar call assert_equal(5, &scroll) 273287bc3f74SBram Moolenaar exe "norm! \<c-d>" 273387bc3f74SBram Moolenaar call assert_equal('6', getline('.')) 273487bc3f74SBram Moolenaar exe "norm! 2\<c-d>" 273587bc3f74SBram Moolenaar call assert_equal('8', getline('.')) 273687bc3f74SBram Moolenaar call assert_equal(2, &scroll) 273787bc3f74SBram Moolenaar set scroll=5 273887bc3f74SBram Moolenaar exe "norm! \<c-u>" 273987bc3f74SBram Moolenaar call assert_equal('3', getline('.')) 274087bc3f74SBram Moolenaar 1 274187bc3f74SBram Moolenaar set scrolloff=5 274287bc3f74SBram Moolenaar exe "norm! \<c-d>" 274387bc3f74SBram Moolenaar call assert_equal('10', getline('.')) 274487bc3f74SBram Moolenaar exe "norm! \<c-u>" 274587bc3f74SBram Moolenaar call assert_equal('5', getline('.')) 274687bc3f74SBram Moolenaar 1 274787bc3f74SBram Moolenaar set scrolloff=99 274887bc3f74SBram Moolenaar exe "norm! \<c-d>" 274987bc3f74SBram Moolenaar call assert_equal('10', getline('.')) 275087bc3f74SBram Moolenaar set scrolloff=0 275187bc3f74SBram Moolenaar 100 275287bc3f74SBram Moolenaar exe "norm! $\<c-u>" 275387bc3f74SBram Moolenaar call assert_equal('95', getline('.')) 275487bc3f74SBram Moolenaar call assert_equal([0, 95, 1, 0, 1], getcurpos()) 275587bc3f74SBram Moolenaar 100 275687bc3f74SBram Moolenaar set nostartofline 275787bc3f74SBram Moolenaar exe "norm! $\<c-u>" 275887bc3f74SBram Moolenaar call assert_equal('95', getline('.')) 275987bc3f74SBram Moolenaar call assert_equal([0, 95, 2, 0, 2147483647], getcurpos()) 276087bc3f74SBram Moolenaar " cleanup 276187bc3f74SBram Moolenaar set startofline 276287bc3f74SBram Moolenaar bw! 27632931f2a5SBram Moolenaarendfunc 276487bc3f74SBram Moolenaar 27651bbb6194SBram Moolenaarfunc Test_normal45_drop() 276629495952SBram Moolenaar if !has('dnd') 2767b48e96f6SBram Moolenaar " The ~ register does not exist 2768b48e96f6SBram Moolenaar call assert_beeps('norm! "~') 276929495952SBram Moolenaar return 277029495952SBram Moolenaar endif 277129495952SBram Moolenaar 277229495952SBram Moolenaar " basic test for drag-n-drop 277387bc3f74SBram Moolenaar " unfortunately, without a gui, we can't really test much here, 277487bc3f74SBram Moolenaar " so simply test that ~p fails (which uses the drop register) 277587bc3f74SBram Moolenaar new 2776e2e4075fSBram Moolenaar call assert_fails(':norm! "~p', 'E353:') 277787bc3f74SBram Moolenaar call assert_equal([], getreg('~', 1, 1)) 277887bc3f74SBram Moolenaar " the ~ register is read only 2779e2e4075fSBram Moolenaar call assert_fails(':let @~="1"', 'E354:') 278087bc3f74SBram Moolenaar bw! 27812931f2a5SBram Moolenaarendfunc 278287bc3f74SBram Moolenaar 27831bbb6194SBram Moolenaarfunc Test_normal46_ignore() 278487bc3f74SBram Moolenaar new 278587bc3f74SBram Moolenaar " How to test this? 278687bc3f74SBram Moolenaar " let's just for now test, that the buffer 278787bc3f74SBram Moolenaar " does not change 278887bc3f74SBram Moolenaar call feedkeys("\<c-s>", 't') 278987bc3f74SBram Moolenaar call assert_equal([''], getline(1,'$')) 279087bc3f74SBram Moolenaar 27912931f2a5SBram Moolenaar " no valid commands 27922931f2a5SBram Moolenaar exe "norm! \<char-0x100>" 27932931f2a5SBram Moolenaar call assert_equal([''], getline(1,'$')) 27942931f2a5SBram Moolenaar 27952931f2a5SBram Moolenaar exe "norm! ä" 27962931f2a5SBram Moolenaar call assert_equal([''], getline(1,'$')) 27972931f2a5SBram Moolenaar 279887bc3f74SBram Moolenaar " clean up 279987bc3f74SBram Moolenaar bw! 28002931f2a5SBram Moolenaarendfunc 2801c4a908e8SBram Moolenaar 28021bbb6194SBram Moolenaarfunc Test_normal47_visual_buf_wipe() 2803c4a908e8SBram Moolenaar " This was causing a crash or ml_get error. 2804c4a908e8SBram Moolenaar enew! 2805c4a908e8SBram Moolenaar call setline(1,'xxx') 2806c4a908e8SBram Moolenaar normal $ 2807c4a908e8SBram Moolenaar new 2808c4a908e8SBram Moolenaar call setline(1, range(1,2)) 2809c4a908e8SBram Moolenaar 2 2810c4a908e8SBram Moolenaar exe "norm \<C-V>$" 2811c4a908e8SBram Moolenaar bw! 2812c4a908e8SBram Moolenaar norm yp 2813c4a908e8SBram Moolenaar set nomodified 28142931f2a5SBram Moolenaarendfunc 28152931f2a5SBram Moolenaar 28161bbb6194SBram Moolenaarfunc Test_normal48_wincmd() 28172931f2a5SBram Moolenaar new 28182931f2a5SBram Moolenaar exe "norm! \<c-w>c" 28192931f2a5SBram Moolenaar call assert_equal(1, winnr('$')) 2820e2e4075fSBram Moolenaar call assert_fails(":norm! \<c-w>c", 'E444:') 28212931f2a5SBram Moolenaarendfunc 28222931f2a5SBram Moolenaar 28231bbb6194SBram Moolenaarfunc Test_normal49_counts() 28242931f2a5SBram Moolenaar new 28252931f2a5SBram Moolenaar call setline(1, 'one two three four five six seven eight nine ten') 28262931f2a5SBram Moolenaar 1 28272931f2a5SBram Moolenaar norm! 3d2w 28282931f2a5SBram Moolenaar call assert_equal('seven eight nine ten', getline(1)) 28292931f2a5SBram Moolenaar bw! 28302931f2a5SBram Moolenaarendfunc 28312931f2a5SBram Moolenaar 28321bbb6194SBram Moolenaarfunc Test_normal50_commandline() 2833004a6781SBram Moolenaar CheckFeature timers 2834004a6781SBram Moolenaar CheckFeature cmdline_hist 28352931f2a5SBram Moolenaar func! DoTimerWork(id) 28362931f2a5SBram Moolenaar call assert_equal('[Command Line]', bufname('')) 28372931f2a5SBram Moolenaar " should fail, with E11, but does fail with E23? 28382931f2a5SBram Moolenaar "call feedkeys("\<c-^>", 'tm') 28392931f2a5SBram Moolenaar 28402931f2a5SBram Moolenaar " should also fail with E11 2841e2e4075fSBram Moolenaar call assert_fails(":wincmd p", 'E11:') 28422931f2a5SBram Moolenaar " return from commandline window 28432931f2a5SBram Moolenaar call feedkeys("\<cr>") 28442931f2a5SBram Moolenaar endfunc 28452931f2a5SBram Moolenaar 28462931f2a5SBram Moolenaar let oldlang=v:lang 28472931f2a5SBram Moolenaar lang C 28482931f2a5SBram Moolenaar set updatetime=20 28492931f2a5SBram Moolenaar call timer_start(100, 'DoTimerWork') 28502931f2a5SBram Moolenaar try 28512931f2a5SBram Moolenaar " throws E23, for whatever reason... 28522931f2a5SBram Moolenaar call feedkeys('q:', 'x!') 28532931f2a5SBram Moolenaar catch /E23/ 28542931f2a5SBram Moolenaar " no-op 28552931f2a5SBram Moolenaar endtry 28562931f2a5SBram Moolenaar " clean up 28572931f2a5SBram Moolenaar set updatetime=4000 28582931f2a5SBram Moolenaar exe "lang" oldlang 28592931f2a5SBram Moolenaar bw! 28602931f2a5SBram Moolenaarendfunc 28612931f2a5SBram Moolenaar 28621bbb6194SBram Moolenaarfunc Test_normal51_FileChangedRO() 2863004a6781SBram Moolenaar CheckFeature autocmd 2864e5f2a075SBram Moolenaar " Don't sleep after the warning message. 2865e5f2a075SBram Moolenaar call test_settime(1) 28662931f2a5SBram Moolenaar call writefile(['foo'], 'Xreadonly.log') 28672931f2a5SBram Moolenaar new Xreadonly.log 28682931f2a5SBram Moolenaar setl ro 28692931f2a5SBram Moolenaar au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix') 2870e2e4075fSBram Moolenaar call assert_fails(":norm! Af", 'E788:') 28712931f2a5SBram Moolenaar call assert_equal(['foo'], getline(1,'$')) 28722931f2a5SBram Moolenaar call assert_equal('Xreadonly.log', bufname('')) 28732931f2a5SBram Moolenaar 28742931f2a5SBram Moolenaar " cleanup 2875e5f2a075SBram Moolenaar call test_settime(0) 28762931f2a5SBram Moolenaar bw! 28772931f2a5SBram Moolenaar call delete("Xreadonly.log") 28782931f2a5SBram Moolenaarendfunc 28792931f2a5SBram Moolenaar 28801bbb6194SBram Moolenaarfunc Test_normal52_rl() 2881004a6781SBram Moolenaar CheckFeature rightleft 28822931f2a5SBram Moolenaar new 28832931f2a5SBram Moolenaar call setline(1, 'abcde fghij klmnopq') 28842931f2a5SBram Moolenaar norm! 1gg$ 28852931f2a5SBram Moolenaar set rl 28862931f2a5SBram Moolenaar call assert_equal(19, col('.')) 28872931f2a5SBram Moolenaar call feedkeys('l', 'tx') 28882931f2a5SBram Moolenaar call assert_equal(18, col('.')) 28892931f2a5SBram Moolenaar call feedkeys('h', 'tx') 28902931f2a5SBram Moolenaar call assert_equal(19, col('.')) 28912931f2a5SBram Moolenaar call feedkeys("\<right>", 'tx') 28922931f2a5SBram Moolenaar call assert_equal(18, col('.')) 28931671f448SBram Moolenaar call feedkeys("\<left>", 'tx') 28941671f448SBram Moolenaar call assert_equal(19, col('.')) 28952931f2a5SBram Moolenaar call feedkeys("\<s-right>", 'tx') 28962931f2a5SBram Moolenaar call assert_equal(13, col('.')) 28972931f2a5SBram Moolenaar call feedkeys("\<c-right>", 'tx') 28982931f2a5SBram Moolenaar call assert_equal(7, col('.')) 28992931f2a5SBram Moolenaar call feedkeys("\<c-left>", 'tx') 29002931f2a5SBram Moolenaar call assert_equal(13, col('.')) 29012931f2a5SBram Moolenaar call feedkeys("\<s-left>", 'tx') 29022931f2a5SBram Moolenaar call assert_equal(19, col('.')) 29032931f2a5SBram Moolenaar call feedkeys("<<", 'tx') 29042931f2a5SBram Moolenaar call assert_equal(' abcde fghij klmnopq',getline(1)) 29052931f2a5SBram Moolenaar call feedkeys(">>", 'tx') 29062931f2a5SBram Moolenaar call assert_equal('abcde fghij klmnopq',getline(1)) 29072931f2a5SBram Moolenaar 29082931f2a5SBram Moolenaar " cleanup 29092931f2a5SBram Moolenaar set norl 29102931f2a5SBram Moolenaar bw! 29112931f2a5SBram Moolenaarendfunc 29122931f2a5SBram Moolenaar 2913b1e04fcaSBram Moolenaarfunc Test_normal54_Ctrl_bsl() 29142931f2a5SBram Moolenaar new 29152931f2a5SBram Moolenaar call setline(1, 'abcdefghijklmn') 29162931f2a5SBram Moolenaar exe "norm! df\<c-\>\<c-n>" 29172931f2a5SBram Moolenaar call assert_equal(['abcdefghijklmn'], getline(1,'$')) 29182931f2a5SBram Moolenaar exe "norm! df\<c-\>\<c-g>" 29192931f2a5SBram Moolenaar call assert_equal(['abcdefghijklmn'], getline(1,'$')) 29202931f2a5SBram Moolenaar exe "norm! df\<c-\>m" 29212931f2a5SBram Moolenaar call assert_equal(['abcdefghijklmn'], getline(1,'$')) 292230276f2bSBram Moolenaar 29232931f2a5SBram Moolenaar call setline(2, 'abcdefghijklmnāf') 29242931f2a5SBram Moolenaar norm! 2gg0 29252931f2a5SBram Moolenaar exe "norm! df\<Char-0x101>" 29262931f2a5SBram Moolenaar call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$')) 29272931f2a5SBram Moolenaar norm! 1gg0 29282931f2a5SBram Moolenaar exe "norm! df\<esc>" 29292931f2a5SBram Moolenaar call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$')) 29302931f2a5SBram Moolenaar 29312931f2a5SBram Moolenaar " clean up 29322931f2a5SBram Moolenaar bw! 29332931f2a5SBram Moolenaarendfunc 2934b1e04fcaSBram Moolenaar 2935b1e04fcaSBram Moolenaarfunc Test_normal_large_count() 2936b1e04fcaSBram Moolenaar " This may fail with 32bit long, how do we detect that? 2937b1e04fcaSBram Moolenaar new 2938b1e04fcaSBram Moolenaar normal o 2939b1e04fcaSBram Moolenaar normal 6666666666dL 2940b1e04fcaSBram Moolenaar bwipe! 2941b1e04fcaSBram Moolenaarendfunc 2942bf3d5807SBram Moolenaar 2943bf3d5807SBram Moolenaarfunc Test_delete_until_paragraph() 2944bf3d5807SBram Moolenaar new 2945bf3d5807SBram Moolenaar normal grádv} 2946bf3d5807SBram Moolenaar call assert_equal('á', getline(1)) 2947bf3d5807SBram Moolenaar normal grád} 2948bf3d5807SBram Moolenaar call assert_equal('', getline(1)) 2949bf3d5807SBram Moolenaar bwipe! 2950bf3d5807SBram Moolenaarendfunc 2951fb094e14SBram Moolenaar 2952fb094e14SBram Moolenaar" Test for the gr (virtual replace) command 2953fb094e14SBram Moolenaar" Test for the bug fixed by 7.4.387 2954fb094e14SBram Moolenaarfunc Test_gr_command() 2955fb094e14SBram Moolenaar enew! 2956fb094e14SBram Moolenaar let save_cpo = &cpo 2957fb094e14SBram Moolenaar call append(0, ['First line', 'Second line', 'Third line']) 2958fb094e14SBram Moolenaar exe "normal i\<C-G>u" 2959fb094e14SBram Moolenaar call cursor(2, 1) 2960fb094e14SBram Moolenaar set cpo-=X 2961fb094e14SBram Moolenaar normal 4gro 2962fb094e14SBram Moolenaar call assert_equal('oooond line', getline(2)) 2963fb094e14SBram Moolenaar undo 2964fb094e14SBram Moolenaar set cpo+=X 2965fb094e14SBram Moolenaar normal 4gro 2966fb094e14SBram Moolenaar call assert_equal('ooooecond line', getline(2)) 2967fb094e14SBram Moolenaar let &cpo = save_cpo 2968f5f1e10dSBram Moolenaar normal! ggvegrx 2969f5f1e10dSBram Moolenaar call assert_equal('xxxxx line', getline(1)) 2970f5f1e10dSBram Moolenaar exe "normal! gggr\<C-V>122" 2971f5f1e10dSBram Moolenaar call assert_equal('zxxxx line', getline(1)) 2972f5f1e10dSBram Moolenaar set virtualedit=all 2973f5f1e10dSBram Moolenaar normal! 15|grl 2974f5f1e10dSBram Moolenaar call assert_equal('zxxxx line l', getline(1)) 2975f5f1e10dSBram Moolenaar set virtualedit& 2976f5f1e10dSBram Moolenaar set nomodifiable 2977f5f1e10dSBram Moolenaar call assert_fails('normal! grx', 'E21:') 2978f5f1e10dSBram Moolenaar call assert_fails('normal! gRx', 'E21:') 2979f5f1e10dSBram Moolenaar set modifiable& 2980fb094e14SBram Moolenaar enew! 2981fb094e14SBram Moolenaarendfunc 2982fb094e14SBram Moolenaar 2983fb094e14SBram Moolenaar" When splitting a window the changelist position is wrong. 2984fb094e14SBram Moolenaar" Test the changelist position after splitting a window. 2985fb094e14SBram Moolenaar" Test for the bug fixed by 7.4.386 2986fb094e14SBram Moolenaarfunc Test_changelist() 2987fb094e14SBram Moolenaar let save_ul = &ul 2988fb094e14SBram Moolenaar enew! 2989fb094e14SBram Moolenaar call append('$', ['1', '2']) 2990fb094e14SBram Moolenaar exe "normal i\<C-G>u" 2991fb094e14SBram Moolenaar exe "normal Gkylpa\<C-G>u" 2992fb094e14SBram Moolenaar set ul=100 2993fb094e14SBram Moolenaar exe "normal Gylpa\<C-G>u" 2994fb094e14SBram Moolenaar set ul=100 2995fb094e14SBram Moolenaar normal gg 2996fb094e14SBram Moolenaar vsplit 2997fb094e14SBram Moolenaar normal g; 2998fb094e14SBram Moolenaar call assert_equal([3, 2], [line('.'), col('.')]) 2999fb094e14SBram Moolenaar normal g; 3000fb094e14SBram Moolenaar call assert_equal([2, 2], [line('.'), col('.')]) 3001fb094e14SBram Moolenaar call assert_fails('normal g;', 'E662:') 30021671f448SBram Moolenaar new 30031671f448SBram Moolenaar call assert_fails('normal g;', 'E664:') 3004fb094e14SBram Moolenaar %bwipe! 3005fb094e14SBram Moolenaar let &ul = save_ul 3006fb094e14SBram Moolenaarendfunc 30071bbb6194SBram Moolenaar 30081bbb6194SBram Moolenaarfunc Test_nv_hat_count() 30091bbb6194SBram Moolenaar %bwipeout! 30101bbb6194SBram Moolenaar let l:nr = bufnr('%') + 1 3011e2e4075fSBram Moolenaar call assert_fails(':execute "normal! ' . l:nr . '\<C-^>"', 'E92:') 30121bbb6194SBram Moolenaar 30131bbb6194SBram Moolenaar edit Xfoo 30141bbb6194SBram Moolenaar let l:foo_nr = bufnr('Xfoo') 30151bbb6194SBram Moolenaar 30161bbb6194SBram Moolenaar edit Xbar 30171bbb6194SBram Moolenaar let l:bar_nr = bufnr('Xbar') 30181bbb6194SBram Moolenaar 30191bbb6194SBram Moolenaar " Make sure we are not just using the alternate file. 30201bbb6194SBram Moolenaar edit Xbaz 30211bbb6194SBram Moolenaar 30221bbb6194SBram Moolenaar call feedkeys(l:foo_nr . "\<C-^>", 'tx') 30231bbb6194SBram Moolenaar call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t')) 30241bbb6194SBram Moolenaar 30251bbb6194SBram Moolenaar call feedkeys(l:bar_nr . "\<C-^>", 'tx') 30261bbb6194SBram Moolenaar call assert_equal('Xbar', fnamemodify(bufname('%'), ':t')) 30271bbb6194SBram Moolenaar 30281bbb6194SBram Moolenaar %bwipeout! 30291bbb6194SBram Moolenaarendfunc 3030a84a3dd6SBram Moolenaar 3031a84a3dd6SBram Moolenaarfunc Test_message_when_using_ctrl_c() 3032553e5a5cSBram Moolenaar " Make sure no buffers are changed. 3033553e5a5cSBram Moolenaar %bwipe! 3034553e5a5cSBram Moolenaar 3035a84a3dd6SBram Moolenaar exe "normal \<C-C>" 3036a84a3dd6SBram Moolenaar call assert_match("Type :qa and press <Enter> to exit Vim", Screenline(&lines)) 3037553e5a5cSBram Moolenaar 3038a84a3dd6SBram Moolenaar new 3039a84a3dd6SBram Moolenaar cal setline(1, 'hi!') 3040a84a3dd6SBram Moolenaar exe "normal \<C-C>" 3041a84a3dd6SBram Moolenaar call assert_match("Type :qa! and press <Enter> to abandon all changes and exit Vim", Screenline(&lines)) 3042553e5a5cSBram Moolenaar 3043a84a3dd6SBram Moolenaar bwipe! 3044a84a3dd6SBram Moolenaarendfunc 3045c6b37db1SBram Moolenaar 3046c6b37db1SBram Moolenaar" Test for '[m', ']m', '[M' and ']M' 3047c6b37db1SBram Moolenaar" Jumping to beginning and end of methods in Java-like languages 3048c6b37db1SBram Moolenaarfunc Test_java_motion() 3049c6b37db1SBram Moolenaar new 30501671f448SBram Moolenaar call assert_beeps('normal! [m') 30511671f448SBram Moolenaar call assert_beeps('normal! ]m') 30521671f448SBram Moolenaar call assert_beeps('normal! [M') 30531671f448SBram Moolenaar call assert_beeps('normal! ]M') 30548a9bc95eSBram Moolenaar let lines =<< trim [CODE] 3055c6b37db1SBram Moolenaar Piece of Java 3056c6b37db1SBram Moolenaar { 3057c6b37db1SBram Moolenaar tt m1 { 3058c6b37db1SBram Moolenaar t1; 3059c6b37db1SBram Moolenaar } e1 3060c6b37db1SBram Moolenaar 3061c6b37db1SBram Moolenaar tt m2 { 3062c6b37db1SBram Moolenaar t2; 3063c6b37db1SBram Moolenaar } e2 3064c6b37db1SBram Moolenaar 3065c6b37db1SBram Moolenaar tt m3 { 3066c6b37db1SBram Moolenaar if (x) 3067c6b37db1SBram Moolenaar { 3068c6b37db1SBram Moolenaar t3; 3069c6b37db1SBram Moolenaar } 3070c6b37db1SBram Moolenaar } e3 3071c6b37db1SBram Moolenaar } 30728a9bc95eSBram Moolenaar [CODE] 30738a9bc95eSBram Moolenaar call setline(1, lines) 3074c6b37db1SBram Moolenaar 3075c6b37db1SBram Moolenaar normal gg 3076c6b37db1SBram Moolenaar 3077c6b37db1SBram Moolenaar normal 2]maA 3078c6b37db1SBram Moolenaar call assert_equal("\ttt m1 {A", getline('.')) 3079c6b37db1SBram Moolenaar call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')]) 3080c6b37db1SBram Moolenaar 3081c6b37db1SBram Moolenaar normal j]maB 3082c6b37db1SBram Moolenaar call assert_equal("\ttt m2 {B", getline('.')) 3083c6b37db1SBram Moolenaar call assert_equal([7, 9, 16], [line('.'), col('.'), virtcol('.')]) 3084c6b37db1SBram Moolenaar 3085c6b37db1SBram Moolenaar normal ]maC 3086c6b37db1SBram Moolenaar call assert_equal("\ttt m3 {C", getline('.')) 3087c6b37db1SBram Moolenaar call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')]) 3088c6b37db1SBram Moolenaar 3089c6b37db1SBram Moolenaar normal [maD 3090c6b37db1SBram Moolenaar call assert_equal("\ttt m3 {DC", getline('.')) 3091c6b37db1SBram Moolenaar call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')]) 3092c6b37db1SBram Moolenaar 3093c6b37db1SBram Moolenaar normal k2[maE 3094c6b37db1SBram Moolenaar call assert_equal("\ttt m1 {EA", getline('.')) 3095c6b37db1SBram Moolenaar call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')]) 3096c6b37db1SBram Moolenaar 3097c6b37db1SBram Moolenaar normal 3[maF 3098c6b37db1SBram Moolenaar call assert_equal("{F", getline('.')) 3099c6b37db1SBram Moolenaar call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')]) 3100c6b37db1SBram Moolenaar 3101c6b37db1SBram Moolenaar normal ]MaG 3102c6b37db1SBram Moolenaar call assert_equal("\t}G e1", getline('.')) 3103c6b37db1SBram Moolenaar call assert_equal([5, 3, 10], [line('.'), col('.'), virtcol('.')]) 3104c6b37db1SBram Moolenaar 3105c6b37db1SBram Moolenaar normal j2]MaH 3106c6b37db1SBram Moolenaar call assert_equal("\t}H e3", getline('.')) 3107c6b37db1SBram Moolenaar call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')]) 3108c6b37db1SBram Moolenaar 3109c6b37db1SBram Moolenaar normal ]M]M 3110c6b37db1SBram Moolenaar normal aI 3111c6b37db1SBram Moolenaar call assert_equal("}I", getline('.')) 3112c6b37db1SBram Moolenaar call assert_equal([17, 2, 2], [line('.'), col('.'), virtcol('.')]) 3113c6b37db1SBram Moolenaar 3114c6b37db1SBram Moolenaar normal 2[MaJ 3115c6b37db1SBram Moolenaar call assert_equal("\t}JH e3", getline('.')) 3116c6b37db1SBram Moolenaar call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')]) 3117c6b37db1SBram Moolenaar 3118c6b37db1SBram Moolenaar normal k[MaK 3119c6b37db1SBram Moolenaar call assert_equal("\t}K e2", getline('.')) 3120c6b37db1SBram Moolenaar call assert_equal([9, 3, 10], [line('.'), col('.'), virtcol('.')]) 3121c6b37db1SBram Moolenaar 3122c6b37db1SBram Moolenaar normal 3[MaL 3123c6b37db1SBram Moolenaar call assert_equal("{LF", getline('.')) 3124c6b37db1SBram Moolenaar call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')]) 3125c6b37db1SBram Moolenaar 31268a9bc95eSBram Moolenaar call cursor(2, 1) 31278a9bc95eSBram Moolenaar call assert_beeps('norm! 5]m') 31288a9bc95eSBram Moolenaar 31298a9bc95eSBram Moolenaar " jumping to a method in a fold should open the fold 31308a9bc95eSBram Moolenaar 6,10fold 31318a9bc95eSBram Moolenaar call feedkeys("gg3]m", 'xt') 31328a9bc95eSBram Moolenaar call assert_equal([7, 8, 15], [line('.'), col('.'), virtcol('.')]) 31338a9bc95eSBram Moolenaar call assert_equal(-1, foldclosedend(7)) 31348a9bc95eSBram Moolenaar 3135c6b37db1SBram Moolenaar close! 3136c6b37db1SBram Moolenaarendfunc 3137d5c82345SBram Moolenaar 3138d5c82345SBram Moolenaar" Tests for g cmds 3139004a6781SBram Moolenaarfunc Test_normal_gdollar_cmd() 3140004a6781SBram Moolenaar CheckFeature jumplist 3141d5c82345SBram Moolenaar call Setup_NewWindow() 3142d5c82345SBram Moolenaar " Make long lines that will wrap 3143d5c82345SBram Moolenaar %s/$/\=repeat(' foobar', 10)/ 3144d5c82345SBram Moolenaar 20vsp 3145d5c82345SBram Moolenaar set wrap 3146d5c82345SBram Moolenaar " Test for g$ with count 3147d5c82345SBram Moolenaar norm! gg 3148d5c82345SBram Moolenaar norm! 0vg$y 3149d5c82345SBram Moolenaar call assert_equal(20, col("'>")) 3150d5c82345SBram Moolenaar call assert_equal('1 foobar foobar foob', getreg(0)) 3151d5c82345SBram Moolenaar norm! gg 3152d5c82345SBram Moolenaar norm! 0v4g$y 3153d5c82345SBram Moolenaar call assert_equal(72, col("'>")) 3154d5c82345SBram Moolenaar call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.."\n", getreg(0)) 3155d5c82345SBram Moolenaar norm! gg 3156d5c82345SBram Moolenaar norm! 0v6g$y 3157d5c82345SBram Moolenaar call assert_equal(40, col("'>")) 3158d5c82345SBram Moolenaar call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 3159d5c82345SBram Moolenaar \ '2 foobar foobar foobar foobar foobar foo', getreg(0)) 3160d5c82345SBram Moolenaar set nowrap 3161d5c82345SBram Moolenaar " clean up 3162d5c82345SBram Moolenaar norm! gg 3163d5c82345SBram Moolenaar norm! 0vg$y 3164d5c82345SBram Moolenaar call assert_equal(20, col("'>")) 3165d5c82345SBram Moolenaar call assert_equal('1 foobar foobar foob', getreg(0)) 3166d5c82345SBram Moolenaar norm! gg 3167d5c82345SBram Moolenaar norm! 0v4g$y 3168d5c82345SBram Moolenaar call assert_equal(20, col("'>")) 3169d5c82345SBram Moolenaar call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 3170d5c82345SBram Moolenaar \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 3171d5c82345SBram Moolenaar \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 3172d5c82345SBram Moolenaar \ '4 foobar foobar foob', getreg(0)) 3173d5c82345SBram Moolenaar norm! gg 3174d5c82345SBram Moolenaar norm! 0v6g$y 3175d5c82345SBram Moolenaar call assert_equal(20, col("'>")) 3176d5c82345SBram Moolenaar call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 3177d5c82345SBram Moolenaar \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 3178d5c82345SBram Moolenaar \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 3179d5c82345SBram Moolenaar \ '4 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 3180d5c82345SBram Moolenaar \ '5 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n".. 3181d5c82345SBram Moolenaar \ '6 foobar foobar foob', getreg(0)) 3182d5c82345SBram Moolenaar " Move to last line, also down movement is not possible, should still move 3183d5c82345SBram Moolenaar " the cursor to the last visible char 3184d5c82345SBram Moolenaar norm! G 3185d5c82345SBram Moolenaar norm! 0v6g$y 3186d5c82345SBram Moolenaar call assert_equal(20, col("'>")) 3187d5c82345SBram Moolenaar call assert_equal('100 foobar foobar fo', getreg(0)) 3188d5c82345SBram Moolenaar bw! 3189d5c82345SBram Moolenaarendfunc 319003ac52fcSBram Moolenaar 3191f5f1e10dSBram Moolenaarfunc Test_normal_gk_gj() 319203ac52fcSBram Moolenaar " needs 80 column new window 319303ac52fcSBram Moolenaar new 319403ac52fcSBram Moolenaar vert 80new 3195f5f1e10dSBram Moolenaar call assert_beeps('normal gk') 319603ac52fcSBram Moolenaar put =[repeat('x',90)..' {{{1', 'x {{{1'] 319703ac52fcSBram Moolenaar norm! gk 319803ac52fcSBram Moolenaar " In a 80 column wide terminal the window will be only 78 char 319903ac52fcSBram Moolenaar " (because Vim will leave space for the other window), 320003ac52fcSBram Moolenaar " but if the terminal is larger, it will be 80 chars, so verify the 320103ac52fcSBram Moolenaar " cursor column correctly. 320203ac52fcSBram Moolenaar call assert_equal(winwidth(0)+1, col('.')) 320303ac52fcSBram Moolenaar call assert_equal(winwidth(0)+1, virtcol('.')) 320403ac52fcSBram Moolenaar norm! j 320503ac52fcSBram Moolenaar call assert_equal(6, col('.')) 320603ac52fcSBram Moolenaar call assert_equal(6, virtcol('.')) 320703ac52fcSBram Moolenaar norm! gk 320803ac52fcSBram Moolenaar call assert_equal(95, col('.')) 320903ac52fcSBram Moolenaar call assert_equal(95, virtcol('.')) 3210f5f1e10dSBram Moolenaar %bw! 3211ceba3dd5SBram Moolenaar 3212ceba3dd5SBram Moolenaar " needs 80 column new window 3213ceba3dd5SBram Moolenaar new 3214ceba3dd5SBram Moolenaar vert 80new 3215f5f1e10dSBram Moolenaar call assert_beeps('normal gj') 3216ceba3dd5SBram Moolenaar set number 3217ceba3dd5SBram Moolenaar set numberwidth=10 3218ceba3dd5SBram Moolenaar set cpoptions+=n 3219ceba3dd5SBram Moolenaar put =[repeat('0',90), repeat('1',90)] 3220ceba3dd5SBram Moolenaar norm! 075l 3221ceba3dd5SBram Moolenaar call assert_equal(76, col('.')) 3222ceba3dd5SBram Moolenaar norm! gk 3223ceba3dd5SBram Moolenaar call assert_equal(1, col('.')) 3224ceba3dd5SBram Moolenaar norm! gk 3225ceba3dd5SBram Moolenaar call assert_equal(76, col('.')) 3226ceba3dd5SBram Moolenaar norm! gk 3227ceba3dd5SBram Moolenaar call assert_equal(1, col('.')) 3228ceba3dd5SBram Moolenaar norm! gj 3229ceba3dd5SBram Moolenaar call assert_equal(76, col('.')) 3230ceba3dd5SBram Moolenaar norm! gj 3231ceba3dd5SBram Moolenaar call assert_equal(1, col('.')) 3232ceba3dd5SBram Moolenaar norm! gj 3233ceba3dd5SBram Moolenaar call assert_equal(76, col('.')) 3234f5f1e10dSBram Moolenaar " When 'nowrap' is set, gk and gj behave like k and j 3235f5f1e10dSBram Moolenaar set nowrap 3236f5f1e10dSBram Moolenaar normal! gk 3237f5f1e10dSBram Moolenaar call assert_equal([2, 76], [line('.'), col('.')]) 3238f5f1e10dSBram Moolenaar normal! gj 3239f5f1e10dSBram Moolenaar call assert_equal([3, 76], [line('.'), col('.')]) 3240f5f1e10dSBram Moolenaar %bw! 3241f5f1e10dSBram Moolenaar set cpoptions& number& numberwidth& wrap& 324203ac52fcSBram Moolenaarendfunc 3243f0cee197SBram Moolenaar 3244818fc9adSBram Moolenaar" Test for using : to run a multi-line Ex command in operator pending mode 3245818fc9adSBram Moolenaarfunc Test_normal_yank_with_excmd() 3246818fc9adSBram Moolenaar new 3247818fc9adSBram Moolenaar call setline(1, ['foo', 'bar', 'baz']) 3248818fc9adSBram Moolenaar let @a = '' 3249818fc9adSBram Moolenaar call feedkeys("\"ay:if v:true\<CR>normal l\<CR>endif\<CR>", 'xt') 3250818fc9adSBram Moolenaar call assert_equal('f', @a) 3251818fc9adSBram Moolenaar close! 3252818fc9adSBram Moolenaarendfunc 3253f5f1e10dSBram Moolenaar 3254f5f1e10dSBram Moolenaar" Test for supplying a count to a normal-mode command across a cursorhold call 3255f5f1e10dSBram Moolenaarfunc Test_normal_cursorhold_with_count() 3256f5f1e10dSBram Moolenaar func s:cHold() 3257f5f1e10dSBram Moolenaar let g:cHold_Called += 1 3258f5f1e10dSBram Moolenaar endfunc 3259f5f1e10dSBram Moolenaar new 3260f5f1e10dSBram Moolenaar augroup normalcHoldTest 3261f5f1e10dSBram Moolenaar au! 3262f5f1e10dSBram Moolenaar au CursorHold <buffer> call s:cHold() 3263f5f1e10dSBram Moolenaar augroup END 3264f5f1e10dSBram Moolenaar let g:cHold_Called = 0 3265f5f1e10dSBram Moolenaar call feedkeys("3\<CursorHold>2ix", 'xt') 3266f5f1e10dSBram Moolenaar call assert_equal(1, g:cHold_Called) 3267f5f1e10dSBram Moolenaar call assert_equal(repeat('x', 32), getline(1)) 3268f5f1e10dSBram Moolenaar augroup normalcHoldTest 3269f5f1e10dSBram Moolenaar au! 3270f5f1e10dSBram Moolenaar augroup END 3271f5f1e10dSBram Moolenaar au! normalcHoldTest 3272f5f1e10dSBram Moolenaar close! 3273f5f1e10dSBram Moolenaar delfunc s:cHold 3274f5f1e10dSBram Moolenaarendfunc 3275f5f1e10dSBram Moolenaar 3276f5f1e10dSBram Moolenaar" Test for using a count and a command with CTRL-W 3277f5f1e10dSBram Moolenaarfunc Test_wincmd_with_count() 3278f5f1e10dSBram Moolenaar call feedkeys("\<C-W>12n", 'xt') 3279f5f1e10dSBram Moolenaar call assert_equal(12, winheight(0)) 3280f5f1e10dSBram Moolenaarendfunc 3281f5f1e10dSBram Moolenaar 3282f5f1e10dSBram Moolenaar" Test for 'b', 'B' 'ge' and 'gE' commands 32831671f448SBram Moolenaarfunc Test_horiz_motion() 32841671f448SBram Moolenaar new 3285f5f1e10dSBram Moolenaar normal! gg 3286f5f1e10dSBram Moolenaar call assert_beeps('normal! b') 3287f5f1e10dSBram Moolenaar call assert_beeps('normal! B') 3288f5f1e10dSBram Moolenaar call assert_beeps('normal! gE') 3289f5f1e10dSBram Moolenaar call assert_beeps('normal! ge') 32901671f448SBram Moolenaar " <S-Backspace> moves one word left and <C-Backspace> moves one WORD left 32911671f448SBram Moolenaar call setline(1, 'one ,two ,three') 32921671f448SBram Moolenaar exe "normal! $\<S-BS>" 32931671f448SBram Moolenaar call assert_equal(11, col('.')) 32941671f448SBram Moolenaar exe "normal! $\<C-BS>" 32951671f448SBram Moolenaar call assert_equal(10, col('.')) 32961671f448SBram Moolenaar close! 32971671f448SBram Moolenaarendfunc 32981671f448SBram Moolenaar 32991671f448SBram Moolenaar" Test for using a : command in operator pending mode 33001671f448SBram Moolenaarfunc Test_normal_colon_op() 33011671f448SBram Moolenaar new 33021671f448SBram Moolenaar call setline(1, ['one', 'two']) 33031671f448SBram Moolenaar call assert_beeps("normal! Gc:d\<CR>") 33041671f448SBram Moolenaar close! 3305f5f1e10dSBram Moolenaarendfunc 3306f5f1e10dSBram Moolenaar 3307004a6781SBram Moolenaar" Test for d and D commands 3308004a6781SBram Moolenaarfunc Test_normal_delete_cmd() 3309004a6781SBram Moolenaar new 3310004a6781SBram Moolenaar " D in an empty line 3311004a6781SBram Moolenaar call setline(1, '') 3312004a6781SBram Moolenaar normal D 3313004a6781SBram Moolenaar call assert_equal('', getline(1)) 3314004a6781SBram Moolenaar " D in an empty line in virtualedit mode 3315004a6781SBram Moolenaar set virtualedit=all 3316004a6781SBram Moolenaar normal D 3317004a6781SBram Moolenaar call assert_equal('', getline(1)) 3318004a6781SBram Moolenaar set virtualedit& 3319004a6781SBram Moolenaar " delete to a readonly register 3320004a6781SBram Moolenaar call setline(1, ['abcd']) 3321004a6781SBram Moolenaar call assert_beeps('normal ":d2l') 33226fd367a9SBram Moolenaar 33236fd367a9SBram Moolenaar " D and d with 'nomodifiable' 33246fd367a9SBram Moolenaar call setline(1, ['abcd']) 33256fd367a9SBram Moolenaar setlocal nomodifiable 33266fd367a9SBram Moolenaar call assert_fails('normal D', 'E21:') 33276fd367a9SBram Moolenaar call assert_fails('normal d$', 'E21:') 33286fd367a9SBram Moolenaar 3329004a6781SBram Moolenaar close! 3330004a6781SBram Moolenaarendfunc 3331004a6781SBram Moolenaar 33328a9bc95eSBram Moolenaar" Test for deleting or changing characters across lines with 'whichwrap' 33338a9bc95eSBram Moolenaar" containing 's'. Should count <EOL> as one character. 33348a9bc95eSBram Moolenaarfunc Test_normal_op_across_lines() 33358a9bc95eSBram Moolenaar new 33368a9bc95eSBram Moolenaar set whichwrap& 33378a9bc95eSBram Moolenaar call setline(1, ['one two', 'three four']) 33388a9bc95eSBram Moolenaar exe "norm! $3d\<Space>" 33398a9bc95eSBram Moolenaar call assert_equal(['one twhree four'], getline(1, '$')) 33408a9bc95eSBram Moolenaar 33418a9bc95eSBram Moolenaar call setline(1, ['one two', 'three four']) 33428a9bc95eSBram Moolenaar exe "norm! $3c\<Space>x" 33438a9bc95eSBram Moolenaar call assert_equal(['one twxhree four'], getline(1, '$')) 33448a9bc95eSBram Moolenaar 33458a9bc95eSBram Moolenaar set whichwrap+=l 33468a9bc95eSBram Moolenaar call setline(1, ['one two', 'three four']) 33478a9bc95eSBram Moolenaar exe "norm! $3x" 33488a9bc95eSBram Moolenaar call assert_equal(['one twhree four'], getline(1, '$')) 33498a9bc95eSBram Moolenaar close! 33508a9bc95eSBram Moolenaar set whichwrap& 33518a9bc95eSBram Moolenaarendfunc 33528a9bc95eSBram Moolenaar 3353224a5f17SBram Moolenaar" Test for 'w' and 'b' commands 3354224a5f17SBram Moolenaarfunc Test_normal_word_move() 3355224a5f17SBram Moolenaar new 3356224a5f17SBram Moolenaar call setline(1, ['foo bar a', '', 'foo bar b']) 3357224a5f17SBram Moolenaar " copy a single character word at the end of a line 3358224a5f17SBram Moolenaar normal 1G$yw 3359224a5f17SBram Moolenaar call assert_equal('a', @") 3360224a5f17SBram Moolenaar " copy a single character word at the end of a file 3361224a5f17SBram Moolenaar normal G$yw 3362224a5f17SBram Moolenaar call assert_equal('b', @") 3363224a5f17SBram Moolenaar " check for a word movement handling an empty line properly 3364224a5f17SBram Moolenaar normal 1G$vwy 3365224a5f17SBram Moolenaar call assert_equal("a\n\n", @") 3366224a5f17SBram Moolenaar 3367224a5f17SBram Moolenaar " copy using 'b' command 3368224a5f17SBram Moolenaar %d 3369224a5f17SBram Moolenaar " non-empty blank line at the start of file 3370224a5f17SBram Moolenaar call setline(1, [' ', 'foo bar']) 3371224a5f17SBram Moolenaar normal 2Gyb 3372224a5f17SBram Moolenaar call assert_equal(" \n", @") 3373224a5f17SBram Moolenaar " try to copy backwards from the start of the file 3374224a5f17SBram Moolenaar call setline(1, ['one two', 'foo bar']) 3375224a5f17SBram Moolenaar call assert_beeps('normal ggyb') 3376224a5f17SBram Moolenaar " 'b' command should stop at an empty line 3377224a5f17SBram Moolenaar call setline(1, ['one two', '', 'foo bar']) 3378224a5f17SBram Moolenaar normal 3Gyb 3379224a5f17SBram Moolenaar call assert_equal("\n", @") 3380224a5f17SBram Moolenaar normal 3Gy2b 3381224a5f17SBram Moolenaar call assert_equal("two\n", @") 3382224a5f17SBram Moolenaar " 'b' command should not stop at a non-empty blank line 3383224a5f17SBram Moolenaar call setline(1, ['one two', ' ', 'foo bar']) 3384224a5f17SBram Moolenaar normal 3Gyb 3385224a5f17SBram Moolenaar call assert_equal("two\n ", @") 3386224a5f17SBram Moolenaar 3387224a5f17SBram Moolenaar close! 3388224a5f17SBram Moolenaarendfunc 3389224a5f17SBram Moolenaar 3390bdd2c290SBram Moolenaar" Test for 'scrolloff' with a long line that doesn't fit in the screen 3391bdd2c290SBram Moolenaarfunc Test_normal_scroloff() 3392bdd2c290SBram Moolenaar 10new 3393bdd2c290SBram Moolenaar 80vnew 3394bdd2c290SBram Moolenaar call setline(1, repeat('a', 1000)) 3395bdd2c290SBram Moolenaar set scrolloff=10 3396bdd2c290SBram Moolenaar normal gg10gj 3397bdd2c290SBram Moolenaar call assert_equal(8, winline()) 3398bdd2c290SBram Moolenaar normal 10gj 3399bdd2c290SBram Moolenaar call assert_equal(10, winline()) 3400bdd2c290SBram Moolenaar normal 10gk 3401bdd2c290SBram Moolenaar call assert_equal(3, winline()) 3402bdd2c290SBram Moolenaar set scrolloff& 3403bdd2c290SBram Moolenaar close! 3404bdd2c290SBram Moolenaarendfunc 3405bdd2c290SBram Moolenaar 3406bdd2c290SBram Moolenaar" Test for vertical scrolling with CTRL-F and CTRL-B with a long line 3407bdd2c290SBram Moolenaarfunc Test_normal_vert_scroll_longline() 3408bdd2c290SBram Moolenaar 10new 3409bdd2c290SBram Moolenaar 80vnew 3410bdd2c290SBram Moolenaar call setline(1, range(1, 10)) 3411bdd2c290SBram Moolenaar call append(5, repeat('a', 1000)) 3412bdd2c290SBram Moolenaar exe "normal gg\<C-F>" 3413bdd2c290SBram Moolenaar call assert_equal(6, line('.')) 3414bdd2c290SBram Moolenaar exe "normal \<C-F>\<C-F>" 3415bdd2c290SBram Moolenaar call assert_equal(11, line('.')) 3416bdd2c290SBram Moolenaar call assert_equal(1, winline()) 3417bdd2c290SBram Moolenaar exe "normal \<C-B>" 3418bdd2c290SBram Moolenaar call assert_equal(10, line('.')) 3419bdd2c290SBram Moolenaar call assert_equal(3, winline()) 3420bdd2c290SBram Moolenaar exe "normal \<C-B>\<C-B>" 3421bdd2c290SBram Moolenaar call assert_equal(5, line('.')) 3422bdd2c290SBram Moolenaar call assert_equal(5, winline()) 3423bdd2c290SBram Moolenaar close! 3424bdd2c290SBram Moolenaarendfunc 3425bdd2c290SBram Moolenaar 34268a9bc95eSBram Moolenaar" Test for jumping in a file using % 34278a9bc95eSBram Moolenaarfunc Test_normal_percent_jump() 34288a9bc95eSBram Moolenaar new 34298a9bc95eSBram Moolenaar call setline(1, range(1, 100)) 34308a9bc95eSBram Moolenaar 34318a9bc95eSBram Moolenaar " jumping to a folded line should open the fold 34328a9bc95eSBram Moolenaar 25,75fold 34338a9bc95eSBram Moolenaar call feedkeys('50%', 'xt') 34348a9bc95eSBram Moolenaar call assert_equal(50, line('.')) 34358a9bc95eSBram Moolenaar call assert_equal(-1, foldclosedend(50)) 34368a9bc95eSBram Moolenaar close! 34378a9bc95eSBram Moolenaarendfunc 34388a9bc95eSBram Moolenaar 34393e72dcadSBram Moolenaar" Test for << and >> commands to shift text by 'shiftwidth' 34403e72dcadSBram Moolenaarfunc Test_normal_shift_rightleft() 34413e72dcadSBram Moolenaar new 34423e72dcadSBram Moolenaar call setline(1, ['one', '', "\t", ' two', "\tthree", ' four']) 34433e72dcadSBram Moolenaar set shiftwidth=2 tabstop=8 34443e72dcadSBram Moolenaar normal gg6>> 34453e72dcadSBram Moolenaar call assert_equal([' one', '', "\t ", ' two', "\t three", "\tfour"], 34463e72dcadSBram Moolenaar \ getline(1, '$')) 34473e72dcadSBram Moolenaar normal ggVG2>> 34483e72dcadSBram Moolenaar call assert_equal([' one', '', "\t ", "\ttwo", 34493e72dcadSBram Moolenaar \ "\t three", "\t four"], getline(1, '$')) 34503e72dcadSBram Moolenaar normal gg6<< 34513e72dcadSBram Moolenaar call assert_equal([' one', '', "\t ", ' two', "\t three", 34523e72dcadSBram Moolenaar \ "\t four"], getline(1, '$')) 34533e72dcadSBram Moolenaar normal ggVG2<< 34543e72dcadSBram Moolenaar call assert_equal(['one', '', "\t", ' two', "\tthree", ' four'], 34553e72dcadSBram Moolenaar \ getline(1, '$')) 34563e72dcadSBram Moolenaar set shiftwidth& tabstop& 34573e72dcadSBram Moolenaar bw! 34583e72dcadSBram Moolenaarendfunc 34593e72dcadSBram Moolenaar 34602ac7184dSYegappan Lakshmanan" Some commands like yy, cc, dd, >>, << and !! accept a count after 34612ac7184dSYegappan Lakshmanan" typing the first letter of the command. 34622ac7184dSYegappan Lakshmananfunc Test_normal_count_after_operator() 34632ac7184dSYegappan Lakshmanan new 34642ac7184dSYegappan Lakshmanan setlocal shiftwidth=4 tabstop=8 autoindent 34652ac7184dSYegappan Lakshmanan call setline(1, ['one', 'two', 'three', 'four', 'five']) 34662ac7184dSYegappan Lakshmanan let @a = '' 34672ac7184dSYegappan Lakshmanan normal! j"ay4y 34682ac7184dSYegappan Lakshmanan call assert_equal("two\nthree\nfour\nfive\n", @a) 34692ac7184dSYegappan Lakshmanan normal! 3G>2> 34702ac7184dSYegappan Lakshmanan call assert_equal(['one', 'two', ' three', ' four', 'five'], 34712ac7184dSYegappan Lakshmanan \ getline(1, '$')) 34722ac7184dSYegappan Lakshmanan exe "normal! 3G0c2cred\nblue" 34732ac7184dSYegappan Lakshmanan call assert_equal(['one', 'two', ' red', ' blue', 'five'], 34742ac7184dSYegappan Lakshmanan \ getline(1, '$')) 34752ac7184dSYegappan Lakshmanan exe "normal! gg<8<" 34762ac7184dSYegappan Lakshmanan call assert_equal(['one', 'two', 'red', 'blue', 'five'], 34772ac7184dSYegappan Lakshmanan \ getline(1, '$')) 34782ac7184dSYegappan Lakshmanan exe "normal! ggd3d" 34792ac7184dSYegappan Lakshmanan call assert_equal(['blue', 'five'], getline(1, '$')) 34802ac7184dSYegappan Lakshmanan call setline(1, range(1, 4)) 34812ac7184dSYegappan Lakshmanan call feedkeys("gg!3!\<C-B>\"\<CR>", 'xt') 34822ac7184dSYegappan Lakshmanan call assert_equal('".,.+2!', @:) 34832ac7184dSYegappan Lakshmanan call feedkeys("gg!1!\<C-B>\"\<CR>", 'xt') 34842ac7184dSYegappan Lakshmanan call assert_equal('".!', @:) 34852ac7184dSYegappan Lakshmanan call feedkeys("gg!9!\<C-B>\"\<CR>", 'xt') 34862ac7184dSYegappan Lakshmanan call assert_equal('".,$!', @:) 34872ac7184dSYegappan Lakshmanan bw! 34882ac7184dSYegappan Lakshmananendfunc 34892ac7184dSYegappan Lakshmanan 3490aaec1d4fSChristian Brabandtfunc Test_normal_gj_on_extra_wide_char() 3491aaec1d4fSChristian Brabandt new | 25vsp 3492aaec1d4fSChristian Brabandt let text='1 foooooooo ar e inszwe1 foooooooo inszwei' . 3493aaec1d4fSChristian Brabandt \ ' i drei vier fünf sechs sieben acht un zehn elf zwöfl' . 3494aaec1d4fSChristian Brabandt \ ' dreizehn v ierzehn fünfzehn' 3495aaec1d4fSChristian Brabandt put =text 3496aaec1d4fSChristian Brabandt call cursor(2,1) 3497aaec1d4fSChristian Brabandt norm! gj 3498aaec1d4fSChristian Brabandt call assert_equal([0,2,25,0], getpos('.')) 3499aaec1d4fSChristian Brabandt bw! 3500aaec1d4fSChristian Brabandtendfunc 3501aaec1d4fSChristian Brabandt 3502f5f1e10dSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 3503