xref: /vim-8.2.3635/src/testdir/test_normal.vim (revision 9f4de1f5)
187bc3f74SBram Moolenaar" Test for various Normal mode commands
287bc3f74SBram Moolenaar
3c3c766eaSBram Moolenaarset belloff=all
487bc3f74SBram Moolenaarfunc! Setup_NewWindow()
587bc3f74SBram Moolenaar  10new
687bc3f74SBram Moolenaar  call setline(1, range(1,100))
787bc3f74SBram Moolenaarendfunc
887bc3f74SBram Moolenaar
987bc3f74SBram Moolenaarfunc! MyFormatExpr()
1087bc3f74SBram Moolenaar  " Adds '->$' at lines having numbers followed by trailing whitespace
1187bc3f74SBram Moolenaar  for ln in range(v:lnum, v:lnum+v:count-1)
1287bc3f74SBram Moolenaar    let line = getline(ln)
1387bc3f74SBram Moolenaar    if getline(ln) =~# '\d\s\+$'
1487bc3f74SBram Moolenaar      call setline(ln, substitute(line, '\s\+$', '', '') . '->$')
1587bc3f74SBram Moolenaar    endif
1687bc3f74SBram Moolenaar  endfor
172931f2a5SBram Moolenaarendfunc
1887bc3f74SBram Moolenaar
192931f2a5SBram Moolenaarfunc! CountSpaces(type, ...)
2087bc3f74SBram Moolenaar  " for testing operatorfunc
2187bc3f74SBram Moolenaar  " will count the number of spaces
2287bc3f74SBram Moolenaar  " and return the result in g:a
2387bc3f74SBram Moolenaar  let sel_save = &selection
2487bc3f74SBram Moolenaar  let &selection = "inclusive"
2587bc3f74SBram Moolenaar  let reg_save = @@
2687bc3f74SBram Moolenaar
2787bc3f74SBram Moolenaar  if a:0  " Invoked from Visual mode, use gv command.
2887bc3f74SBram Moolenaar    silent exe "normal! gvy"
2987bc3f74SBram Moolenaar  elseif a:type == 'line'
3087bc3f74SBram Moolenaar    silent exe "normal! '[V']y"
3187bc3f74SBram Moolenaar  else
3287bc3f74SBram Moolenaar    silent exe "normal! `[v`]y"
3387bc3f74SBram Moolenaar  endif
3487bc3f74SBram Moolenaar  let g:a=strlen(substitute(@@, '[^ ]', '', 'g'))
3587bc3f74SBram Moolenaar  let &selection = sel_save
3687bc3f74SBram Moolenaar  let @@ = reg_save
372931f2a5SBram Moolenaarendfunc
382931f2a5SBram Moolenaar
394a08b0dcSBram Moolenaarfunc! OpfuncDummy(type, ...)
404a08b0dcSBram Moolenaar  " for testing operatorfunc
414a08b0dcSBram Moolenaar  let g:opt=&linebreak
424a08b0dcSBram Moolenaar
434a08b0dcSBram Moolenaar  if a:0  " Invoked from Visual mode, use gv command.
444a08b0dcSBram Moolenaar    silent exe "normal! gvy"
454a08b0dcSBram Moolenaar  elseif a:type == 'line'
464a08b0dcSBram Moolenaar    silent exe "normal! '[V']y"
474a08b0dcSBram Moolenaar  else
484a08b0dcSBram Moolenaar    silent exe "normal! `[v`]y"
494a08b0dcSBram Moolenaar  endif
504a08b0dcSBram Moolenaar  " Create a new dummy window
514a08b0dcSBram Moolenaar  new
524a08b0dcSBram Moolenaar  let g:bufnr=bufnr('%')
532931f2a5SBram Moolenaarendfunc
5487bc3f74SBram Moolenaar
5587bc3f74SBram Moolenaarfun! Test_normal00_optrans()
5687bc3f74SBram Moolenaar  new
5787bc3f74SBram Moolenaar  call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
5887bc3f74SBram Moolenaar  1
5987bc3f74SBram Moolenaar  exe "norm! Sfoobar\<esc>"
6087bc3f74SBram Moolenaar  call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$'))
6187bc3f74SBram Moolenaar  2
6287bc3f74SBram Moolenaar  exe "norm! $vbsone"
6387bc3f74SBram Moolenaar  call assert_equal(['foobar', '2 This is the second one', '3 this is the third line', ''], getline(1,'$'))
6487bc3f74SBram Moolenaar  norm! VS Second line here
6587bc3f74SBram Moolenaar  call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$'))
6687bc3f74SBram Moolenaar  %d
6787bc3f74SBram Moolenaar  call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line'])
6887bc3f74SBram Moolenaar  call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
6987bc3f74SBram Moolenaar
7087bc3f74SBram Moolenaar  1
7187bc3f74SBram Moolenaar  norm! 2D
7287bc3f74SBram 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,'$'))
7387bc3f74SBram Moolenaar  set cpo+=#
7487bc3f74SBram Moolenaar  norm! 4D
7587bc3f74SBram 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,'$'))
7687bc3f74SBram Moolenaar
7787bc3f74SBram Moolenaar  " clean up
7887bc3f74SBram Moolenaar  set cpo-=#
7987bc3f74SBram Moolenaar  bw!
802931f2a5SBram Moolenaarendfunc
8187bc3f74SBram Moolenaar
8287bc3f74SBram Moolenaarfunc! Test_normal01_keymodel()
8387bc3f74SBram Moolenaar  call Setup_NewWindow()
8487bc3f74SBram Moolenaar  " Test 1: depending on 'keymodel' <s-down> does something different
852931f2a5SBram Moolenaar  50
8687bc3f74SBram Moolenaar  call feedkeys("V\<S-Up>y", 'tx')
8787bc3f74SBram Moolenaar  call assert_equal(['47', '48', '49', '50'], getline("'<", "'>"))
882931f2a5SBram Moolenaar  set keymodel=startsel
892931f2a5SBram Moolenaar  50
9087bc3f74SBram Moolenaar  call feedkeys("V\<S-Up>y", 'tx')
9187bc3f74SBram Moolenaar  call assert_equal(['49', '50'], getline("'<", "'>"))
9287bc3f74SBram Moolenaar  " Start visual mode when keymodel = startsel
932931f2a5SBram Moolenaar  50
9487bc3f74SBram Moolenaar  call feedkeys("\<S-Up>y", 'tx')
9587bc3f74SBram Moolenaar  call assert_equal(['49', '5'], getreg(0, 0, 1))
9687bc3f74SBram Moolenaar  " Do not start visual mode when keymodel=
972931f2a5SBram Moolenaar  set keymodel=
982931f2a5SBram Moolenaar  50
9987bc3f74SBram Moolenaar  call feedkeys("\<S-Up>y$", 'tx')
10087bc3f74SBram Moolenaar  call assert_equal(['42'], getreg(0, 0, 1))
1012931f2a5SBram Moolenaar  " Stop visual mode when keymodel=stopsel
1022931f2a5SBram Moolenaar  set keymodel=stopsel
1032931f2a5SBram Moolenaar  50
1042931f2a5SBram Moolenaar  call feedkeys("Vkk\<Up>yy", 'tx')
1052931f2a5SBram Moolenaar  call assert_equal(['47'], getreg(0, 0, 1))
1062931f2a5SBram Moolenaar
1072931f2a5SBram Moolenaar  set keymodel=
1082931f2a5SBram Moolenaar  50
1092931f2a5SBram Moolenaar  call feedkeys("Vkk\<Up>yy", 'tx')
1102931f2a5SBram Moolenaar  call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1))
11187bc3f74SBram Moolenaar
11287bc3f74SBram Moolenaar  " clean up
11387bc3f74SBram Moolenaar  bw!
11487bc3f74SBram Moolenaarendfunc
11587bc3f74SBram Moolenaar
11687bc3f74SBram Moolenaarfunc! Test_normal02_selectmode()
11787bc3f74SBram Moolenaar  " some basic select mode tests
11887bc3f74SBram Moolenaar  call Setup_NewWindow()
11987bc3f74SBram Moolenaar  50
12087bc3f74SBram Moolenaar  norm! gHy
12187bc3f74SBram Moolenaar  call assert_equal('y51', getline('.'))
12287bc3f74SBram Moolenaar  call setline(1, range(1,100))
12387bc3f74SBram Moolenaar  50
12487bc3f74SBram Moolenaar  exe ":norm! V9jo\<c-g>y"
12587bc3f74SBram Moolenaar  call assert_equal('y60', getline('.'))
12687bc3f74SBram Moolenaar  " clean up
12787bc3f74SBram Moolenaar  bw!
1282931f2a5SBram Moolenaarendfunc
1292931f2a5SBram Moolenaar
1302931f2a5SBram Moolenaarfunc! Test_normal02_selectmode2()
1312931f2a5SBram Moolenaar  " some basic select mode tests
1322931f2a5SBram Moolenaar  call Setup_NewWindow()
1332931f2a5SBram Moolenaar  50
1342931f2a5SBram Moolenaar  call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx')
1352931f2a5SBram Moolenaar  call assert_equal('c51', getline('.'))
1362931f2a5SBram Moolenaar  " clean up
1372931f2a5SBram Moolenaar  bw!
1382931f2a5SBram Moolenaarendfunc
13987bc3f74SBram Moolenaar
14087bc3f74SBram Moolenaarfunc! Test_normal03_join()
14187bc3f74SBram Moolenaar  " basic join test
14287bc3f74SBram Moolenaar  call Setup_NewWindow()
14387bc3f74SBram Moolenaar  50
14487bc3f74SBram Moolenaar  norm! VJ
14587bc3f74SBram Moolenaar  call assert_equal('50 51', getline('.'))
14687bc3f74SBram Moolenaar  $
14787bc3f74SBram Moolenaar  norm! J
14887bc3f74SBram Moolenaar  call assert_equal('100', getline('.'))
14987bc3f74SBram Moolenaar  $
15087bc3f74SBram Moolenaar  norm! V9-gJ
15187bc3f74SBram Moolenaar  call assert_equal('919293949596979899100', getline('.'))
15287bc3f74SBram Moolenaar  call setline(1, range(1,100))
15387bc3f74SBram Moolenaar  $
15487bc3f74SBram Moolenaar  :j 10
15587bc3f74SBram Moolenaar  call assert_equal('100', getline('.'))
15687bc3f74SBram Moolenaar  " clean up
15787bc3f74SBram Moolenaar  bw!
1582931f2a5SBram Moolenaarendfunc
15987bc3f74SBram Moolenaar
16087bc3f74SBram Moolenaarfunc! Test_normal04_filter()
16187bc3f74SBram Moolenaar  " basic filter test
16287bc3f74SBram Moolenaar  " only test on non windows platform
1634a08b0dcSBram Moolenaar  if has('win32')
16487bc3f74SBram Moolenaar    return
16587bc3f74SBram Moolenaar  endif
16687bc3f74SBram Moolenaar  call Setup_NewWindow()
16787bc3f74SBram Moolenaar  1
16887bc3f74SBram Moolenaar  call feedkeys("!!sed -e 's/^/|    /'\n", 'tx')
16987bc3f74SBram Moolenaar  call assert_equal('|    1', getline('.'))
17087bc3f74SBram Moolenaar  90
17187bc3f74SBram Moolenaar  :sil :!echo one
17287bc3f74SBram Moolenaar  call feedkeys('.', 'tx')
17387bc3f74SBram Moolenaar  call assert_equal('|    90', getline('.'))
17487bc3f74SBram Moolenaar  95
17587bc3f74SBram Moolenaar  set cpo+=!
17687bc3f74SBram Moolenaar  " 2 <CR>, 1: for executing the command,
17787bc3f74SBram Moolenaar  "         2: clear hit-enter-prompt
17887bc3f74SBram Moolenaar  call feedkeys("!!\n", 'tx')
17987bc3f74SBram Moolenaar  call feedkeys(":!echo one\n\n", 'tx')
18087bc3f74SBram Moolenaar  call feedkeys(".", 'tx')
18187bc3f74SBram Moolenaar  call assert_equal('one', getline('.'))
18287bc3f74SBram Moolenaar  set cpo-=!
18387bc3f74SBram Moolenaar  bw!
1842931f2a5SBram Moolenaarendfunc
18587bc3f74SBram Moolenaar
18687bc3f74SBram Moolenaarfunc! Test_normal05_formatexpr()
18787bc3f74SBram Moolenaar  " basic formatexpr test
18887bc3f74SBram Moolenaar  call Setup_NewWindow()
18987bc3f74SBram Moolenaar  %d_
19087bc3f74SBram Moolenaar  call setline(1, ['here: 1   ', '2', 'here: 3   ', '4', 'not here:   '])
19187bc3f74SBram Moolenaar  1
19287bc3f74SBram Moolenaar  set formatexpr=MyFormatExpr()
19387bc3f74SBram Moolenaar  norm! gqG
19487bc3f74SBram Moolenaar  call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here:   '], getline(1,'$'))
19587bc3f74SBram Moolenaar  set formatexpr=
19687bc3f74SBram Moolenaar  bw!
1972931f2a5SBram Moolenaarendfunc
19887bc3f74SBram Moolenaar
199d77f9d59SBram Moolenaarfunc Test_normal05_formatexpr_newbuf()
200d77f9d59SBram Moolenaar  " Edit another buffer in the 'formatexpr' function
201d77f9d59SBram Moolenaar  new
202d77f9d59SBram Moolenaar  func! Format()
203d77f9d59SBram Moolenaar    edit another
204d77f9d59SBram Moolenaar  endfunc
205d77f9d59SBram Moolenaar  set formatexpr=Format()
206d77f9d59SBram Moolenaar  norm gqG
207d77f9d59SBram Moolenaar  bw!
208d77f9d59SBram Moolenaar  set formatexpr=
209d77f9d59SBram Moolenaarendfunc
210d77f9d59SBram Moolenaar
211d77f9d59SBram Moolenaarfunc Test_normal05_formatexpr_setopt()
212d77f9d59SBram Moolenaar  " Change the 'formatexpr' value in the function
213d77f9d59SBram Moolenaar  new
214d77f9d59SBram Moolenaar  func! Format()
215d77f9d59SBram Moolenaar    set formatexpr=
216d77f9d59SBram Moolenaar  endfunc
217d77f9d59SBram Moolenaar  set formatexpr=Format()
218d77f9d59SBram Moolenaar  norm gqG
219d77f9d59SBram Moolenaar  bw!
220d77f9d59SBram Moolenaar  set formatexpr=
221d77f9d59SBram Moolenaarendfunc
222d77f9d59SBram Moolenaar
22387bc3f74SBram Moolenaarfunc! Test_normal06_formatprg()
22487bc3f74SBram Moolenaar  " basic test for formatprg
22587bc3f74SBram Moolenaar  " only test on non windows platform
2264a08b0dcSBram Moolenaar  if has('win32')
22787bc3f74SBram Moolenaar    return
2289be7c04eSBram Moolenaar  endif
2299be7c04eSBram Moolenaar
23087bc3f74SBram Moolenaar  " uses sed to number non-empty lines
23187bc3f74SBram Moolenaar  call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/    /', '}'''], 'Xsed_format.sh')
23287bc3f74SBram Moolenaar  call system('chmod +x ./Xsed_format.sh')
2339be7c04eSBram Moolenaar  let text = ['a', '', 'c', '', ' ', 'd', 'e']
2349be7c04eSBram Moolenaar  let expected = ['1    a', '', '3    c', '', '5     ', '6    d', '7    e']
2359be7c04eSBram Moolenaar
2369be7c04eSBram Moolenaar  10new
2379be7c04eSBram Moolenaar  call setline(1, text)
23887bc3f74SBram Moolenaar  set formatprg=./Xsed_format.sh
23987bc3f74SBram Moolenaar  norm! gggqG
2409be7c04eSBram Moolenaar  call assert_equal(expected, getline(1, '$'))
2419be7c04eSBram Moolenaar  bw!
2429be7c04eSBram Moolenaar
2439be7c04eSBram Moolenaar  10new
2449be7c04eSBram Moolenaar  call setline(1, text)
2459be7c04eSBram Moolenaar  set formatprg=donothing
2469be7c04eSBram Moolenaar  setlocal formatprg=./Xsed_format.sh
2479be7c04eSBram Moolenaar  norm! gggqG
2489be7c04eSBram Moolenaar  call assert_equal(expected, getline(1, '$'))
2499be7c04eSBram Moolenaar  bw!
2509be7c04eSBram Moolenaar
25187bc3f74SBram Moolenaar  " clean up
25287bc3f74SBram Moolenaar  set formatprg=
2539be7c04eSBram Moolenaar  setlocal formatprg=
25487bc3f74SBram Moolenaar  call delete('Xsed_format.sh')
2552931f2a5SBram Moolenaarendfunc
25687bc3f74SBram Moolenaar
25787bc3f74SBram Moolenaarfunc! Test_normal07_internalfmt()
25887bc3f74SBram Moolenaar  " basic test for internal formmatter to textwidth of 12
25987bc3f74SBram Moolenaar  let list=range(1,11)
26087bc3f74SBram Moolenaar  call map(list, 'v:val."    "')
26187bc3f74SBram Moolenaar  10new
26287bc3f74SBram Moolenaar  call setline(1, list)
26387bc3f74SBram Moolenaar  set tw=12
26487bc3f74SBram Moolenaar  norm! gggqG
26587bc3f74SBram Moolenaar  call assert_equal(['1    2    3', '4    5    6', '7    8    9', '10    11    '], getline(1, '$'))
26687bc3f74SBram Moolenaar  " clean up
2679be7c04eSBram Moolenaar  set tw=0
26887bc3f74SBram Moolenaar  bw!
2692931f2a5SBram Moolenaarendfunc
27087bc3f74SBram Moolenaar
27187bc3f74SBram Moolenaarfunc! Test_normal08_fold()
27287bc3f74SBram Moolenaar  " basic tests for foldopen/folddelete
27387bc3f74SBram Moolenaar  if !has("folding")
27487bc3f74SBram Moolenaar    return
27587bc3f74SBram Moolenaar  endif
27687bc3f74SBram Moolenaar  call Setup_NewWindow()
27787bc3f74SBram Moolenaar  50
27887bc3f74SBram Moolenaar  setl foldenable fdm=marker
27987bc3f74SBram Moolenaar  " First fold
28087bc3f74SBram Moolenaar  norm! V4jzf
28187bc3f74SBram Moolenaar  " check that folds have been created
28287bc3f74SBram Moolenaar  call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54))
28387bc3f74SBram Moolenaar  " Second fold
28487bc3f74SBram Moolenaar  46
28587bc3f74SBram Moolenaar  norm! V10jzf
28687bc3f74SBram Moolenaar  " check that folds have been created
28787bc3f74SBram Moolenaar  call assert_equal('46/*{{{*/', getline(46))
28887bc3f74SBram Moolenaar  call assert_equal('60/*}}}*/', getline(60))
28987bc3f74SBram Moolenaar  norm! k
29087bc3f74SBram Moolenaar  call assert_equal('45', getline('.'))
29187bc3f74SBram Moolenaar  norm! j
29287bc3f74SBram Moolenaar  call assert_equal('46/*{{{*/', getline('.'))
29387bc3f74SBram Moolenaar  norm! j
29487bc3f74SBram Moolenaar  call assert_equal('61', getline('.'))
29587bc3f74SBram Moolenaar  norm! k
29687bc3f74SBram Moolenaar  " open a fold
29787bc3f74SBram Moolenaar  norm! Vzo
29887bc3f74SBram Moolenaar  norm! k
29987bc3f74SBram Moolenaar  call assert_equal('45', getline('.'))
30087bc3f74SBram Moolenaar  norm! j
30187bc3f74SBram Moolenaar  call assert_equal('46/*{{{*/', getline('.'))
30287bc3f74SBram Moolenaar  norm! j
30387bc3f74SBram Moolenaar  call assert_equal('47', getline('.'))
30487bc3f74SBram Moolenaar  norm! k
30587bc3f74SBram Moolenaar  norm! zcVzO
30687bc3f74SBram Moolenaar  call assert_equal('46/*{{{*/', getline('.'))
30787bc3f74SBram Moolenaar  norm! j
30887bc3f74SBram Moolenaar  call assert_equal('47', getline('.'))
30987bc3f74SBram Moolenaar  norm! j
31087bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
31187bc3f74SBram Moolenaar  norm! j
31287bc3f74SBram Moolenaar  call assert_equal('49', getline('.'))
31387bc3f74SBram Moolenaar  norm! j
31487bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
31587bc3f74SBram Moolenaar  norm! j
31687bc3f74SBram Moolenaar  call assert_equal('51', getline('.'))
31787bc3f74SBram Moolenaar  " delete folds
31887bc3f74SBram Moolenaar  :46
31987bc3f74SBram Moolenaar  " collapse fold
32087bc3f74SBram Moolenaar  norm! V14jzC
32187bc3f74SBram Moolenaar  " delete all folds recursively
32287bc3f74SBram Moolenaar  norm! VzD
32387bc3f74SBram Moolenaar  call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60))
32487bc3f74SBram Moolenaar
32587bc3f74SBram Moolenaar  " clean up
32687bc3f74SBram Moolenaar  setl nofoldenable fdm=marker
32787bc3f74SBram Moolenaar  bw!
3282931f2a5SBram Moolenaarendfunc
32987bc3f74SBram Moolenaar
33087bc3f74SBram Moolenaarfunc! Test_normal09_operatorfunc()
33187bc3f74SBram Moolenaar  " Test operatorfunc
33287bc3f74SBram Moolenaar  call Setup_NewWindow()
33387bc3f74SBram Moolenaar  " Add some spaces for counting
33487bc3f74SBram Moolenaar  50,60s/$/  /
33587bc3f74SBram Moolenaar  unlet! g:a
33687bc3f74SBram Moolenaar  let g:a=0
33787bc3f74SBram Moolenaar  nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@
33887bc3f74SBram Moolenaar  vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
33987bc3f74SBram Moolenaar  50
34087bc3f74SBram Moolenaar  norm V2j,,
34187bc3f74SBram Moolenaar  call assert_equal(6, g:a)
34287bc3f74SBram Moolenaar  norm V,,
34387bc3f74SBram Moolenaar  call assert_equal(2, g:a)
34487bc3f74SBram Moolenaar  norm ,,l
34587bc3f74SBram Moolenaar  call assert_equal(0, g:a)
34687bc3f74SBram Moolenaar  50
34787bc3f74SBram Moolenaar  exe "norm 0\<c-v>10j2l,,"
34887bc3f74SBram Moolenaar  call assert_equal(11, g:a)
34987bc3f74SBram Moolenaar  50
35087bc3f74SBram Moolenaar  norm V10j,,
35187bc3f74SBram Moolenaar  call assert_equal(22, g:a)
35287bc3f74SBram Moolenaar
35387bc3f74SBram Moolenaar  " clean up
35487bc3f74SBram Moolenaar  unmap <buffer> ,,
35587bc3f74SBram Moolenaar  set opfunc=
3564a08b0dcSBram Moolenaar  unlet! g:a
35787bc3f74SBram Moolenaar  bw!
3582931f2a5SBram Moolenaarendfunc
35987bc3f74SBram Moolenaar
3604a08b0dcSBram Moolenaarfunc! Test_normal09a_operatorfunc()
3614a08b0dcSBram Moolenaar  " Test operatorfunc
3624a08b0dcSBram Moolenaar  call Setup_NewWindow()
3634a08b0dcSBram Moolenaar  " Add some spaces for counting
3644a08b0dcSBram Moolenaar  50,60s/$/  /
3654a08b0dcSBram Moolenaar  unlet! g:opt
3664a08b0dcSBram Moolenaar  set linebreak
3674a08b0dcSBram Moolenaar  nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@
3684a08b0dcSBram Moolenaar  50
3694a08b0dcSBram Moolenaar  norm ,,j
3704a08b0dcSBram Moolenaar  exe "bd!" g:bufnr
3714a08b0dcSBram Moolenaar  call assert_true(&linebreak)
3724a08b0dcSBram Moolenaar  call assert_equal(g:opt, &linebreak)
3734a08b0dcSBram Moolenaar  set nolinebreak
3744a08b0dcSBram Moolenaar  norm ,,j
3754a08b0dcSBram Moolenaar  exe "bd!" g:bufnr
3764a08b0dcSBram Moolenaar  call assert_false(&linebreak)
3774a08b0dcSBram Moolenaar  call assert_equal(g:opt, &linebreak)
3784a08b0dcSBram Moolenaar
3794a08b0dcSBram Moolenaar  " clean up
3804a08b0dcSBram Moolenaar  unmap <buffer> ,,
3814a08b0dcSBram Moolenaar  set opfunc=
3824a08b0dcSBram Moolenaar  bw!
3834a08b0dcSBram Moolenaar  unlet! g:opt
3844a08b0dcSBram Moolenaarendfunc
3854a08b0dcSBram Moolenaar
38687bc3f74SBram Moolenaarfunc! Test_normal10_expand()
38787bc3f74SBram Moolenaar  " Test for expand()
38887bc3f74SBram Moolenaar  10new
38987bc3f74SBram Moolenaar  call setline(1, ['1', 'ifooar,,cbar'])
39087bc3f74SBram Moolenaar  2
39187bc3f74SBram Moolenaar  norm! $
39287bc3f74SBram Moolenaar  let a=expand('<cword>')
39387bc3f74SBram Moolenaar  let b=expand('<cWORD>')
39487bc3f74SBram Moolenaar  call assert_equal('cbar', a)
39587bc3f74SBram Moolenaar  call assert_equal('ifooar,,cbar', b)
39687bc3f74SBram Moolenaar  " clean up
39787bc3f74SBram Moolenaar  bw!
3982931f2a5SBram Moolenaarendfunc
39987bc3f74SBram Moolenaar
40087bc3f74SBram Moolenaarfunc! Test_normal11_showcmd()
40187bc3f74SBram Moolenaar  " test for 'showcmd'
40287bc3f74SBram Moolenaar  10new
40387bc3f74SBram Moolenaar  exe "norm! ofoobar\<esc>"
40487bc3f74SBram Moolenaar  call assert_equal(2, line('$'))
40587bc3f74SBram Moolenaar  set showcmd
40687bc3f74SBram Moolenaar  exe "norm! ofoobar2\<esc>"
40787bc3f74SBram Moolenaar  call assert_equal(3, line('$'))
40887bc3f74SBram Moolenaar  exe "norm! VAfoobar3\<esc>"
40987bc3f74SBram Moolenaar  call assert_equal(3, line('$'))
41087bc3f74SBram Moolenaar  exe "norm! 0d3\<del>2l"
41187bc3f74SBram Moolenaar  call assert_equal('obar2foobar3', getline('.'))
41287bc3f74SBram Moolenaar  bw!
4132931f2a5SBram Moolenaarendfunc
41487bc3f74SBram Moolenaar
41587bc3f74SBram Moolenaarfunc! Test_normal12_nv_error()
41687bc3f74SBram Moolenaar  " Test for nv_error
41787bc3f74SBram Moolenaar  10new
41887bc3f74SBram Moolenaar  call setline(1, range(1,5))
41987bc3f74SBram Moolenaar  " should not do anything, just beep
42087bc3f74SBram Moolenaar  exe "norm! <c-k>"
42187bc3f74SBram Moolenaar  call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$'))
42287bc3f74SBram Moolenaar  bw!
4232931f2a5SBram Moolenaarendfunc
42487bc3f74SBram Moolenaar
42587bc3f74SBram Moolenaarfunc! Test_normal13_help()
42687bc3f74SBram Moolenaar  " Test for F1
42787bc3f74SBram Moolenaar  call assert_equal(1, winnr())
42887bc3f74SBram Moolenaar  call feedkeys("\<f1>", 'txi')
42987bc3f74SBram Moolenaar  call assert_match('help\.txt', bufname('%'))
43087bc3f74SBram Moolenaar  call assert_equal(2, winnr('$'))
43187bc3f74SBram Moolenaar  bw!
4322931f2a5SBram Moolenaarendfunc
43387bc3f74SBram Moolenaar
43487bc3f74SBram Moolenaarfunc! Test_normal14_page()
43587bc3f74SBram Moolenaar  " basic test for Ctrl-F and Ctrl-B
43687bc3f74SBram Moolenaar  call Setup_NewWindow()
43787bc3f74SBram Moolenaar  exe "norm! \<c-f>"
43887bc3f74SBram Moolenaar  call assert_equal('9', getline('.'))
43987bc3f74SBram Moolenaar  exe "norm! 2\<c-f>"
44087bc3f74SBram Moolenaar  call assert_equal('25', getline('.'))
44187bc3f74SBram Moolenaar  exe "norm! 2\<c-b>"
44287bc3f74SBram Moolenaar  call assert_equal('18', getline('.'))
44387bc3f74SBram Moolenaar  1
44487bc3f74SBram Moolenaar  set scrolloff=5
44587bc3f74SBram Moolenaar  exe "norm! 2\<c-f>"
44687bc3f74SBram Moolenaar  call assert_equal('21', getline('.'))
44787bc3f74SBram Moolenaar  exe "norm! \<c-b>"
44887bc3f74SBram Moolenaar  call assert_equal('13', getline('.'))
44987bc3f74SBram Moolenaar  1
45087bc3f74SBram Moolenaar  set scrolloff=99
45187bc3f74SBram Moolenaar  exe "norm! \<c-f>"
45287bc3f74SBram Moolenaar  call assert_equal('13', getline('.'))
45387bc3f74SBram Moolenaar  set scrolloff=0
45487bc3f74SBram Moolenaar  100
45587bc3f74SBram Moolenaar  exe "norm! $\<c-b>"
45687bc3f74SBram Moolenaar  call assert_equal('92', getline('.'))
45787bc3f74SBram Moolenaar  call assert_equal([0, 92, 1, 0, 1], getcurpos())
45887bc3f74SBram Moolenaar  100
45987bc3f74SBram Moolenaar  set nostartofline
46087bc3f74SBram Moolenaar  exe "norm! $\<c-b>"
46187bc3f74SBram Moolenaar  call assert_equal('92', getline('.'))
46287bc3f74SBram Moolenaar  call assert_equal([0, 92, 2, 0, 2147483647], getcurpos())
46387bc3f74SBram Moolenaar  " cleanup
46487bc3f74SBram Moolenaar  set startofline
46587bc3f74SBram Moolenaar  bw!
4662931f2a5SBram Moolenaarendfunc
46787bc3f74SBram Moolenaar
468bc54f3f3SBram Moolenaarfunc! Test_normal14_page_eol()
469bc54f3f3SBram Moolenaar  10new
470bc54f3f3SBram Moolenaar  norm oxxxxxxx
471bc54f3f3SBram Moolenaar  exe "norm 2\<c-f>"
472bc54f3f3SBram Moolenaar  " check with valgrind that cursor is put back in column 1
473bc54f3f3SBram Moolenaar  exe "norm 2\<c-b>"
474bc54f3f3SBram Moolenaar  bw!
475bc54f3f3SBram Moolenaarendfunc
476bc54f3f3SBram Moolenaar
47787bc3f74SBram Moolenaarfunc! Test_normal15_z_scroll_vert()
47887bc3f74SBram Moolenaar  " basic test for z commands that scroll the window
47987bc3f74SBram Moolenaar  call Setup_NewWindow()
48087bc3f74SBram Moolenaar  100
48187bc3f74SBram Moolenaar  norm! >>
48287bc3f74SBram Moolenaar  " Test for z<cr>
48387bc3f74SBram Moolenaar  exe "norm! z\<cr>"
48487bc3f74SBram Moolenaar  call assert_equal('	100', getline('.'))
48587bc3f74SBram Moolenaar  call assert_equal(100, winsaveview()['topline'])
48687bc3f74SBram Moolenaar  call assert_equal([0, 100, 2, 0, 9], getcurpos())
48787bc3f74SBram Moolenaar
48887bc3f74SBram Moolenaar  " Test for zt
48987bc3f74SBram Moolenaar  21
49087bc3f74SBram Moolenaar  norm! >>0zt
49187bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
49287bc3f74SBram Moolenaar  call assert_equal(21, winsaveview()['topline'])
49387bc3f74SBram Moolenaar  call assert_equal([0, 21, 1, 0, 8], getcurpos())
49487bc3f74SBram Moolenaar
49587bc3f74SBram Moolenaar  " Test for zb
49687bc3f74SBram Moolenaar  30
49787bc3f74SBram Moolenaar  norm! >>$ztzb
49887bc3f74SBram Moolenaar  call assert_equal('	30', getline('.'))
49987bc3f74SBram Moolenaar  call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
50087bc3f74SBram Moolenaar  call assert_equal([0, 30, 3, 0, 2147483647], getcurpos())
50187bc3f74SBram Moolenaar
50287bc3f74SBram Moolenaar  " Test for z-
50387bc3f74SBram Moolenaar  1
50487bc3f74SBram Moolenaar  30
50587bc3f74SBram Moolenaar  norm! 0z-
50687bc3f74SBram Moolenaar  call assert_equal('	30', getline('.'))
50787bc3f74SBram Moolenaar  call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
50887bc3f74SBram Moolenaar  call assert_equal([0, 30, 2, 0, 9], getcurpos())
50987bc3f74SBram Moolenaar
51087bc3f74SBram Moolenaar  " Test for z{height}<cr>
51187bc3f74SBram Moolenaar  call assert_equal(10, winheight(0))
51287bc3f74SBram Moolenaar  exe "norm! z12\<cr>"
51387bc3f74SBram Moolenaar  call assert_equal(12, winheight(0))
51487bc3f74SBram Moolenaar  exe "norm! z10\<cr>"
51587bc3f74SBram Moolenaar  call assert_equal(10, winheight(0))
51687bc3f74SBram Moolenaar
51787bc3f74SBram Moolenaar  " Test for z.
51887bc3f74SBram Moolenaar  1
51987bc3f74SBram Moolenaar  21
52087bc3f74SBram Moolenaar  norm! 0z.
52187bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
52287bc3f74SBram Moolenaar  call assert_equal(17, winsaveview()['topline'])
52387bc3f74SBram Moolenaar  call assert_equal([0, 21, 2, 0, 9], getcurpos())
52487bc3f74SBram Moolenaar
52587bc3f74SBram Moolenaar  " Test for zz
52687bc3f74SBram Moolenaar  1
52787bc3f74SBram Moolenaar  21
52887bc3f74SBram Moolenaar  norm! 0zz
52987bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
53087bc3f74SBram Moolenaar  call assert_equal(17, winsaveview()['topline'])
53187bc3f74SBram Moolenaar  call assert_equal([0, 21, 1, 0, 8], getcurpos())
53287bc3f74SBram Moolenaar
53387bc3f74SBram Moolenaar  " Test for z+
53487bc3f74SBram Moolenaar  11
53587bc3f74SBram Moolenaar  norm! zt
53687bc3f74SBram Moolenaar  norm! z+
53787bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
53887bc3f74SBram Moolenaar  call assert_equal(21, winsaveview()['topline'])
53987bc3f74SBram Moolenaar  call assert_equal([0, 21, 2, 0, 9], getcurpos())
54087bc3f74SBram Moolenaar
54187bc3f74SBram Moolenaar  " Test for [count]z+
54287bc3f74SBram Moolenaar  1
54387bc3f74SBram Moolenaar  norm! 21z+
54487bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
54587bc3f74SBram Moolenaar  call assert_equal(21, winsaveview()['topline'])
54687bc3f74SBram Moolenaar  call assert_equal([0, 21, 2, 0, 9], getcurpos())
54787bc3f74SBram Moolenaar
54887bc3f74SBram Moolenaar  " Test for z^
54987bc3f74SBram Moolenaar  norm! 22z+0
55087bc3f74SBram Moolenaar  norm! z^
55187bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
55287bc3f74SBram Moolenaar  call assert_equal(12, winsaveview()['topline'])
55387bc3f74SBram Moolenaar  call assert_equal([0, 21, 2, 0, 9], getcurpos())
55487bc3f74SBram Moolenaar
55587bc3f74SBram Moolenaar  " Test for [count]z^
55687bc3f74SBram Moolenaar  1
55787bc3f74SBram Moolenaar  norm! 30z^
55887bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
55987bc3f74SBram Moolenaar  call assert_equal(12, winsaveview()['topline'])
56087bc3f74SBram Moolenaar  call assert_equal([0, 21, 2, 0, 9], getcurpos())
56187bc3f74SBram Moolenaar
56287bc3f74SBram Moolenaar  " cleanup
56387bc3f74SBram Moolenaar  bw!
5642931f2a5SBram Moolenaarendfunc
56587bc3f74SBram Moolenaar
56687bc3f74SBram Moolenaarfunc! Test_normal16_z_scroll_hor()
56787bc3f74SBram Moolenaar  " basic test for z commands that scroll the window
56887bc3f74SBram Moolenaar  10new
56987bc3f74SBram Moolenaar  15vsp
57087bc3f74SBram Moolenaar  set nowrap listchars=
57187bc3f74SBram Moolenaar  let lineA='abcdefghijklmnopqrstuvwxyz'
57287bc3f74SBram Moolenaar  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
57387bc3f74SBram Moolenaar  $put =lineA
57487bc3f74SBram Moolenaar  $put =lineB
57587bc3f74SBram Moolenaar  1d
57687bc3f74SBram Moolenaar
57787bc3f74SBram Moolenaar  " Test for zl
57887bc3f74SBram Moolenaar  1
57987bc3f74SBram Moolenaar  norm! 5zl
58087bc3f74SBram Moolenaar  call assert_equal(lineA, getline('.'))
58187bc3f74SBram Moolenaar  call assert_equal(6, col('.'))
58287bc3f74SBram Moolenaar  call assert_equal(5, winsaveview()['leftcol'])
58387bc3f74SBram Moolenaar  norm! yl
58487bc3f74SBram Moolenaar  call assert_equal('f', @0)
58587bc3f74SBram Moolenaar
58687bc3f74SBram Moolenaar  " Test for zh
58787bc3f74SBram Moolenaar  norm! 2zh
58887bc3f74SBram Moolenaar  call assert_equal(lineA, getline('.'))
58987bc3f74SBram Moolenaar  call assert_equal(6, col('.'))
59087bc3f74SBram Moolenaar  norm! yl
59187bc3f74SBram Moolenaar  call assert_equal('f', @0)
59287bc3f74SBram Moolenaar  call assert_equal(3, winsaveview()['leftcol'])
59387bc3f74SBram Moolenaar
59487bc3f74SBram Moolenaar  " Test for zL
59587bc3f74SBram Moolenaar  norm! zL
59687bc3f74SBram Moolenaar  call assert_equal(11, col('.'))
59787bc3f74SBram Moolenaar  norm! yl
59887bc3f74SBram Moolenaar  call assert_equal('k', @0)
59987bc3f74SBram Moolenaar  call assert_equal(10, winsaveview()['leftcol'])
60087bc3f74SBram Moolenaar  norm! 2zL
60187bc3f74SBram Moolenaar  call assert_equal(25, col('.'))
60287bc3f74SBram Moolenaar  norm! yl
60387bc3f74SBram Moolenaar  call assert_equal('y', @0)
60487bc3f74SBram Moolenaar  call assert_equal(24, winsaveview()['leftcol'])
60587bc3f74SBram Moolenaar
60687bc3f74SBram Moolenaar  " Test for zH
60787bc3f74SBram Moolenaar  norm! 2zH
60887bc3f74SBram Moolenaar  call assert_equal(25, col('.'))
60987bc3f74SBram Moolenaar  call assert_equal(10, winsaveview()['leftcol'])
61087bc3f74SBram Moolenaar  norm! yl
61187bc3f74SBram Moolenaar  call assert_equal('y', @0)
61287bc3f74SBram Moolenaar
61387bc3f74SBram Moolenaar  " Test for zs
61487bc3f74SBram Moolenaar  norm! $zs
61587bc3f74SBram Moolenaar  call assert_equal(26, col('.'))
61687bc3f74SBram Moolenaar  call assert_equal(25, winsaveview()['leftcol'])
61787bc3f74SBram Moolenaar  norm! yl
61887bc3f74SBram Moolenaar  call assert_equal('z', @0)
61987bc3f74SBram Moolenaar
62087bc3f74SBram Moolenaar  " Test for ze
62187bc3f74SBram Moolenaar  norm! ze
62287bc3f74SBram Moolenaar  call assert_equal(26, col('.'))
62387bc3f74SBram Moolenaar  call assert_equal(11, winsaveview()['leftcol'])
62487bc3f74SBram Moolenaar  norm! yl
62587bc3f74SBram Moolenaar  call assert_equal('z', @0)
62687bc3f74SBram Moolenaar
62787bc3f74SBram Moolenaar  " cleanup
62887bc3f74SBram Moolenaar  set wrap listchars=eol:$
62987bc3f74SBram Moolenaar  bw!
6302931f2a5SBram Moolenaarendfunc
63187bc3f74SBram Moolenaar
63287bc3f74SBram Moolenaarfunc! Test_normal17_z_scroll_hor2()
63387bc3f74SBram Moolenaar  " basic test for z commands that scroll the window
63487bc3f74SBram Moolenaar  " using 'sidescrolloff' setting
63587bc3f74SBram Moolenaar  10new
63687bc3f74SBram Moolenaar  20vsp
63787bc3f74SBram Moolenaar  set nowrap listchars= sidescrolloff=5
63887bc3f74SBram Moolenaar  let lineA='abcdefghijklmnopqrstuvwxyz'
63987bc3f74SBram Moolenaar  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
64087bc3f74SBram Moolenaar  $put =lineA
64187bc3f74SBram Moolenaar  $put =lineB
64287bc3f74SBram Moolenaar  1d
64387bc3f74SBram Moolenaar
64487bc3f74SBram Moolenaar  " Test for zl
64587bc3f74SBram Moolenaar  1
64687bc3f74SBram Moolenaar  norm! 5zl
64787bc3f74SBram Moolenaar  call assert_equal(lineA, getline('.'))
64887bc3f74SBram Moolenaar  call assert_equal(11, col('.'))
64987bc3f74SBram Moolenaar  call assert_equal(5, winsaveview()['leftcol'])
65087bc3f74SBram Moolenaar  norm! yl
65187bc3f74SBram Moolenaar  call assert_equal('k', @0)
65287bc3f74SBram Moolenaar
65387bc3f74SBram Moolenaar  " Test for zh
65487bc3f74SBram Moolenaar  norm! 2zh
65587bc3f74SBram Moolenaar  call assert_equal(lineA, getline('.'))
65687bc3f74SBram Moolenaar  call assert_equal(11, col('.'))
65787bc3f74SBram Moolenaar  norm! yl
65887bc3f74SBram Moolenaar  call assert_equal('k', @0)
65987bc3f74SBram Moolenaar  call assert_equal(3, winsaveview()['leftcol'])
66087bc3f74SBram Moolenaar
66187bc3f74SBram Moolenaar  " Test for zL
66287bc3f74SBram Moolenaar  norm! 0zL
66387bc3f74SBram Moolenaar  call assert_equal(16, col('.'))
66487bc3f74SBram Moolenaar  norm! yl
66587bc3f74SBram Moolenaar  call assert_equal('p', @0)
66687bc3f74SBram Moolenaar  call assert_equal(10, winsaveview()['leftcol'])
66787bc3f74SBram Moolenaar  norm! 2zL
66887bc3f74SBram Moolenaar  call assert_equal(26, col('.'))
66987bc3f74SBram Moolenaar  norm! yl
67087bc3f74SBram Moolenaar  call assert_equal('z', @0)
67187bc3f74SBram Moolenaar  call assert_equal(15, winsaveview()['leftcol'])
67287bc3f74SBram Moolenaar
67387bc3f74SBram Moolenaar  " Test for zH
67487bc3f74SBram Moolenaar  norm! 2zH
67587bc3f74SBram Moolenaar  call assert_equal(15, col('.'))
67687bc3f74SBram Moolenaar  call assert_equal(0, winsaveview()['leftcol'])
67787bc3f74SBram Moolenaar  norm! yl
67887bc3f74SBram Moolenaar  call assert_equal('o', @0)
67987bc3f74SBram Moolenaar
68087bc3f74SBram Moolenaar  " Test for zs
68187bc3f74SBram Moolenaar  norm! $zs
68287bc3f74SBram Moolenaar  call assert_equal(26, col('.'))
68387bc3f74SBram Moolenaar  call assert_equal(20, winsaveview()['leftcol'])
68487bc3f74SBram Moolenaar  norm! yl
68587bc3f74SBram Moolenaar  call assert_equal('z', @0)
68687bc3f74SBram Moolenaar
68787bc3f74SBram Moolenaar  " Test for ze
68887bc3f74SBram Moolenaar  norm! ze
68987bc3f74SBram Moolenaar  call assert_equal(26, col('.'))
69087bc3f74SBram Moolenaar  call assert_equal(11, winsaveview()['leftcol'])
69187bc3f74SBram Moolenaar  norm! yl
69287bc3f74SBram Moolenaar  call assert_equal('z', @0)
69387bc3f74SBram Moolenaar
69487bc3f74SBram Moolenaar  " cleanup
69587bc3f74SBram Moolenaar  set wrap listchars=eol:$ sidescrolloff=0
69687bc3f74SBram Moolenaar  bw!
6972931f2a5SBram Moolenaarendfunc
69887bc3f74SBram Moolenaar
69987bc3f74SBram Moolenaarfunc! Test_normal18_z_fold()
70087bc3f74SBram Moolenaar  " basic tests for foldopen/folddelete
70187bc3f74SBram Moolenaar  if !has("folding")
70287bc3f74SBram Moolenaar    return
70387bc3f74SBram Moolenaar  endif
70487bc3f74SBram Moolenaar  call Setup_NewWindow()
70587bc3f74SBram Moolenaar  50
70687bc3f74SBram Moolenaar  setl foldenable fdm=marker foldlevel=5
70787bc3f74SBram Moolenaar
70887bc3f74SBram Moolenaar  " Test for zF
70987bc3f74SBram Moolenaar  " First fold
71087bc3f74SBram Moolenaar  norm! 4zF
71187bc3f74SBram Moolenaar  " check that folds have been created
71287bc3f74SBram Moolenaar  call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53))
71387bc3f74SBram Moolenaar
71487bc3f74SBram Moolenaar  " Test for zd
71587bc3f74SBram Moolenaar  51
71687bc3f74SBram Moolenaar  norm! 2zF
71787bc3f74SBram Moolenaar  call assert_equal(2, foldlevel('.'))
71887bc3f74SBram Moolenaar  norm! kzd
71987bc3f74SBram Moolenaar  call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53))
72087bc3f74SBram Moolenaar  norm! j
72187bc3f74SBram Moolenaar  call assert_equal(1, foldlevel('.'))
72287bc3f74SBram Moolenaar
72387bc3f74SBram Moolenaar  " Test for zD
72487bc3f74SBram Moolenaar  " also deletes partially selected folds recursively
72587bc3f74SBram Moolenaar  51
72687bc3f74SBram Moolenaar  norm! zF
72787bc3f74SBram Moolenaar  call assert_equal(2, foldlevel('.'))
72887bc3f74SBram Moolenaar  norm! kV2jzD
72987bc3f74SBram Moolenaar  call assert_equal(['50', '51', '52', '53'], getline(50,53))
73087bc3f74SBram Moolenaar
73187bc3f74SBram Moolenaar  " Test for zE
73287bc3f74SBram Moolenaar  85
73387bc3f74SBram Moolenaar  norm! 4zF
73487bc3f74SBram Moolenaar  86
73587bc3f74SBram Moolenaar  norm! 2zF
73687bc3f74SBram Moolenaar  90
73787bc3f74SBram Moolenaar  norm! 4zF
73887bc3f74SBram Moolenaar  call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93))
73987bc3f74SBram Moolenaar  norm! zE
74087bc3f74SBram Moolenaar  call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93))
74187bc3f74SBram Moolenaar
74287bc3f74SBram Moolenaar  " Test for zn
74387bc3f74SBram Moolenaar  50
74487bc3f74SBram Moolenaar  set foldlevel=0
74587bc3f74SBram Moolenaar  norm! 2zF
74687bc3f74SBram Moolenaar  norm! zn
74787bc3f74SBram Moolenaar  norm! k
74887bc3f74SBram Moolenaar  call assert_equal('49', getline('.'))
74987bc3f74SBram Moolenaar  norm! j
75087bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
75187bc3f74SBram Moolenaar  norm! j
75287bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
75387bc3f74SBram Moolenaar  norm! j
75487bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
75587bc3f74SBram Moolenaar  call assert_equal(0, &foldenable)
75687bc3f74SBram Moolenaar
75787bc3f74SBram Moolenaar  " Test for zN
75887bc3f74SBram Moolenaar  49
75987bc3f74SBram Moolenaar  norm! zN
76087bc3f74SBram Moolenaar  call assert_equal('49', getline('.'))
76187bc3f74SBram Moolenaar  norm! j
76287bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
76387bc3f74SBram Moolenaar  norm! j
76487bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
76587bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
76687bc3f74SBram Moolenaar
76787bc3f74SBram Moolenaar  " Test for zi
76887bc3f74SBram Moolenaar  norm! zi
76987bc3f74SBram Moolenaar  call assert_equal(0, &foldenable)
77087bc3f74SBram Moolenaar  norm! zi
77187bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
77287bc3f74SBram Moolenaar  norm! zi
77387bc3f74SBram Moolenaar  call assert_equal(0, &foldenable)
77487bc3f74SBram Moolenaar  norm! zi
77587bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
77687bc3f74SBram Moolenaar
77787bc3f74SBram Moolenaar  " Test for za
77887bc3f74SBram Moolenaar  50
77987bc3f74SBram Moolenaar  norm! za
78087bc3f74SBram Moolenaar  norm! k
78187bc3f74SBram Moolenaar  call assert_equal('49', getline('.'))
78287bc3f74SBram Moolenaar  norm! j
78387bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
78487bc3f74SBram Moolenaar  norm! j
78587bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
78687bc3f74SBram Moolenaar  norm! j
78787bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
78887bc3f74SBram Moolenaar  50
78987bc3f74SBram Moolenaar  norm! za
79087bc3f74SBram Moolenaar  norm! k
79187bc3f74SBram Moolenaar  call assert_equal('49', getline('.'))
79287bc3f74SBram Moolenaar  norm! j
79387bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
79487bc3f74SBram Moolenaar  norm! j
79587bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
79687bc3f74SBram Moolenaar
79787bc3f74SBram Moolenaar  49
79887bc3f74SBram Moolenaar  norm! 5zF
79987bc3f74SBram Moolenaar  norm! k
80087bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
80187bc3f74SBram Moolenaar  norm! j
80287bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
80387bc3f74SBram Moolenaar  norm! j
80487bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
80587bc3f74SBram Moolenaar  49
80687bc3f74SBram Moolenaar  norm! za
80787bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
80887bc3f74SBram Moolenaar  norm! j
80987bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
81087bc3f74SBram Moolenaar  norm! j
81187bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
81287bc3f74SBram Moolenaar  set nofoldenable
81387bc3f74SBram Moolenaar  " close fold and set foldenable
81487bc3f74SBram Moolenaar  norm! za
81587bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
81687bc3f74SBram Moolenaar
81787bc3f74SBram Moolenaar  50
81887bc3f74SBram Moolenaar  " have to use {count}za to open all folds and make the cursor visible
81987bc3f74SBram Moolenaar  norm! 2za
82087bc3f74SBram Moolenaar  norm! 2k
82187bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
82287bc3f74SBram Moolenaar  norm! j
82387bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
82487bc3f74SBram Moolenaar  norm! j
82587bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
82687bc3f74SBram Moolenaar  norm! j
82787bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
82887bc3f74SBram Moolenaar  norm! j
82987bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
83087bc3f74SBram Moolenaar
83187bc3f74SBram Moolenaar  " Test for zA
83287bc3f74SBram Moolenaar  49
83387bc3f74SBram Moolenaar  set foldlevel=0
83487bc3f74SBram Moolenaar  50
83587bc3f74SBram Moolenaar  norm! zA
83687bc3f74SBram Moolenaar  norm! 2k
83787bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
83887bc3f74SBram Moolenaar  norm! j
83987bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
84087bc3f74SBram Moolenaar  norm! j
84187bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
84287bc3f74SBram Moolenaar  norm! j
84387bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
84487bc3f74SBram Moolenaar  norm! j
84587bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
84687bc3f74SBram Moolenaar
847395b6babSBram Moolenaar  " zA on a opened fold when foldenable is not set
84887bc3f74SBram Moolenaar  50
84987bc3f74SBram Moolenaar  set nofoldenable
85087bc3f74SBram Moolenaar  norm! zA
85187bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
85287bc3f74SBram Moolenaar  norm! k
85387bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
85487bc3f74SBram Moolenaar  norm! j
85587bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
85687bc3f74SBram Moolenaar  norm! j
85787bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
85887bc3f74SBram Moolenaar
85987bc3f74SBram Moolenaar  " Test for zc
86087bc3f74SBram Moolenaar  norm! zE
86187bc3f74SBram Moolenaar  50
86287bc3f74SBram Moolenaar  norm! 2zF
86387bc3f74SBram Moolenaar  49
86487bc3f74SBram Moolenaar  norm! 5zF
86587bc3f74SBram Moolenaar  set nofoldenable
86687bc3f74SBram Moolenaar  50
86787bc3f74SBram Moolenaar  " There most likely is a bug somewhere:
86887bc3f74SBram Moolenaar  " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ
86987bc3f74SBram Moolenaar  " TODO: Should this only close the inner most fold or both folds?
87087bc3f74SBram Moolenaar  norm! zc
87187bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
87287bc3f74SBram Moolenaar  norm! k
87387bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
87487bc3f74SBram Moolenaar  norm! j
87587bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
87687bc3f74SBram Moolenaar  norm! j
87787bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
87887bc3f74SBram Moolenaar  set nofoldenable
87987bc3f74SBram Moolenaar  50
88087bc3f74SBram Moolenaar  norm! Vjzc
88187bc3f74SBram Moolenaar  norm! k
88287bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
88387bc3f74SBram Moolenaar  norm! j
88487bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
88587bc3f74SBram Moolenaar  norm! j
88687bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
88787bc3f74SBram Moolenaar
88887bc3f74SBram Moolenaar  " Test for zC
88987bc3f74SBram Moolenaar  set nofoldenable
89087bc3f74SBram Moolenaar  50
89187bc3f74SBram Moolenaar  norm! zCk
89287bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
89387bc3f74SBram Moolenaar  norm! j
89487bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
89587bc3f74SBram Moolenaar  norm! j
89687bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
89787bc3f74SBram Moolenaar
89887bc3f74SBram Moolenaar  " Test for zx
89987bc3f74SBram Moolenaar  " 1) close folds at line 49-54
90087bc3f74SBram Moolenaar  set nofoldenable
90187bc3f74SBram Moolenaar  48
90287bc3f74SBram Moolenaar  norm! zx
90387bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
90487bc3f74SBram Moolenaar  norm! j
90587bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
90687bc3f74SBram Moolenaar  norm! j
90787bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
90887bc3f74SBram Moolenaar
909395b6babSBram Moolenaar  " 2) do not close fold under cursor
91087bc3f74SBram Moolenaar  51
91187bc3f74SBram Moolenaar  set nofoldenable
91287bc3f74SBram Moolenaar  norm! zx
91387bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
91487bc3f74SBram Moolenaar  norm! 3k
91587bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
91687bc3f74SBram Moolenaar  norm! j
91787bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
91887bc3f74SBram Moolenaar  norm! j
91987bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
92087bc3f74SBram Moolenaar  norm! j
92187bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
92287bc3f74SBram Moolenaar  norm! j
92387bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
92487bc3f74SBram Moolenaar  norm! j
92587bc3f74SBram Moolenaar  call assert_equal('53', getline('.'))
92687bc3f74SBram Moolenaar  norm! j
92787bc3f74SBram Moolenaar  call assert_equal('54/*}}}*/', getline('.'))
92887bc3f74SBram Moolenaar  norm! j
92987bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
93087bc3f74SBram Moolenaar
93187bc3f74SBram Moolenaar  " 3) close one level of folds
93287bc3f74SBram Moolenaar  48
93387bc3f74SBram Moolenaar  set nofoldenable
93487bc3f74SBram Moolenaar  set foldlevel=1
93587bc3f74SBram Moolenaar  norm! zx
93687bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
93787bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
93887bc3f74SBram Moolenaar  norm! j
93987bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
94087bc3f74SBram Moolenaar  norm! j
94187bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
94287bc3f74SBram Moolenaar  norm! j
94387bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
94487bc3f74SBram Moolenaar  norm! j
94587bc3f74SBram Moolenaar  call assert_equal('53', getline('.'))
94687bc3f74SBram Moolenaar  norm! j
94787bc3f74SBram Moolenaar  call assert_equal('54/*}}}*/', getline('.'))
94887bc3f74SBram Moolenaar  norm! j
94987bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
95087bc3f74SBram Moolenaar
95187bc3f74SBram Moolenaar  " Test for zX
95287bc3f74SBram Moolenaar  " Close all folds
95387bc3f74SBram Moolenaar  set foldlevel=0 nofoldenable
95487bc3f74SBram Moolenaar  50
95587bc3f74SBram Moolenaar  norm! zX
95687bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
95787bc3f74SBram Moolenaar  norm! k
95887bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
95987bc3f74SBram Moolenaar  norm! j
96087bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
96187bc3f74SBram Moolenaar  norm! j
96287bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
96387bc3f74SBram Moolenaar
96487bc3f74SBram Moolenaar  " Test for zm
96587bc3f74SBram Moolenaar  50
96687bc3f74SBram Moolenaar  set nofoldenable foldlevel=2
96787bc3f74SBram Moolenaar  norm! zm
96887bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
96987bc3f74SBram Moolenaar  call assert_equal(1, &foldlevel)
97087bc3f74SBram Moolenaar  norm! zm
97187bc3f74SBram Moolenaar  call assert_equal(0, &foldlevel)
97287bc3f74SBram Moolenaar  norm! zm
97387bc3f74SBram Moolenaar  call assert_equal(0, &foldlevel)
97487bc3f74SBram Moolenaar  norm! k
97587bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
97687bc3f74SBram Moolenaar  norm! j
97787bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
97887bc3f74SBram Moolenaar  norm! j
97987bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
98087bc3f74SBram Moolenaar
98187bc3f74SBram Moolenaar  " Test for zM
98287bc3f74SBram Moolenaar  48
98387bc3f74SBram Moolenaar  set nofoldenable foldlevel=99
98487bc3f74SBram Moolenaar  norm! zM
98587bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
98687bc3f74SBram Moolenaar  call assert_equal(0, &foldlevel)
98787bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
98887bc3f74SBram Moolenaar  norm! j
98987bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
99087bc3f74SBram Moolenaar  norm! j
99187bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
99287bc3f74SBram Moolenaar
99387bc3f74SBram Moolenaar  " Test for zr
99487bc3f74SBram Moolenaar  48
99587bc3f74SBram Moolenaar  set nofoldenable foldlevel=0
99687bc3f74SBram Moolenaar  norm! zr
99787bc3f74SBram Moolenaar  call assert_equal(0, &foldenable)
99887bc3f74SBram Moolenaar  call assert_equal(1, &foldlevel)
99987bc3f74SBram Moolenaar  set foldlevel=0 foldenable
100087bc3f74SBram Moolenaar  norm! zr
100187bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
100287bc3f74SBram Moolenaar  call assert_equal(1, &foldlevel)
100387bc3f74SBram Moolenaar  norm! zr
100487bc3f74SBram Moolenaar  call assert_equal(2, &foldlevel)
100587bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
100687bc3f74SBram Moolenaar  norm! j
100787bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
100887bc3f74SBram Moolenaar  norm! j
100987bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
101087bc3f74SBram Moolenaar  norm! j
101187bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
101287bc3f74SBram Moolenaar  norm! j
101387bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
101487bc3f74SBram Moolenaar
101587bc3f74SBram Moolenaar  " Test for zR
101687bc3f74SBram Moolenaar  48
101787bc3f74SBram Moolenaar  set nofoldenable foldlevel=0
101887bc3f74SBram Moolenaar  norm! zR
101987bc3f74SBram Moolenaar  call assert_equal(0, &foldenable)
102087bc3f74SBram Moolenaar  call assert_equal(2, &foldlevel)
102187bc3f74SBram Moolenaar  set foldenable foldlevel=0
102287bc3f74SBram Moolenaar  norm! zR
102387bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
102487bc3f74SBram Moolenaar  call assert_equal(2, &foldlevel)
102587bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
102687bc3f74SBram Moolenaar  norm! j
102787bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
102887bc3f74SBram Moolenaar  norm! j
102987bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
103087bc3f74SBram Moolenaar  norm! j
103187bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
103287bc3f74SBram Moolenaar  norm! j
103387bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
103487bc3f74SBram Moolenaar  call append(50, ['a /*{{{*/', 'b /*}}}*/'])
103587bc3f74SBram Moolenaar  48
103687bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
103787bc3f74SBram Moolenaar  norm! j
103887bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
103987bc3f74SBram Moolenaar  norm! j
104087bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
104187bc3f74SBram Moolenaar  norm! j
104287bc3f74SBram Moolenaar  call assert_equal('a /*{{{*/', getline('.'))
104387bc3f74SBram Moolenaar  norm! j
104487bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
104587bc3f74SBram Moolenaar  norm! j
104687bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
104787bc3f74SBram Moolenaar  48
104887bc3f74SBram Moolenaar  norm! zR
104987bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
105087bc3f74SBram Moolenaar  call assert_equal(3, &foldlevel)
105187bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
105287bc3f74SBram Moolenaar  norm! j
105387bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
105487bc3f74SBram Moolenaar  norm! j
105587bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
105687bc3f74SBram Moolenaar  norm! j
105787bc3f74SBram Moolenaar  call assert_equal('a /*{{{*/', getline('.'))
105887bc3f74SBram Moolenaar  norm! j
105987bc3f74SBram Moolenaar  call assert_equal('b /*}}}*/', getline('.'))
106087bc3f74SBram Moolenaar  norm! j
106187bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
106287bc3f74SBram Moolenaar  norm! j
106387bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
106487bc3f74SBram Moolenaar
106587bc3f74SBram Moolenaar  " clean up
106687bc3f74SBram Moolenaar  setl nofoldenable fdm=marker foldlevel=0
106787bc3f74SBram Moolenaar  bw!
10682931f2a5SBram Moolenaarendfunc
106987bc3f74SBram Moolenaar
107087bc3f74SBram Moolenaarfunc! Test_normal19_z_spell()
107187bc3f74SBram Moolenaar  if !has("spell") || !has('syntax')
107287bc3f74SBram Moolenaar    return
107387bc3f74SBram Moolenaar  endif
107487bc3f74SBram Moolenaar  new
107587bc3f74SBram Moolenaar  call append(0, ['1 good', '2 goood', '3 goood'])
107687bc3f74SBram Moolenaar  set spell spellfile=./Xspellfile.add spelllang=en
107787bc3f74SBram Moolenaar  let oldlang=v:lang
107887bc3f74SBram Moolenaar  lang C
107987bc3f74SBram Moolenaar
108087bc3f74SBram Moolenaar  " Test for zg
108187bc3f74SBram Moolenaar  1
108287bc3f74SBram Moolenaar  norm! ]s
108387bc3f74SBram Moolenaar  call assert_equal('2 goood', getline('.'))
108487bc3f74SBram Moolenaar  norm! zg
108587bc3f74SBram Moolenaar  1
108687bc3f74SBram Moolenaar  let a=execute('unsilent :norm! ]s')
108787bc3f74SBram Moolenaar  call assert_equal('1 good', getline('.'))
108887bc3f74SBram Moolenaar  call assert_equal('search hit BOTTOM, continuing at TOP', a[1:])
108987bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
109087bc3f74SBram Moolenaar  call assert_equal('goood', cnt[0])
109187bc3f74SBram Moolenaar
109287bc3f74SBram Moolenaar  " Test for zw
109387bc3f74SBram Moolenaar  2
109487bc3f74SBram Moolenaar  norm! $zw
109587bc3f74SBram Moolenaar  1
109687bc3f74SBram Moolenaar  norm! ]s
109787bc3f74SBram Moolenaar  call assert_equal('2 goood', getline('.'))
109887bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
109987bc3f74SBram Moolenaar  call assert_equal('#oood', cnt[0])
110087bc3f74SBram Moolenaar  call assert_equal('goood/!', cnt[1])
110187bc3f74SBram Moolenaar
110287bc3f74SBram Moolenaar  " Test for zg in visual mode
110387bc3f74SBram Moolenaar  let a=execute('unsilent :norm! V$zg')
110487bc3f74SBram Moolenaar  call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
110587bc3f74SBram Moolenaar  1
110687bc3f74SBram Moolenaar  norm! ]s
110787bc3f74SBram Moolenaar  call assert_equal('3 goood', getline('.'))
110887bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
110987bc3f74SBram Moolenaar  call assert_equal('2 goood', cnt[2])
111087bc3f74SBram Moolenaar  " Remove "2 good" from spellfile
111187bc3f74SBram Moolenaar  2
111287bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zw')
111387bc3f74SBram Moolenaar  call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
111487bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
111587bc3f74SBram Moolenaar  call assert_equal('2 goood/!', cnt[3])
111687bc3f74SBram Moolenaar
111787bc3f74SBram Moolenaar  " Test for zG
111887bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zG')
111987bc3f74SBram Moolenaar  call assert_match("Word '2 goood' added to .*", a)
112087bc3f74SBram Moolenaar  let fname=matchstr(a, 'to\s\+\zs\f\+$')
112187bc3f74SBram Moolenaar  let cnt=readfile(fname)
112287bc3f74SBram Moolenaar  call assert_equal('2 goood', cnt[0])
112387bc3f74SBram Moolenaar
112487bc3f74SBram Moolenaar  " Test for zW
112587bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zW')
112687bc3f74SBram Moolenaar  call assert_match("Word '2 goood' added to .*", a)
112787bc3f74SBram Moolenaar  let cnt=readfile(fname)
112887bc3f74SBram Moolenaar  call assert_equal('# goood', cnt[0])
112987bc3f74SBram Moolenaar  call assert_equal('2 goood/!', cnt[1])
113087bc3f74SBram Moolenaar
113187bc3f74SBram Moolenaar  " Test for zuW
113287bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zuW')
113387bc3f74SBram Moolenaar  call assert_match("Word '2 goood' removed from .*", a)
113487bc3f74SBram Moolenaar  let cnt=readfile(fname)
113587bc3f74SBram Moolenaar  call assert_equal('# goood', cnt[0])
113687bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[1])
113787bc3f74SBram Moolenaar
113887bc3f74SBram Moolenaar  " Test for zuG
113987bc3f74SBram Moolenaar  let a=execute('unsilent norm! $zG')
114087bc3f74SBram Moolenaar  call assert_match("Word 'goood' added to .*", a)
114187bc3f74SBram Moolenaar  let cnt=readfile(fname)
114287bc3f74SBram Moolenaar  call assert_equal('# goood', cnt[0])
114387bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[1])
114487bc3f74SBram Moolenaar  call assert_equal('goood', cnt[2])
114587bc3f74SBram Moolenaar  let a=execute('unsilent norm! $zuG')
114687bc3f74SBram Moolenaar  let cnt=readfile(fname)
114787bc3f74SBram Moolenaar  call assert_match("Word 'goood' removed from .*", a)
114887bc3f74SBram Moolenaar  call assert_equal('# goood', cnt[0])
114987bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[1])
115087bc3f74SBram Moolenaar  call assert_equal('#oood', cnt[2])
115187bc3f74SBram Moolenaar  " word not found in wordlist
115287bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zuG')
115387bc3f74SBram Moolenaar  let cnt=readfile(fname)
115487bc3f74SBram Moolenaar  call assert_match("", a)
115587bc3f74SBram Moolenaar  call assert_equal('# goood', cnt[0])
115687bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[1])
115787bc3f74SBram Moolenaar  call assert_equal('#oood', cnt[2])
115887bc3f74SBram Moolenaar
115987bc3f74SBram Moolenaar  " Test for zug
116087bc3f74SBram Moolenaar  call delete('./Xspellfile.add')
116187bc3f74SBram Moolenaar  2
116287bc3f74SBram Moolenaar  let a=execute('unsilent norm! $zg')
116387bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
116487bc3f74SBram Moolenaar  call assert_equal('goood', cnt[0])
116587bc3f74SBram Moolenaar  let a=execute('unsilent norm! $zug')
116687bc3f74SBram Moolenaar  call assert_match("Word 'goood' removed from \./Xspellfile.add", a)
116787bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
116887bc3f74SBram Moolenaar  call assert_equal('#oood', cnt[0])
116987bc3f74SBram Moolenaar  " word not in wordlist
117087bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zug')
117187bc3f74SBram Moolenaar  call assert_match('', a)
117287bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
117387bc3f74SBram Moolenaar  call assert_equal('#oood', cnt[0])
117487bc3f74SBram Moolenaar
117587bc3f74SBram Moolenaar  " Test for zuw
117687bc3f74SBram Moolenaar  call delete('./Xspellfile.add')
117787bc3f74SBram Moolenaar  2
117887bc3f74SBram Moolenaar  let a=execute('unsilent norm! Vzw')
117987bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
118087bc3f74SBram Moolenaar  call assert_equal('2 goood/!', cnt[0])
118187bc3f74SBram Moolenaar  let a=execute('unsilent norm! Vzuw')
118287bc3f74SBram Moolenaar  call assert_match("Word '2 goood' removed from \./Xspellfile.add", a)
118387bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
118487bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[0])
118587bc3f74SBram Moolenaar  " word not in wordlist
118687bc3f74SBram Moolenaar  let a=execute('unsilent norm! $zug')
118787bc3f74SBram Moolenaar  call assert_match('', a)
118887bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
118987bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[0])
119087bc3f74SBram Moolenaar
119187bc3f74SBram Moolenaar  " add second entry to spellfile setting
119287bc3f74SBram Moolenaar  set spellfile=./Xspellfile.add,./Xspellfile2.add
119387bc3f74SBram Moolenaar  call delete('./Xspellfile.add')
119487bc3f74SBram Moolenaar  2
119587bc3f74SBram Moolenaar  let a=execute('unsilent norm! $2zg')
119687bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile2.add')
119787bc3f74SBram Moolenaar  call assert_match("Word 'goood' added to ./Xspellfile2.add", a)
119887bc3f74SBram Moolenaar  call assert_equal('goood', cnt[0])
119987bc3f74SBram Moolenaar
120087bc3f74SBram Moolenaar  " clean up
120187bc3f74SBram Moolenaar  exe "lang" oldlang
120287bc3f74SBram Moolenaar  call delete("./Xspellfile.add")
120387bc3f74SBram Moolenaar  call delete("./Xspellfile2.add")
1204df0db16cSBram Moolenaar  call delete("./Xspellfile.add.spl")
1205df0db16cSBram Moolenaar  call delete("./Xspellfile2.add.spl")
120687bc3f74SBram Moolenaar
120787bc3f74SBram Moolenaar  " zux -> no-op
120887bc3f74SBram Moolenaar  2
120987bc3f74SBram Moolenaar  norm! $zux
121087bc3f74SBram Moolenaar  call assert_equal([], glob('Xspellfile.add',0,1))
121187bc3f74SBram Moolenaar  call assert_equal([], glob('Xspellfile2.add',0,1))
121287bc3f74SBram Moolenaar
121387bc3f74SBram Moolenaar  set spellfile=
121487bc3f74SBram Moolenaar  bw!
12152931f2a5SBram Moolenaarendfunc
121687bc3f74SBram Moolenaar
121787bc3f74SBram Moolenaarfunc! Test_normal20_exmode()
12180913a108SBram Moolenaar  if !has("unix")
12190913a108SBram Moolenaar    " Reading from redirected file doesn't work on MS-Windows
122087bc3f74SBram Moolenaar    return
122187bc3f74SBram Moolenaar  endif
122287bc3f74SBram Moolenaar  call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript')
122387bc3f74SBram Moolenaar  call writefile(['1', '2'], 'Xfile')
122487bc3f74SBram Moolenaar  call system(v:progpath .' -e -s < Xscript Xfile')
122587bc3f74SBram Moolenaar  let a=readfile('Xfile2')
122687bc3f74SBram Moolenaar  call assert_equal(['1', 'foo', 'bar', '2'], a)
122787bc3f74SBram Moolenaar
122887bc3f74SBram Moolenaar  " clean up
122987bc3f74SBram Moolenaar  for file in ['Xfile', 'Xfile2', 'Xscript']
123087bc3f74SBram Moolenaar    call delete(file)
123187bc3f74SBram Moolenaar  endfor
123287bc3f74SBram Moolenaar  bw!
12332931f2a5SBram Moolenaarendfunc
123487bc3f74SBram Moolenaar
123587bc3f74SBram Moolenaarfunc! Test_normal21_nv_hat()
123687bc3f74SBram Moolenaar  set hidden
12372931f2a5SBram Moolenaar  new
12382931f2a5SBram Moolenaar  " to many buffers opened already, will not work
12392931f2a5SBram Moolenaar  "call assert_fails(":b#", 'E23')
12402931f2a5SBram Moolenaar  "call assert_equal('', @#)
124187bc3f74SBram Moolenaar  e Xfoobar
124287bc3f74SBram Moolenaar  e Xfile2
124387bc3f74SBram Moolenaar  call feedkeys("\<c-^>", 't')
124487bc3f74SBram Moolenaar  call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t'))
124587bc3f74SBram Moolenaar  call feedkeys("f\<c-^>", 't')
124687bc3f74SBram Moolenaar  call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t'))
124787bc3f74SBram Moolenaar  " clean up
124887bc3f74SBram Moolenaar  set nohidden
124987bc3f74SBram Moolenaar  bw!
12502931f2a5SBram Moolenaarendfunc
125187bc3f74SBram Moolenaar
125287bc3f74SBram Moolenaarfunc! Test_normal22_zet()
125387bc3f74SBram Moolenaar  " Test for ZZ
12540913a108SBram Moolenaar  " let shell = &shell
12550913a108SBram Moolenaar  " let &shell = 'sh'
125687bc3f74SBram Moolenaar  call writefile(['1', '2'], 'Xfile')
125787bc3f74SBram Moolenaar  let args = ' -u NONE -N -U NONE -i NONE --noplugins -X --not-a-term'
125887bc3f74SBram Moolenaar  call system(v:progpath . args . ' -c "%d" -c ":norm! ZZ" Xfile')
125987bc3f74SBram Moolenaar  let a = readfile('Xfile')
126087bc3f74SBram Moolenaar  call assert_equal([], a)
126187bc3f74SBram Moolenaar  " Test for ZQ
126287bc3f74SBram Moolenaar  call writefile(['1', '2'], 'Xfile')
126387bc3f74SBram Moolenaar  call system(v:progpath . args . ' -c "%d" -c ":norm! ZQ" Xfile')
126487bc3f74SBram Moolenaar  let a = readfile('Xfile')
126587bc3f74SBram Moolenaar  call assert_equal(['1', '2'], a)
126687bc3f74SBram Moolenaar
126787bc3f74SBram Moolenaar  " clean up
126887bc3f74SBram Moolenaar  for file in ['Xfile']
126987bc3f74SBram Moolenaar    call delete(file)
127087bc3f74SBram Moolenaar  endfor
12710913a108SBram Moolenaar  " let &shell = shell
12722931f2a5SBram Moolenaarendfunc
127387bc3f74SBram Moolenaar
127487bc3f74SBram Moolenaarfunc! Test_normal23_K()
127587bc3f74SBram Moolenaar  " Test for K command
127687bc3f74SBram Moolenaar  new
1277426f3754SBram Moolenaar  call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd'])
127887bc3f74SBram Moolenaar  let k = &keywordprg
127987bc3f74SBram Moolenaar  set keywordprg=:help
128087bc3f74SBram Moolenaar  1
128187bc3f74SBram Moolenaar  norm! VK
128287bc3f74SBram Moolenaar  call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
128387bc3f74SBram Moolenaar  call assert_equal('help', &ft)
128487bc3f74SBram Moolenaar  call assert_match('\*version8.txt\*', getline('.'))
128587bc3f74SBram Moolenaar  helpclose
128687bc3f74SBram Moolenaar  norm! 0K
128787bc3f74SBram Moolenaar  call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
128887bc3f74SBram Moolenaar  call assert_equal('help', &ft)
128987bc3f74SBram Moolenaar  call assert_match('\*version8\.0\*', getline('.'))
129087bc3f74SBram Moolenaar  helpclose
129187bc3f74SBram Moolenaar
1292426f3754SBram Moolenaar  set keywordprg=:new
1293426f3754SBram Moolenaar  set iskeyword+=%
1294426f3754SBram Moolenaar  set iskeyword+=\|
1295426f3754SBram Moolenaar  2
1296426f3754SBram Moolenaar  norm! K
1297426f3754SBram Moolenaar  call assert_equal('man', fnamemodify(bufname('%'), ':t'))
1298426f3754SBram Moolenaar  bwipe!
1299426f3754SBram Moolenaar  3
1300426f3754SBram Moolenaar  norm! K
1301426f3754SBram Moolenaar  call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t'))
1302426f3754SBram Moolenaar  bwipe!
1303eb828d01SBram Moolenaar  if !has('win32')
1304426f3754SBram Moolenaar    4
1305426f3754SBram Moolenaar    norm! K
1306426f3754SBram Moolenaar    call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t'))
1307426f3754SBram Moolenaar    bwipe!
1308eb828d01SBram Moolenaar  endif
1309426f3754SBram Moolenaar  set iskeyword-=%
1310426f3754SBram Moolenaar  set iskeyword-=\|
1311426f3754SBram Moolenaar
13120913a108SBram Moolenaar  " Only expect "man" to work on Unix
13130913a108SBram Moolenaar  if !has("unix")
131487bc3f74SBram Moolenaar    let &keywordprg = k
131587bc3f74SBram Moolenaar    bw!
131687bc3f74SBram Moolenaar    return
131787bc3f74SBram Moolenaar  endif
131887bc3f74SBram Moolenaar  set keywordprg=man\ --pager=cat
131987bc3f74SBram Moolenaar  " Test for using man
132087bc3f74SBram Moolenaar  2
132187bc3f74SBram Moolenaar  let a = execute('unsilent norm! K')
132287bc3f74SBram Moolenaar  call assert_match("man --pager=cat 'man'", a)
132387bc3f74SBram Moolenaar
132487bc3f74SBram Moolenaar  " clean up
132587bc3f74SBram Moolenaar  let &keywordprg = k
132687bc3f74SBram Moolenaar  bw!
13272931f2a5SBram Moolenaarendfunc
132887bc3f74SBram Moolenaar
132987bc3f74SBram Moolenaarfunc! Test_normal24_rot13()
133087bc3f74SBram Moolenaar  " This test uses multi byte characters
133187bc3f74SBram Moolenaar  if !has("multi_byte")
133287bc3f74SBram Moolenaar    return
133387bc3f74SBram Moolenaar  endif
133487bc3f74SBram Moolenaar  " Testing for g?? g?g?
133587bc3f74SBram Moolenaar  new
133687bc3f74SBram Moolenaar  call append(0, 'abcdefghijklmnopqrstuvwxyzäüö')
133787bc3f74SBram Moolenaar  1
133887bc3f74SBram Moolenaar  norm! g??
133987bc3f74SBram Moolenaar  call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.'))
134087bc3f74SBram Moolenaar  norm! g?g?
134187bc3f74SBram Moolenaar  call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.'))
134287bc3f74SBram Moolenaar
134387bc3f74SBram Moolenaar  " clean up
134487bc3f74SBram Moolenaar  bw!
13452931f2a5SBram Moolenaarendfunc
134687bc3f74SBram Moolenaar
134787bc3f74SBram Moolenaarfunc! Test_normal25_tag()
134887bc3f74SBram Moolenaar  " Testing for CTRL-] g CTRL-] g]
134987bc3f74SBram Moolenaar  " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-]
135087bc3f74SBram Moolenaar  h
135187bc3f74SBram Moolenaar  " Test for CTRL-]
135287bc3f74SBram Moolenaar  call search('\<x\>$')
135387bc3f74SBram Moolenaar  exe "norm! \<c-]>"
135487bc3f74SBram Moolenaar  call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
135587bc3f74SBram Moolenaar  norm! yiW
135687bc3f74SBram Moolenaar  call assert_equal("*x*", @0)
135787bc3f74SBram Moolenaar  exe ":norm \<c-o>"
135887bc3f74SBram Moolenaar
135987bc3f74SBram Moolenaar  " Test for g_CTRL-]
136087bc3f74SBram Moolenaar  call search('\<v_u\>$')
136187bc3f74SBram Moolenaar  exe "norm! g\<c-]>"
136287bc3f74SBram Moolenaar  call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
136387bc3f74SBram Moolenaar  norm! yiW
136487bc3f74SBram Moolenaar  call assert_equal("*v_u*", @0)
136587bc3f74SBram Moolenaar  exe ":norm \<c-o>"
136687bc3f74SBram Moolenaar
136787bc3f74SBram Moolenaar  " Test for g]
136887bc3f74SBram Moolenaar  call search('\<i_<Esc>$')
136987bc3f74SBram Moolenaar  let a = execute(":norm! g]")
137087bc3f74SBram Moolenaar  call assert_match('i_<Esc>.*insert.txt', a)
137187bc3f74SBram Moolenaar
137287bc3f74SBram Moolenaar  if !empty(exepath('cscope')) && has('cscope')
137387bc3f74SBram Moolenaar    " setting cscopetag changes how g] works
137487bc3f74SBram Moolenaar    set cst
137587bc3f74SBram Moolenaar    exe "norm! g]"
137687bc3f74SBram Moolenaar    call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
137787bc3f74SBram Moolenaar    norm! yiW
137887bc3f74SBram Moolenaar    call assert_equal("*i_<Esc>*", @0)
137987bc3f74SBram Moolenaar    exe ":norm \<c-o>"
138087bc3f74SBram Moolenaar    " Test for CTRL-W g]
138187bc3f74SBram Moolenaar    exe "norm! \<C-W>g]"
138287bc3f74SBram Moolenaar    call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
138387bc3f74SBram Moolenaar    norm! yiW
138487bc3f74SBram Moolenaar    call assert_equal("*i_<Esc>*", @0)
138587bc3f74SBram Moolenaar    call assert_equal(3, winnr('$'))
138687bc3f74SBram Moolenaar    helpclose
138787bc3f74SBram Moolenaar    set nocst
138887bc3f74SBram Moolenaar  endif
138987bc3f74SBram Moolenaar
139087bc3f74SBram Moolenaar  " Test for CTRL-W g]
139187bc3f74SBram Moolenaar  let a = execute("norm! \<C-W>g]")
139287bc3f74SBram Moolenaar  call assert_match('i_<Esc>.*insert.txt', a)
139387bc3f74SBram Moolenaar
139487bc3f74SBram Moolenaar  " Test for CTRL-W CTRL-]
139587bc3f74SBram Moolenaar  exe "norm! \<C-W>\<C-]>"
139687bc3f74SBram Moolenaar  call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
139787bc3f74SBram Moolenaar  norm! yiW
139887bc3f74SBram Moolenaar  call assert_equal("*i_<Esc>*", @0)
139987bc3f74SBram Moolenaar  call assert_equal(3, winnr('$'))
140087bc3f74SBram Moolenaar  helpclose
140187bc3f74SBram Moolenaar
140287bc3f74SBram Moolenaar  " Test for CTRL-W g CTRL-]
140387bc3f74SBram Moolenaar  exe "norm! \<C-W>g\<C-]>"
140487bc3f74SBram Moolenaar  call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
140587bc3f74SBram Moolenaar  norm! yiW
140687bc3f74SBram Moolenaar  call assert_equal("*i_<Esc>*", @0)
140787bc3f74SBram Moolenaar  call assert_equal(3, winnr('$'))
140887bc3f74SBram Moolenaar  helpclose
140987bc3f74SBram Moolenaar
141087bc3f74SBram Moolenaar  " clean up
141187bc3f74SBram Moolenaar  helpclose
14122931f2a5SBram Moolenaarendfunc
141387bc3f74SBram Moolenaar
141487bc3f74SBram Moolenaarfunc! Test_normal26_put()
141587bc3f74SBram Moolenaar  " Test for ]p ]P [p and [P
141687bc3f74SBram Moolenaar  new
141787bc3f74SBram Moolenaar  call append(0, ['while read LINE', 'do', '  ((count++))', '  if [ $? -ne 0 ]; then', "    echo 'Error writing file'", '  fi', 'done'])
141887bc3f74SBram Moolenaar  1
141987bc3f74SBram Moolenaar  /Error/y a
142087bc3f74SBram Moolenaar  2
142187bc3f74SBram Moolenaar  norm! "a]pj"a[p
142287bc3f74SBram Moolenaar  call assert_equal(['do', "echo 'Error writing file'", "  echo 'Error writing file'", '  ((count++))'], getline(2,5))
142387bc3f74SBram Moolenaar  1
142487bc3f74SBram Moolenaar  /^\s\{4}/
142587bc3f74SBram Moolenaar  exe "norm!  \"a]P3Eldt'"
142687bc3f74SBram Moolenaar  exe "norm! j\"a[P2Eldt'"
142787bc3f74SBram Moolenaar  call assert_equal(['  if [ $? -ne 0 ]; then', "    echo 'Error writing'", "    echo 'Error'", "    echo 'Error writing file'", '  fi'], getline(6,10))
142887bc3f74SBram Moolenaar
142987bc3f74SBram Moolenaar  " clean up
143087bc3f74SBram Moolenaar  bw!
14312931f2a5SBram Moolenaarendfunc
143287bc3f74SBram Moolenaar
143387bc3f74SBram Moolenaarfunc! Test_normal27_bracket()
143487bc3f74SBram Moolenaar  " Test for [' [` ]' ]`
143587bc3f74SBram Moolenaar  call Setup_NewWindow()
143687bc3f74SBram Moolenaar  1,21s/.\+/  &   b/
143787bc3f74SBram Moolenaar  1
143887bc3f74SBram Moolenaar  norm! $ma
143987bc3f74SBram Moolenaar  5
144087bc3f74SBram Moolenaar  norm! $mb
144187bc3f74SBram Moolenaar  10
144287bc3f74SBram Moolenaar  norm! $mc
144387bc3f74SBram Moolenaar  15
144487bc3f74SBram Moolenaar  norm! $md
144587bc3f74SBram Moolenaar  20
144687bc3f74SBram Moolenaar  norm! $me
144787bc3f74SBram Moolenaar
144887bc3f74SBram Moolenaar  " Test for ['
144987bc3f74SBram Moolenaar  9
145087bc3f74SBram Moolenaar  norm! 2['
145187bc3f74SBram Moolenaar  call assert_equal('  1   b', getline('.'))
145287bc3f74SBram Moolenaar  call assert_equal(1, line('.'))
145387bc3f74SBram Moolenaar  call assert_equal(3, col('.'))
145487bc3f74SBram Moolenaar
145587bc3f74SBram Moolenaar  " Test for ]'
145687bc3f74SBram Moolenaar  norm! ]'
145787bc3f74SBram Moolenaar  call assert_equal('  5   b', getline('.'))
145887bc3f74SBram Moolenaar  call assert_equal(5, line('.'))
145987bc3f74SBram Moolenaar  call assert_equal(3, col('.'))
146087bc3f74SBram Moolenaar
146187bc3f74SBram Moolenaar  " No mark after line 21, cursor moves to first non blank on current line
146287bc3f74SBram Moolenaar  21
146387bc3f74SBram Moolenaar  norm! $]'
146487bc3f74SBram Moolenaar  call assert_equal('  21   b', getline('.'))
146587bc3f74SBram Moolenaar  call assert_equal(21, line('.'))
146687bc3f74SBram Moolenaar  call assert_equal(3, col('.'))
146787bc3f74SBram Moolenaar
146887bc3f74SBram Moolenaar  " Test for [`
146987bc3f74SBram Moolenaar  norm! 2[`
147087bc3f74SBram Moolenaar  call assert_equal('  15   b', getline('.'))
147187bc3f74SBram Moolenaar  call assert_equal(15, line('.'))
147287bc3f74SBram Moolenaar  call assert_equal(8, col('.'))
147387bc3f74SBram Moolenaar
147487bc3f74SBram Moolenaar  " Test for ]`
147587bc3f74SBram Moolenaar  norm! ]`
147687bc3f74SBram Moolenaar  call assert_equal('  20   b', getline('.'))
147787bc3f74SBram Moolenaar  call assert_equal(20, line('.'))
147887bc3f74SBram Moolenaar  call assert_equal(8, col('.'))
147987bc3f74SBram Moolenaar
148087bc3f74SBram Moolenaar  " clean up
148187bc3f74SBram Moolenaar  bw!
14822931f2a5SBram Moolenaarendfunc
148387bc3f74SBram Moolenaar
148487bc3f74SBram Moolenaarfunc! Test_normal28_parenthesis()
148587bc3f74SBram Moolenaar  " basic testing for ( and )
148687bc3f74SBram Moolenaar  new
148787bc3f74SBram Moolenaar  call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
148887bc3f74SBram Moolenaar
148987bc3f74SBram Moolenaar  $
149087bc3f74SBram Moolenaar  norm! d(
149187bc3f74SBram Moolenaar  call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$'))
149287bc3f74SBram Moolenaar  norm! 2d(
149387bc3f74SBram Moolenaar  call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$'))
149487bc3f74SBram Moolenaar  1
149587bc3f74SBram Moolenaar  norm! 0d)
149687bc3f74SBram Moolenaar  call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$'))
149787bc3f74SBram Moolenaar
149887bc3f74SBram Moolenaar  call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. '])
149987bc3f74SBram Moolenaar  $
150087bc3f74SBram Moolenaar  norm! $d(
150187bc3f74SBram Moolenaar  call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$'))
150287bc3f74SBram Moolenaar
150387bc3f74SBram Moolenaar  " clean up
150487bc3f74SBram Moolenaar  bw!
15052931f2a5SBram Moolenaarendfunc
150687bc3f74SBram Moolenaar
150787bc3f74SBram Moolenaarfun! Test_normal29_brace()
150887bc3f74SBram Moolenaar  " basic test for { and } movements
150987bc3f74SBram Moolenaar  let text= ['A paragraph begins after each empty line, and also at each of a set of',
151087bc3f74SBram Moolenaar  \ 'paragraph macros, specified by the pairs of characters in the ''paragraphs''',
151187bc3f74SBram Moolenaar  \ 'option.  The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to',
151287bc3f74SBram Moolenaar  \ 'the macros ".IP", ".LP", etc.  (These are nroff macros, so the dot must be in',
151387bc3f74SBram Moolenaar  \ 'the first column).  A section boundary is also a paragraph boundary.',
151487bc3f74SBram Moolenaar  \ 'Note that a blank line (only containing white space) is NOT a paragraph',
151587bc3f74SBram Moolenaar  \ 'boundary.',
151687bc3f74SBram Moolenaar  \ '',
151787bc3f74SBram Moolenaar  \ '',
151887bc3f74SBram Moolenaar  \ 'Also note that this does not include a ''{'' or ''}'' in the first column.  When',
151987bc3f74SBram Moolenaar  \ 'the ''{'' flag is in ''cpoptions'' then ''{'' in the first column is used as a',
152087bc3f74SBram Moolenaar  \ 'paragraph boundary |posix|.',
152187bc3f74SBram Moolenaar  \ '{',
152287bc3f74SBram Moolenaar  \ 'This is no paragaraph',
152387bc3f74SBram Moolenaar  \ 'unless the ''{'' is set',
152487bc3f74SBram Moolenaar  \ 'in ''cpoptions''',
152587bc3f74SBram Moolenaar  \ '}',
152687bc3f74SBram Moolenaar  \ '.IP',
152787bc3f74SBram Moolenaar  \ 'The nroff macros IP seperates a paragraph',
152887bc3f74SBram Moolenaar  \ 'That means, it must be a ''.''',
152987bc3f74SBram Moolenaar  \ 'followed by IP',
153087bc3f74SBram Moolenaar  \ '.LPIt does not matter, if afterwards some',
153187bc3f74SBram Moolenaar  \ 'more characters follow.',
153287bc3f74SBram Moolenaar  \ '.SHAlso section boundaries from the nroff',
153387bc3f74SBram Moolenaar  \ 'macros terminate a paragraph. That means',
153487bc3f74SBram Moolenaar  \ 'a character like this:',
153587bc3f74SBram Moolenaar  \ '.NH',
153687bc3f74SBram Moolenaar  \ 'End of text here']
153787bc3f74SBram Moolenaar  new
153887bc3f74SBram Moolenaar  call append(0, text)
153987bc3f74SBram Moolenaar  1
154087bc3f74SBram Moolenaar  norm! 0d2}
154187bc3f74SBram Moolenaar  call assert_equal(['.IP',
154287bc3f74SBram Moolenaar    \  'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''', 'followed by IP',
154387bc3f74SBram Moolenaar    \ '.LPIt does not matter, if afterwards some', 'more characters follow.', '.SHAlso section boundaries from the nroff',
154487bc3f74SBram Moolenaar    \  'macros terminate a paragraph. That means', 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
154587bc3f74SBram Moolenaar  norm! 0d}
154687bc3f74SBram Moolenaar  call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.',
154787bc3f74SBram Moolenaar    \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
154887bc3f74SBram Moolenaar    \ 'a character like this:', '.NH', 'End of text here', ''], getline(1, '$'))
154987bc3f74SBram Moolenaar  $
155087bc3f74SBram Moolenaar  norm! d{
155187bc3f74SBram Moolenaar  call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.',
155287bc3f74SBram Moolenaar	\ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means', 'a character like this:', ''], getline(1, '$'))
155387bc3f74SBram Moolenaar  norm! d{
155487bc3f74SBram Moolenaar  call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.', ''], getline(1,'$'))
155587bc3f74SBram Moolenaar  " Test with { in cpooptions
155687bc3f74SBram Moolenaar  %d
155787bc3f74SBram Moolenaar  call append(0, text)
155887bc3f74SBram Moolenaar  set cpo+={
155987bc3f74SBram Moolenaar  1
156087bc3f74SBram Moolenaar  norm! 0d2}
156187bc3f74SBram Moolenaar  call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}',
156287bc3f74SBram Moolenaar    \ '.IP', 'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''',
156387bc3f74SBram Moolenaar    \ 'followed by IP', '.LPIt does not matter, if afterwards some', 'more characters follow.',
156487bc3f74SBram Moolenaar    \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
156587bc3f74SBram Moolenaar    \ 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
156687bc3f74SBram Moolenaar  $
156787bc3f74SBram Moolenaar  norm! d}
156887bc3f74SBram Moolenaar  call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}',
156987bc3f74SBram Moolenaar    \ '.IP', 'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''',
157087bc3f74SBram Moolenaar    \ 'followed by IP', '.LPIt does not matter, if afterwards some', 'more characters follow.',
157187bc3f74SBram Moolenaar    \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
157287bc3f74SBram Moolenaar    \ 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
157387bc3f74SBram Moolenaar  norm! gg}
157487bc3f74SBram Moolenaar  norm! d5}
157587bc3f74SBram Moolenaar  call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}', ''], getline(1,'$'))
157687bc3f74SBram Moolenaar
157787bc3f74SBram Moolenaar  " clean up
157887bc3f74SBram Moolenaar  set cpo-={
157987bc3f74SBram Moolenaar  bw!
15802931f2a5SBram Moolenaarendfunc
158187bc3f74SBram Moolenaar
158287bc3f74SBram Moolenaarfun! Test_normal30_changecase()
158387bc3f74SBram Moolenaar  " This test uses multi byte characters
158487bc3f74SBram Moolenaar  if !has("multi_byte")
158587bc3f74SBram Moolenaar    return
158687bc3f74SBram Moolenaar  endif
158787bc3f74SBram Moolenaar  new
158887bc3f74SBram Moolenaar  call append(0, 'This is a simple test: äüöß')
158987bc3f74SBram Moolenaar  norm! 1ggVu
159087bc3f74SBram Moolenaar  call assert_equal('this is a simple test: äüöß', getline('.'))
159187bc3f74SBram Moolenaar  norm! VU
159287bc3f74SBram Moolenaar  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
159387bc3f74SBram Moolenaar  norm! guu
159487bc3f74SBram Moolenaar  call assert_equal('this is a simple test: äüöss', getline('.'))
159587bc3f74SBram Moolenaar  norm! gUgU
159687bc3f74SBram Moolenaar  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
159787bc3f74SBram Moolenaar  norm! gugu
159887bc3f74SBram Moolenaar  call assert_equal('this is a simple test: äüöss', getline('.'))
159987bc3f74SBram Moolenaar  norm! gUU
160087bc3f74SBram Moolenaar  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
160187bc3f74SBram Moolenaar  norm! 010~
160287bc3f74SBram Moolenaar  call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.'))
160387bc3f74SBram Moolenaar  norm! V~
160487bc3f74SBram Moolenaar  call assert_equal('THIS IS A simple test: äüöss', getline('.'))
160587bc3f74SBram Moolenaar
1606*9f4de1f5SBram Moolenaar  " Turkish ASCII turns to multi-byte.  On Mac the Turkish locale is available
1607*9f4de1f5SBram Moolenaar  " but toupper()/tolower() don't do the right thing.
1608*9f4de1f5SBram Moolenaar  if !has('mac')
16093317d5ebSBram Moolenaar    try
16103317d5ebSBram Moolenaar      lang tr_TR.UTF-8
16113317d5ebSBram Moolenaar      set casemap=
16123317d5ebSBram Moolenaar      call setline(1, 'iI')
16133317d5ebSBram Moolenaar      1normal gUU
16143317d5ebSBram Moolenaar      call assert_equal("\u0130I", getline(1))
16153317d5ebSBram Moolenaar      call assert_equal("\u0130I", toupper("iI"))
16163317d5ebSBram Moolenaar
16173317d5ebSBram Moolenaar      call setline(1, 'iI')
16183317d5ebSBram Moolenaar      1normal guu
16193317d5ebSBram Moolenaar      call assert_equal("i\u0131", getline(1))
16203317d5ebSBram Moolenaar      call assert_equal("i\u0131", tolower("iI"))
16213317d5ebSBram Moolenaar
16223317d5ebSBram Moolenaar      lang en_US.UTF-8
16233317d5ebSBram Moolenaar    catch /E197:/
16243317d5ebSBram Moolenaar      " can't use Turkish locale
16253317d5ebSBram Moolenaar      throw 'Skipped: Turkish locale not available'
16263317d5ebSBram Moolenaar    endtry
1627*9f4de1f5SBram Moolenaar  endif
16283317d5ebSBram Moolenaar
162987bc3f74SBram Moolenaar  " clean up
163087bc3f74SBram Moolenaar  bw!
16312931f2a5SBram Moolenaarendfunc
163287bc3f74SBram Moolenaar
163387bc3f74SBram Moolenaarfun! Test_normal31_r_cmd()
163487bc3f74SBram Moolenaar  " Test for r command
163587bc3f74SBram Moolenaar  new
163687bc3f74SBram Moolenaar  call append(0, 'This is a simple test: abcd')
163787bc3f74SBram Moolenaar  exe "norm! 1gg$r\<cr>"
163887bc3f74SBram Moolenaar  call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$'))
163987bc3f74SBram Moolenaar  exe "norm! 1gg2wlr\<cr>"
164087bc3f74SBram Moolenaar  call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$'))
164187bc3f74SBram Moolenaar  exe "norm! 2gg0W5r\<cr>"
164287bc3f74SBram Moolenaar  call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$'))
164387bc3f74SBram Moolenaar  set autoindent
164487bc3f74SBram Moolenaar  call setline(2, ['simple test: abc', ''])
164587bc3f74SBram Moolenaar  exe "norm! 2gg0W5r\<cr>"
164687bc3f74SBram Moolenaar  call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$'))
164787bc3f74SBram Moolenaar  exe "norm! 1ggVr\<cr>"
164887bc3f74SBram Moolenaar  call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1)))
164987bc3f74SBram Moolenaar  call setline(1, 'This is a')
165087bc3f74SBram Moolenaar  exe "norm! 1gg05rf"
165187bc3f74SBram Moolenaar  call assert_equal('fffffis a', getline(1))
165287bc3f74SBram Moolenaar
165387bc3f74SBram Moolenaar  " clean up
165487bc3f74SBram Moolenaar  set noautoindent
165587bc3f74SBram Moolenaar  bw!
16562931f2a5SBram Moolenaarendfunc
165787bc3f74SBram Moolenaar
165887bc3f74SBram Moolenaarfunc! Test_normal32_g_cmd1()
165987bc3f74SBram Moolenaar  " Test for g*, g#
166087bc3f74SBram Moolenaar  new
166187bc3f74SBram Moolenaar  call append(0, ['abc.x_foo', 'x_foobar.abc'])
166287bc3f74SBram Moolenaar  1
166387bc3f74SBram Moolenaar  norm! $g*
166487bc3f74SBram Moolenaar  call assert_equal('x_foo', @/)
166587bc3f74SBram Moolenaar  call assert_equal('x_foobar.abc', getline('.'))
166687bc3f74SBram Moolenaar  norm! $g#
166787bc3f74SBram Moolenaar  call assert_equal('abc', @/)
166887bc3f74SBram Moolenaar  call assert_equal('abc.x_foo', getline('.'))
166987bc3f74SBram Moolenaar
167087bc3f74SBram Moolenaar  " clean up
167187bc3f74SBram Moolenaar  bw!
16722931f2a5SBram Moolenaarendfunc
167387bc3f74SBram Moolenaar
167487bc3f74SBram Moolenaarfun! Test_normal33_g_cmd2()
167587bc3f74SBram Moolenaar  if !has("jumplist")
167687bc3f74SBram Moolenaar    return
167787bc3f74SBram Moolenaar  endif
167887bc3f74SBram Moolenaar  " Tests for g cmds
167987bc3f74SBram Moolenaar  call Setup_NewWindow()
168087bc3f74SBram Moolenaar  " Test for g`
168187bc3f74SBram Moolenaar  clearjumps
168287bc3f74SBram Moolenaar  norm! ma10j
168387bc3f74SBram Moolenaar  let a=execute(':jumps')
168487bc3f74SBram Moolenaar  " empty jumplist
168587bc3f74SBram Moolenaar  call assert_equal('>', a[-1:])
168687bc3f74SBram Moolenaar  norm! g`a
168787bc3f74SBram Moolenaar  call assert_equal('>', a[-1:])
168887bc3f74SBram Moolenaar  call assert_equal(1, line('.'))
168987bc3f74SBram Moolenaar  call assert_equal('1', getline('.'))
169087bc3f74SBram Moolenaar
169187bc3f74SBram Moolenaar  " Test for g; and g,
169287bc3f74SBram Moolenaar  norm! g;
169387bc3f74SBram Moolenaar  " there is only one change in the changelist
169487bc3f74SBram Moolenaar  " currently, when we setup the window
169587bc3f74SBram Moolenaar  call assert_equal(2, line('.'))
169687bc3f74SBram Moolenaar  call assert_fails(':norm! g;', 'E662')
169787bc3f74SBram Moolenaar  call assert_fails(':norm! g,', 'E663')
169887bc3f74SBram Moolenaar  let &ul=&ul
169987bc3f74SBram Moolenaar  call append('$', ['a', 'b', 'c', 'd'])
170087bc3f74SBram Moolenaar  let &ul=&ul
170187bc3f74SBram Moolenaar  call append('$', ['Z', 'Y', 'X', 'W'])
170287bc3f74SBram Moolenaar  let a = execute(':changes')
170387bc3f74SBram Moolenaar  call assert_match('2\s\+0\s\+2', a)
170487bc3f74SBram Moolenaar  call assert_match('101\s\+0\s\+a', a)
170587bc3f74SBram Moolenaar  call assert_match('105\s\+0\s\+Z', a)
170687bc3f74SBram Moolenaar  norm! 3g;
170787bc3f74SBram Moolenaar  call assert_equal(2, line('.'))
170887bc3f74SBram Moolenaar  norm! 2g,
170987bc3f74SBram Moolenaar  call assert_equal(105, line('.'))
171087bc3f74SBram Moolenaar
171187bc3f74SBram Moolenaar  " Test for g& - global substitute
171287bc3f74SBram Moolenaar  %d
171387bc3f74SBram Moolenaar  call setline(1, range(1,10))
171487bc3f74SBram Moolenaar  call append('$', ['a', 'b', 'c', 'd'])
171587bc3f74SBram Moolenaar  $s/\w/&&/g
171687bc3f74SBram Moolenaar  exe "norm! /[1-8]\<cr>"
171787bc3f74SBram Moolenaar  norm! g&
171887bc3f74SBram Moolenaar  call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$'))
171987bc3f74SBram Moolenaar
172087bc3f74SBram Moolenaar  " Test for gv
172187bc3f74SBram Moolenaar  %d
172287bc3f74SBram Moolenaar  call append('$', repeat(['abcdefgh'], 8))
172387bc3f74SBram Moolenaar  exe "norm! 2gg02l\<c-v>2j2ly"
172487bc3f74SBram Moolenaar  call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1))
172587bc3f74SBram Moolenaar  " in visual mode, gv swaps current and last selected region
172687bc3f74SBram Moolenaar  exe "norm! G0\<c-v>4k4lgvd"
172787bc3f74SBram Moolenaar  call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$'))
172887bc3f74SBram Moolenaar  exe "norm! G0\<c-v>4k4ly"
172987bc3f74SBram Moolenaar  exe "norm! gvood"
173087bc3f74SBram Moolenaar  call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$'))
173187bc3f74SBram Moolenaar
173287bc3f74SBram Moolenaar  " Test for gk/gj
173387bc3f74SBram Moolenaar  %d
173487bc3f74SBram Moolenaar  15vsp
173587bc3f74SBram Moolenaar  set wrap listchars= sbr=
173687bc3f74SBram Moolenaar  let lineA='abcdefghijklmnopqrstuvwxyz'
173787bc3f74SBram Moolenaar  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
173887bc3f74SBram Moolenaar  $put =lineA
173987bc3f74SBram Moolenaar  $put =lineB
174087bc3f74SBram Moolenaar
174187bc3f74SBram Moolenaar  norm! 3gg0dgk
174287bc3f74SBram Moolenaar  call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$'))
174387bc3f74SBram Moolenaar  set nu
174487bc3f74SBram Moolenaar  norm! 3gg0gjdgj
174587bc3f74SBram Moolenaar  call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
174687bc3f74SBram Moolenaar
174787bc3f74SBram Moolenaar  " Test for gJ
174887bc3f74SBram Moolenaar  norm! 2gggJ
174987bc3f74SBram Moolenaar  call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
175087bc3f74SBram Moolenaar  call assert_equal(16, col('.'))
175187bc3f74SBram Moolenaar  " shouldn't do anything
175287bc3f74SBram Moolenaar  norm! 10gJ
175387bc3f74SBram Moolenaar  call assert_equal(1, col('.'))
175487bc3f74SBram Moolenaar
175587bc3f74SBram Moolenaar  " Test for g0 g^ gm g$
175687bc3f74SBram Moolenaar  exe "norm! 2gg0gji   "
175787bc3f74SBram Moolenaar  call assert_equal(['', 'abcdefghijk   lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
175887bc3f74SBram Moolenaar  norm! g0yl
175987bc3f74SBram Moolenaar  call assert_equal(12, col('.'))
176087bc3f74SBram Moolenaar  call assert_equal(' ', getreg(0))
176187bc3f74SBram Moolenaar  norm! g$yl
176287bc3f74SBram Moolenaar  call assert_equal(22, col('.'))
176387bc3f74SBram Moolenaar  call assert_equal('3', getreg(0))
176487bc3f74SBram Moolenaar  norm! gmyl
176587bc3f74SBram Moolenaar  call assert_equal(17, col('.'))
176687bc3f74SBram Moolenaar  call assert_equal('n', getreg(0))
176787bc3f74SBram Moolenaar  norm! g^yl
176887bc3f74SBram Moolenaar  call assert_equal(15, col('.'))
176987bc3f74SBram Moolenaar  call assert_equal('l', getreg(0))
177087bc3f74SBram Moolenaar
177187bc3f74SBram Moolenaar  " Test for g Ctrl-G
17720913a108SBram Moolenaar  set ff=unix
177387bc3f74SBram Moolenaar  let a=execute(":norm! g\<c-g>")
177487bc3f74SBram Moolenaar  call assert_match('Col 15 of 43; Line 2 of 2; Word 2 of 2; Byte 16 of 45', a)
177587bc3f74SBram Moolenaar
177687bc3f74SBram Moolenaar  " Test for gI
177787bc3f74SBram Moolenaar  norm! gIfoo
177887bc3f74SBram Moolenaar  call assert_equal(['', 'fooabcdefghijk   lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
177987bc3f74SBram Moolenaar
178087bc3f74SBram Moolenaar  " Test for gi
178187bc3f74SBram Moolenaar  wincmd c
178287bc3f74SBram Moolenaar  %d
178387bc3f74SBram Moolenaar  set tw=0
178487bc3f74SBram Moolenaar  call setline(1, ['foobar', 'new line'])
178587bc3f74SBram Moolenaar  norm! A next word
178687bc3f74SBram Moolenaar  $put ='third line'
178787bc3f74SBram Moolenaar  norm! gi another word
178887bc3f74SBram Moolenaar  call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$'))
178987bc3f74SBram Moolenaar
179087bc3f74SBram Moolenaar  " clean up
179187bc3f74SBram Moolenaar  bw!
17922931f2a5SBram Moolenaarendfunc
179387bc3f74SBram Moolenaar
179487bc3f74SBram Moolenaarfun! Test_normal34_g_cmd3()
179587bc3f74SBram Moolenaar  if !has("multi_byte")
179687bc3f74SBram Moolenaar    return
179787bc3f74SBram Moolenaar  endif
1798395b6babSBram Moolenaar
179987bc3f74SBram Moolenaar  " Test for g8
180087bc3f74SBram Moolenaar  new
1801395b6babSBram Moolenaar  let a=execute(':norm! 1G0g8')
1802395b6babSBram Moolenaar  call assert_equal("\nNUL", a)
180387bc3f74SBram Moolenaar
1804395b6babSBram Moolenaar  call setline(1, 'abcdefghijklmnopqrstuvwxyzäüö')
1805395b6babSBram Moolenaar  let a=execute(':norm! 1G$g8')
1806395b6babSBram Moolenaar  call assert_equal("\nc3 b6 ", a)
1807395b6babSBram Moolenaar
1808395b6babSBram Moolenaar  call setline(1, "a\u0302")
1809395b6babSBram Moolenaar  let a=execute(':norm! 1G0g8')
1810395b6babSBram Moolenaar  call assert_equal("\n61 + cc 82 ", a)
1811395b6babSBram Moolenaar
181287bc3f74SBram Moolenaar  " clean up
181387bc3f74SBram Moolenaar  bw!
18142931f2a5SBram Moolenaarendfunc
181587bc3f74SBram Moolenaar
1816395b6babSBram Moolenaarfunc Test_normal_8g8()
1817395b6babSBram Moolenaar  if !has("multi_byte")
1818395b6babSBram Moolenaar    return
1819395b6babSBram Moolenaar  endif
1820395b6babSBram Moolenaar  new
1821395b6babSBram Moolenaar
1822395b6babSBram Moolenaar  " Test 8g8 which finds invalid utf8 at or after the cursor.
1823395b6babSBram Moolenaar
1824395b6babSBram Moolenaar  " With invalid byte.
1825395b6babSBram Moolenaar  call setline(1, "___\xff___")
1826395b6babSBram Moolenaar  norm! 1G08g8g
1827395b6babSBram Moolenaar  call assert_equal([0, 1, 4, 0, 1], getcurpos())
1828395b6babSBram Moolenaar
1829395b6babSBram Moolenaar  " With invalid byte before the cursor.
1830395b6babSBram Moolenaar  call setline(1, "___\xff___")
1831395b6babSBram Moolenaar  norm! 1G$h8g8g
1832395b6babSBram Moolenaar  call assert_equal([0, 1, 6, 0, 9], getcurpos())
1833395b6babSBram Moolenaar
1834395b6babSBram Moolenaar  " With truncated sequence.
1835395b6babSBram Moolenaar  call setline(1, "___\xE2\x82___")
1836395b6babSBram Moolenaar  norm! 1G08g8g
1837395b6babSBram Moolenaar  call assert_equal([0, 1, 4, 0, 1], getcurpos())
1838395b6babSBram Moolenaar
1839395b6babSBram Moolenaar  " With overlong sequence.
1840395b6babSBram Moolenaar  call setline(1, "___\xF0\x82\x82\xAC___")
1841395b6babSBram Moolenaar  norm! 1G08g8g
1842395b6babSBram Moolenaar  call assert_equal([0, 1, 4, 0, 1], getcurpos())
1843395b6babSBram Moolenaar
1844395b6babSBram Moolenaar  " With valid utf8.
1845395b6babSBram Moolenaar  call setline(1, "café")
1846395b6babSBram Moolenaar  norm! 1G08g8
1847395b6babSBram Moolenaar  call assert_equal([0, 1, 1, 0, 1], getcurpos())
1848395b6babSBram Moolenaar
1849395b6babSBram Moolenaar  bw!
1850395b6babSBram Moolenaarendfunc
1851395b6babSBram Moolenaar
185287bc3f74SBram Moolenaarfun! Test_normal35_g_cmd4()
185387bc3f74SBram Moolenaar  " Test for g<
185487bc3f74SBram Moolenaar  " Cannot capture its output,
185587bc3f74SBram Moolenaar  " probably a bug, therefore, test disabled:
185631845093SBram Moolenaar  throw "Skipped: output of g< can't be tested currently"
185787bc3f74SBram Moolenaar  echo "a\nb\nc\nd"
185887bc3f74SBram Moolenaar  let b=execute(':norm! g<')
185987bc3f74SBram Moolenaar  call assert_true(!empty(b), 'failed `execute(g<)`')
18602931f2a5SBram Moolenaarendfunc
186187bc3f74SBram Moolenaar
186287bc3f74SBram Moolenaarfun! Test_normal36_g_cmd5()
186387bc3f74SBram Moolenaar  new
186487bc3f74SBram Moolenaar  call append(0, 'abcdefghijklmnopqrstuvwxyz')
18650913a108SBram Moolenaar  set ff=unix
186687bc3f74SBram Moolenaar  " Test for gp gP
186787bc3f74SBram Moolenaar  call append(1, range(1,10))
186887bc3f74SBram Moolenaar  1
186987bc3f74SBram Moolenaar  norm! 1yy
187087bc3f74SBram Moolenaar  3
187187bc3f74SBram Moolenaar  norm! gp
187287bc3f74SBram Moolenaar  call assert_equal([0, 5, 1, 0, 1], getcurpos())
187387bc3f74SBram Moolenaar  $
187487bc3f74SBram Moolenaar  norm! gP
187587bc3f74SBram Moolenaar  call assert_equal([0, 14, 1, 0, 1], getcurpos())
187687bc3f74SBram Moolenaar
187787bc3f74SBram Moolenaar  " Test for go
187887bc3f74SBram Moolenaar  norm! 26go
187987bc3f74SBram Moolenaar  call assert_equal([0, 1, 26, 0, 26], getcurpos())
188087bc3f74SBram Moolenaar  norm! 27go
188187bc3f74SBram Moolenaar  call assert_equal([0, 1, 26, 0, 26], getcurpos())
188287bc3f74SBram Moolenaar  norm! 28go
188387bc3f74SBram Moolenaar  call assert_equal([0, 2, 1, 0, 1], getcurpos())
188487bc3f74SBram Moolenaar  set ff=dos
188587bc3f74SBram Moolenaar  norm! 29go
188687bc3f74SBram Moolenaar  call assert_equal([0, 2, 1, 0, 1], getcurpos())
188787bc3f74SBram Moolenaar  set ff=unix
188887bc3f74SBram Moolenaar  norm! gg0
188987bc3f74SBram Moolenaar  norm! 101go
189087bc3f74SBram Moolenaar  call assert_equal([0, 13, 26, 0, 26], getcurpos())
189187bc3f74SBram Moolenaar  norm! 103go
189287bc3f74SBram Moolenaar  call assert_equal([0, 14, 1, 0, 1], getcurpos())
189387bc3f74SBram Moolenaar  " count > buffer content
189487bc3f74SBram Moolenaar  norm! 120go
189587bc3f74SBram Moolenaar  call assert_equal([0, 14, 1, 0, 2147483647], getcurpos())
189687bc3f74SBram Moolenaar  " clean up
189787bc3f74SBram Moolenaar  bw!
18982931f2a5SBram Moolenaarendfunc
189987bc3f74SBram Moolenaar
190087bc3f74SBram Moolenaarfun! Test_normal37_g_cmd6()
190187bc3f74SBram Moolenaar  " basic test for gt and gT
190287bc3f74SBram Moolenaar  tabnew 1.txt
190387bc3f74SBram Moolenaar  tabnew 2.txt
190487bc3f74SBram Moolenaar  tabnew 3.txt
190587bc3f74SBram Moolenaar  norm! 1gt
190687bc3f74SBram Moolenaar  call assert_equal(1, tabpagenr())
190787bc3f74SBram Moolenaar  norm! 3gt
190887bc3f74SBram Moolenaar  call assert_equal(3, tabpagenr())
190987bc3f74SBram Moolenaar  norm! 1gT
191087bc3f74SBram Moolenaar  " count gT goes not to the absolute tabpagenumber
191187bc3f74SBram Moolenaar  " but, but goes to the count previous tabpagenumber
191287bc3f74SBram Moolenaar  call assert_equal(2, tabpagenr())
191387bc3f74SBram Moolenaar  " wrap around
191487bc3f74SBram Moolenaar  norm! 3gT
191587bc3f74SBram Moolenaar  call assert_equal(3, tabpagenr())
191687bc3f74SBram Moolenaar  " gt does not wrap around
191787bc3f74SBram Moolenaar  norm! 5gt
191887bc3f74SBram Moolenaar  call assert_equal(3, tabpagenr())
191987bc3f74SBram Moolenaar
192087bc3f74SBram Moolenaar  for i in range(3)
192187bc3f74SBram Moolenaar    tabclose
192287bc3f74SBram Moolenaar  endfor
192387bc3f74SBram Moolenaar  " clean up
192487bc3f74SBram Moolenaar  call assert_fails(':tabclose', 'E784')
19252931f2a5SBram Moolenaarendfunc
192687bc3f74SBram Moolenaar
192787bc3f74SBram Moolenaarfun! Test_normal38_nvhome()
192887bc3f74SBram Moolenaar  " Test for <Home> and <C-Home> key
192987bc3f74SBram Moolenaar  new
193087bc3f74SBram Moolenaar  call setline(1, range(10))
193187bc3f74SBram Moolenaar  $
193287bc3f74SBram Moolenaar  setl et sw=2
193387bc3f74SBram Moolenaar  norm! V10>$
193487bc3f74SBram Moolenaar  " count is ignored
193587bc3f74SBram Moolenaar  exe "norm! 10\<home>"
193687bc3f74SBram Moolenaar  call assert_equal(1, col('.'))
193787bc3f74SBram Moolenaar  exe "norm! \<home>"
193887bc3f74SBram Moolenaar  call assert_equal([0, 10, 1, 0, 1], getcurpos())
193987bc3f74SBram Moolenaar  exe "norm! 5\<c-home>"
194087bc3f74SBram Moolenaar  call assert_equal([0, 5, 1, 0, 1], getcurpos())
194187bc3f74SBram Moolenaar  exe "norm! \<c-home>"
194287bc3f74SBram Moolenaar  call assert_equal([0, 1, 1, 0, 1], getcurpos())
194387bc3f74SBram Moolenaar
194487bc3f74SBram Moolenaar  " clean up
194587bc3f74SBram Moolenaar  bw!
19462931f2a5SBram Moolenaarendfunc
194787bc3f74SBram Moolenaar
194887bc3f74SBram Moolenaarfun! Test_normal39_cw()
194987bc3f74SBram Moolenaar  " Test for cw and cW on whitespace
195087bc3f74SBram Moolenaar  " and cpo+=w setting
195187bc3f74SBram Moolenaar  new
195287bc3f74SBram Moolenaar  set tw=0
195387bc3f74SBram Moolenaar  call append(0, 'here      are   some words')
195487bc3f74SBram Moolenaar  norm! 1gg0elcwZZZ
195587bc3f74SBram Moolenaar  call assert_equal('hereZZZare   some words', getline('.'))
195687bc3f74SBram Moolenaar  norm! 1gg0elcWYYY
195787bc3f74SBram Moolenaar  call assert_equal('hereZZZareYYYsome words', getline('.'))
195887bc3f74SBram Moolenaar  set cpo+=w
195987bc3f74SBram Moolenaar  call setline(1, 'here      are   some words')
196087bc3f74SBram Moolenaar  norm! 1gg0elcwZZZ
196187bc3f74SBram Moolenaar  call assert_equal('hereZZZ     are   some words', getline('.'))
196287bc3f74SBram Moolenaar  norm! 1gg2elcWYYY
196387bc3f74SBram Moolenaar  call assert_equal('hereZZZ     areYYY  some words', getline('.'))
196487bc3f74SBram Moolenaar  set cpo-=w
196587bc3f74SBram Moolenaar  norm! 2gg0cwfoo
196687bc3f74SBram Moolenaar  call assert_equal('foo', getline('.'))
196787bc3f74SBram Moolenaar
196887bc3f74SBram Moolenaar  " clean up
196987bc3f74SBram Moolenaar  bw!
19702931f2a5SBram Moolenaarendfunc
197187bc3f74SBram Moolenaar
197287bc3f74SBram Moolenaarfun! Test_normal40_ctrl_bsl()
197387bc3f74SBram Moolenaar  " Basic test for CTRL-\ commands
197487bc3f74SBram Moolenaar  new
197587bc3f74SBram Moolenaar  call append(0, 'here      are   some words')
197687bc3f74SBram Moolenaar  exe "norm! 1gg0a\<C-\>\<C-N>"
197787bc3f74SBram Moolenaar  call assert_equal('n', mode())
197887bc3f74SBram Moolenaar  call assert_equal(1, col('.'))
197987bc3f74SBram Moolenaar  call assert_equal('', visualmode())
198087bc3f74SBram Moolenaar  exe "norm! 1gg0viw\<C-\>\<C-N>"
198187bc3f74SBram Moolenaar  call assert_equal('n', mode())
198287bc3f74SBram Moolenaar  call assert_equal(4, col('.'))
198387bc3f74SBram Moolenaar  exe "norm! 1gg0a\<C-\>\<C-G>"
198487bc3f74SBram Moolenaar  call assert_equal('n', mode())
198587bc3f74SBram Moolenaar  call assert_equal(1, col('.'))
198687bc3f74SBram Moolenaar  "imap <buffer> , <c-\><c-n>
198787bc3f74SBram Moolenaar  set im
198887bc3f74SBram Moolenaar  exe ":norm! \<c-\>\<c-n>dw"
198987bc3f74SBram Moolenaar  set noim
199087bc3f74SBram Moolenaar  call assert_equal('are   some words', getline(1))
199187bc3f74SBram Moolenaar  call assert_false(&insertmode)
199287bc3f74SBram Moolenaar
199387bc3f74SBram Moolenaar  " clean up
199487bc3f74SBram Moolenaar  bw!
19952931f2a5SBram Moolenaarendfunc
199687bc3f74SBram Moolenaar
199787bc3f74SBram Moolenaarfun! Test_normal41_insert_reg()
199887bc3f74SBram Moolenaar  " Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>=
199987bc3f74SBram Moolenaar  " in insert mode
200087bc3f74SBram Moolenaar  new
200187bc3f74SBram Moolenaar  set sts=2 sw=2 ts=8 tw=0
200287bc3f74SBram Moolenaar  call append(0, ["aaa\tbbb\tccc", '', '', ''])
200387bc3f74SBram Moolenaar  let a=getline(1)
200487bc3f74SBram Moolenaar  norm! 2gg0
200587bc3f74SBram Moolenaar  exe "norm! a\<c-r>=a\<cr>"
200687bc3f74SBram Moolenaar  norm! 3gg0
200787bc3f74SBram Moolenaar  exe "norm! a\<c-r>\<c-r>=a\<cr>"
200887bc3f74SBram Moolenaar  norm! 4gg0
200987bc3f74SBram Moolenaar  exe "norm! a\<c-r>\<c-o>=a\<cr>"
201087bc3f74SBram Moolenaar  call assert_equal(['aaa	bbb	ccc', 'aaa bbb	ccc', 'aaa bbb	ccc', 'aaa	bbb	ccc', ''], getline(1, '$'))
201187bc3f74SBram Moolenaar
201287bc3f74SBram Moolenaar  " clean up
201387bc3f74SBram Moolenaar  set sts=0 sw=8 ts=8
201431845093SBram Moolenaar  bw!
20152931f2a5SBram Moolenaarendfunc
201687bc3f74SBram Moolenaar
201787bc3f74SBram Moolenaarfunc! Test_normal42_halfpage()
201887bc3f74SBram Moolenaar  " basic test for Ctrl-D and Ctrl-U
201987bc3f74SBram Moolenaar  call Setup_NewWindow()
202087bc3f74SBram Moolenaar  call assert_equal(5, &scroll)
202187bc3f74SBram Moolenaar  exe "norm! \<c-d>"
202287bc3f74SBram Moolenaar  call assert_equal('6', getline('.'))
202387bc3f74SBram Moolenaar  exe "norm! 2\<c-d>"
202487bc3f74SBram Moolenaar  call assert_equal('8', getline('.'))
202587bc3f74SBram Moolenaar  call assert_equal(2, &scroll)
202687bc3f74SBram Moolenaar  set scroll=5
202787bc3f74SBram Moolenaar  exe "norm! \<c-u>"
202887bc3f74SBram Moolenaar  call assert_equal('3', getline('.'))
202987bc3f74SBram Moolenaar  1
203087bc3f74SBram Moolenaar  set scrolloff=5
203187bc3f74SBram Moolenaar  exe "norm! \<c-d>"
203287bc3f74SBram Moolenaar  call assert_equal('10', getline('.'))
203387bc3f74SBram Moolenaar  exe "norm! \<c-u>"
203487bc3f74SBram Moolenaar  call assert_equal('5', getline('.'))
203587bc3f74SBram Moolenaar  1
203687bc3f74SBram Moolenaar  set scrolloff=99
203787bc3f74SBram Moolenaar  exe "norm! \<c-d>"
203887bc3f74SBram Moolenaar  call assert_equal('10', getline('.'))
203987bc3f74SBram Moolenaar  set scrolloff=0
204087bc3f74SBram Moolenaar  100
204187bc3f74SBram Moolenaar  exe "norm! $\<c-u>"
204287bc3f74SBram Moolenaar  call assert_equal('95', getline('.'))
204387bc3f74SBram Moolenaar  call assert_equal([0, 95, 1, 0, 1], getcurpos())
204487bc3f74SBram Moolenaar  100
204587bc3f74SBram Moolenaar  set nostartofline
204687bc3f74SBram Moolenaar  exe "norm! $\<c-u>"
204787bc3f74SBram Moolenaar  call assert_equal('95', getline('.'))
204887bc3f74SBram Moolenaar  call assert_equal([0, 95, 2, 0, 2147483647], getcurpos())
204987bc3f74SBram Moolenaar  " cleanup
205087bc3f74SBram Moolenaar  set startofline
205187bc3f74SBram Moolenaar  bw!
20522931f2a5SBram Moolenaarendfunc
205387bc3f74SBram Moolenaar
205487bc3f74SBram Moolenaarfun! Test_normal43_textobject1()
205587bc3f74SBram Moolenaar  " basic tests for text object aw
205687bc3f74SBram Moolenaar  new
205787bc3f74SBram Moolenaar  call append(0, ['foobar,eins,foobar', 'foo,zwei,foo    '])
205887bc3f74SBram Moolenaar  " diw
205987bc3f74SBram Moolenaar  norm! 1gg0diw
206087bc3f74SBram Moolenaar  call assert_equal([',eins,foobar', 'foo,zwei,foo    ', ''], getline(1,'$'))
206187bc3f74SBram Moolenaar  " daw
206287bc3f74SBram Moolenaar  norm! 2ggEdaw
206387bc3f74SBram Moolenaar  call assert_equal([',eins,foobar', 'foo,zwei,', ''], getline(1, '$'))
206487bc3f74SBram Moolenaar  %d
206587bc3f74SBram Moolenaar  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
206687bc3f74SBram Moolenaar  " diW
206787bc3f74SBram Moolenaar  norm! 2ggwd2iW
206887bc3f74SBram Moolenaar  call assert_equal(['foo	eins	foobar', 'foo	foo   ', ''], getline(1,'$'))
206987bc3f74SBram Moolenaar  " daW
207087bc3f74SBram Moolenaar  norm! 1ggd2aW
207187bc3f74SBram Moolenaar  call assert_equal(['foobar', 'foo	foo   ', ''], getline(1,'$'))
207287bc3f74SBram Moolenaar
207387bc3f74SBram Moolenaar  %d
207487bc3f74SBram Moolenaar  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
207587bc3f74SBram Moolenaar  " aw in visual line mode switches to characterwise mode
207687bc3f74SBram Moolenaar  norm! 2gg$Vawd
207787bc3f74SBram Moolenaar  call assert_equal(['foo	eins	foobar', 'foo	zwei	foo'], getline(1,'$'))
207887bc3f74SBram Moolenaar  norm! 1gg$Viwd
207987bc3f74SBram Moolenaar  call assert_equal(['foo	eins	', 'foo	zwei	foo'], getline(1,'$'))
208087bc3f74SBram Moolenaar
208187bc3f74SBram Moolenaar  " clean up
208287bc3f74SBram Moolenaar  bw!
20832931f2a5SBram Moolenaarendfunc
208487bc3f74SBram Moolenaar
208587bc3f74SBram Moolenaarfunc! Test_normal44_textobjects2()
208687bc3f74SBram Moolenaar  " basic testing for is and as text objects
208787bc3f74SBram Moolenaar  new
208887bc3f74SBram Moolenaar  call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
208987bc3f74SBram Moolenaar  " Test for dis - does not remove trailing whitespace
209087bc3f74SBram Moolenaar  norm! 1gg0dis
209187bc3f74SBram Moolenaar  call assert_equal([' With some sentences!', '', 'Even with a question? And one more. And no sentence here', ''], getline(1,'$'))
209287bc3f74SBram Moolenaar  " Test for das - removes leading whitespace
209387bc3f74SBram Moolenaar  norm! 3ggf?ldas
209487bc3f74SBram Moolenaar  call assert_equal([' With some sentences!', '', 'Even with a question? And no sentence here', ''], getline(1,'$'))
209587bc3f74SBram Moolenaar  " when used in visual mode, is made characterwise
209687bc3f74SBram Moolenaar  norm! 3gg$Visy
209787bc3f74SBram Moolenaar  call assert_equal('v', visualmode())
209887bc3f74SBram Moolenaar  " reset visualmode()
209987bc3f74SBram Moolenaar  norm! 3ggVy
210087bc3f74SBram Moolenaar  norm! 3gg$Vasy
210187bc3f74SBram Moolenaar  call assert_equal('v', visualmode())
210287bc3f74SBram Moolenaar  " basic testing for textobjects a< and at
210387bc3f74SBram Moolenaar  %d
210487bc3f74SBram Moolenaar  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
210587bc3f74SBram Moolenaar  " a<
210687bc3f74SBram Moolenaar  norm! 1gg0da<
210787bc3f74SBram Moolenaar  call assert_equal([' ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
210887bc3f74SBram Moolenaar  norm! 1pj
210987bc3f74SBram Moolenaar  call assert_equal([' <div>', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
211087bc3f74SBram Moolenaar  " at
211187bc3f74SBram Moolenaar  norm! d2at
211287bc3f74SBram Moolenaar  call assert_equal([' '], getline(1,'$'))
211387bc3f74SBram Moolenaar  %d
211487bc3f74SBram Moolenaar  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
211587bc3f74SBram Moolenaar  " i<
211687bc3f74SBram Moolenaar  norm! 1gg0di<
211787bc3f74SBram Moolenaar  call assert_equal(['<> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
211887bc3f74SBram Moolenaar  norm! 1Pj
211987bc3f74SBram Moolenaar  call assert_equal(['<div> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
212087bc3f74SBram Moolenaar  norm! d2it
212187bc3f74SBram Moolenaar  call assert_equal(['<div></div>',' '], getline(1,'$'))
212287bc3f74SBram Moolenaar  " basic testing for a[ and i[ text object
212387bc3f74SBram Moolenaar  %d
212487bc3f74SBram Moolenaar  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
212587bc3f74SBram Moolenaar  norm! 3gg0di[
212687bc3f74SBram Moolenaar  call assert_equal([' ', '[', ']'], getline(1,'$'))
212787bc3f74SBram Moolenaar  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
212887bc3f74SBram Moolenaar  norm! 3gg0ftd2a[
212987bc3f74SBram Moolenaar  call assert_equal([' '], getline(1,'$'))
213087bc3f74SBram Moolenaar  %d
213187bc3f74SBram Moolenaar  " Test for i" when cursor is in front of a quoted object
213287bc3f74SBram Moolenaar  call append(0, 'foo "bar"')
213387bc3f74SBram Moolenaar  norm! 1gg0di"
213487bc3f74SBram Moolenaar  call assert_equal(['foo ""', ''], getline(1,'$'))
213587bc3f74SBram Moolenaar
213687bc3f74SBram Moolenaar  " clean up
213787bc3f74SBram Moolenaar  bw!
21382931f2a5SBram Moolenaarendfunc
213987bc3f74SBram Moolenaar
214087bc3f74SBram Moolenaarfunc! Test_normal45_drop()
214187bc3f74SBram Moolenaar  if !has("dnd")
214287bc3f74SBram Moolenaar    return
214387bc3f74SBram Moolenaar  endif
214487bc3f74SBram Moolenaar  " basic test for :drop command
214587bc3f74SBram Moolenaar  " unfortunately, without a gui, we can't really test much here,
214687bc3f74SBram Moolenaar  " so simply test that ~p fails (which uses the drop register)
214787bc3f74SBram Moolenaar  new
214887bc3f74SBram Moolenaar  call assert_fails(':norm! "~p', 'E353')
214987bc3f74SBram Moolenaar  call assert_equal([],  getreg('~', 1, 1))
215087bc3f74SBram Moolenaar  " the ~ register is read only
215187bc3f74SBram Moolenaar  call assert_fails(':let @~="1"', 'E354')
215287bc3f74SBram Moolenaar  bw!
21532931f2a5SBram Moolenaarendfunc
215487bc3f74SBram Moolenaar
215587bc3f74SBram Moolenaarfunc! Test_normal46_ignore()
21562931f2a5SBram Moolenaar  " This test uses multi byte characters
21572931f2a5SBram Moolenaar  if !has("multi_byte")
21582931f2a5SBram Moolenaar    return
21592931f2a5SBram Moolenaar  endif
21602931f2a5SBram Moolenaar
216187bc3f74SBram Moolenaar  new
216287bc3f74SBram Moolenaar  " How to test this?
216387bc3f74SBram Moolenaar  " let's just for now test, that the buffer
216487bc3f74SBram Moolenaar  " does not change
216587bc3f74SBram Moolenaar  call feedkeys("\<c-s>", 't')
216687bc3f74SBram Moolenaar  call assert_equal([''], getline(1,'$'))
216787bc3f74SBram Moolenaar
21682931f2a5SBram Moolenaar  " no valid commands
21692931f2a5SBram Moolenaar  exe "norm! \<char-0x100>"
21702931f2a5SBram Moolenaar  call assert_equal([''], getline(1,'$'))
21712931f2a5SBram Moolenaar
21722931f2a5SBram Moolenaar  exe "norm! ä"
21732931f2a5SBram Moolenaar  call assert_equal([''], getline(1,'$'))
21742931f2a5SBram Moolenaar
217587bc3f74SBram Moolenaar  " clean up
217687bc3f74SBram Moolenaar  bw!
21772931f2a5SBram Moolenaarendfunc
2178c4a908e8SBram Moolenaar
2179c4a908e8SBram Moolenaarfunc! Test_normal47_visual_buf_wipe()
2180c4a908e8SBram Moolenaar  " This was causing a crash or ml_get error.
2181c4a908e8SBram Moolenaar  enew!
2182c4a908e8SBram Moolenaar  call setline(1,'xxx')
2183c4a908e8SBram Moolenaar  normal $
2184c4a908e8SBram Moolenaar  new
2185c4a908e8SBram Moolenaar  call setline(1, range(1,2))
2186c4a908e8SBram Moolenaar  2
2187c4a908e8SBram Moolenaar  exe "norm \<C-V>$"
2188c4a908e8SBram Moolenaar  bw!
2189c4a908e8SBram Moolenaar  norm yp
2190c4a908e8SBram Moolenaar  set nomodified
21912931f2a5SBram Moolenaarendfunc
21922931f2a5SBram Moolenaar
21932931f2a5SBram Moolenaarfunc! Test_normal47_autocmd()
21942931f2a5SBram Moolenaar  " disabled, does not seem to be possible currently
21952931f2a5SBram Moolenaar  throw "Skipped: not possible to test cursorhold autocmd while waiting for input in normal_cmd"
21962931f2a5SBram Moolenaar  new
21972931f2a5SBram Moolenaar  call append(0, repeat('-',20))
21982931f2a5SBram Moolenaar  au CursorHold * call feedkeys('2l', '')
21992931f2a5SBram Moolenaar  1
22002931f2a5SBram Moolenaar  set updatetime=20
22012931f2a5SBram Moolenaar  " should delete 12 chars (d12l)
22022931f2a5SBram Moolenaar  call feedkeys('d1', '!')
22032931f2a5SBram Moolenaar  call assert_equal('--------', getline(1))
22042931f2a5SBram Moolenaar
22052931f2a5SBram Moolenaar  " clean up
22062931f2a5SBram Moolenaar  au! CursorHold
22072931f2a5SBram Moolenaar  set updatetime=4000
22082931f2a5SBram Moolenaar  bw!
22092931f2a5SBram Moolenaarendfunc
22102931f2a5SBram Moolenaar
22112931f2a5SBram Moolenaarfunc! Test_normal48_wincmd()
22122931f2a5SBram Moolenaar  new
22132931f2a5SBram Moolenaar  exe "norm! \<c-w>c"
22142931f2a5SBram Moolenaar  call assert_equal(1, winnr('$'))
22152931f2a5SBram Moolenaar  call assert_fails(":norm! \<c-w>c", "E444")
22162931f2a5SBram Moolenaarendfunc
22172931f2a5SBram Moolenaar
22182931f2a5SBram Moolenaarfunc! Test_normal49_counts()
22192931f2a5SBram Moolenaar  new
22202931f2a5SBram Moolenaar  call setline(1, 'one two three four five six seven eight nine ten')
22212931f2a5SBram Moolenaar  1
22222931f2a5SBram Moolenaar  norm! 3d2w
22232931f2a5SBram Moolenaar  call assert_equal('seven eight nine ten', getline(1))
22242931f2a5SBram Moolenaar  bw!
22252931f2a5SBram Moolenaarendfunc
22262931f2a5SBram Moolenaar
22272931f2a5SBram Moolenaarfunc! Test_normal50_commandline()
22282931f2a5SBram Moolenaar  if !has("timers") || !has("cmdline_hist") || !has("vertsplit")
22292931f2a5SBram Moolenaar    return
22302931f2a5SBram Moolenaar  endif
22312931f2a5SBram Moolenaar  func! DoTimerWork(id)
22322931f2a5SBram Moolenaar    call assert_equal('[Command Line]', bufname(''))
22332931f2a5SBram Moolenaar    " should fail, with E11, but does fail with E23?
22342931f2a5SBram Moolenaar    "call feedkeys("\<c-^>", 'tm')
22352931f2a5SBram Moolenaar
22362931f2a5SBram Moolenaar    " should also fail with E11
22372931f2a5SBram Moolenaar    call assert_fails(":wincmd p", 'E11')
22382931f2a5SBram Moolenaar    " return from commandline window
22392931f2a5SBram Moolenaar    call feedkeys("\<cr>")
22402931f2a5SBram Moolenaar  endfunc
22412931f2a5SBram Moolenaar
22422931f2a5SBram Moolenaar  let oldlang=v:lang
22432931f2a5SBram Moolenaar  lang C
22442931f2a5SBram Moolenaar  set updatetime=20
22452931f2a5SBram Moolenaar  call timer_start(100, 'DoTimerWork')
22462931f2a5SBram Moolenaar  try
22472931f2a5SBram Moolenaar    " throws E23, for whatever reason...
22482931f2a5SBram Moolenaar    call feedkeys('q:', 'x!')
22492931f2a5SBram Moolenaar  catch /E23/
22502931f2a5SBram Moolenaar    " no-op
22512931f2a5SBram Moolenaar  endtry
22522931f2a5SBram Moolenaar  " clean up
22532931f2a5SBram Moolenaar  set updatetime=4000
22542931f2a5SBram Moolenaar  exe "lang" oldlang
22552931f2a5SBram Moolenaar  bw!
22562931f2a5SBram Moolenaarendfunc
22572931f2a5SBram Moolenaar
22582931f2a5SBram Moolenaarfunc! Test_normal51_FileChangedRO()
22592931f2a5SBram Moolenaar  if !has("autocmd")
22602931f2a5SBram Moolenaar    return
22612931f2a5SBram Moolenaar  endif
2262e5f2a075SBram Moolenaar  " Don't sleep after the warning message.
2263e5f2a075SBram Moolenaar  call test_settime(1)
22642931f2a5SBram Moolenaar  call writefile(['foo'], 'Xreadonly.log')
22652931f2a5SBram Moolenaar  new Xreadonly.log
22662931f2a5SBram Moolenaar  setl ro
22672931f2a5SBram Moolenaar  au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix')
22682931f2a5SBram Moolenaar  call assert_fails(":norm! Af", 'E788')
22692931f2a5SBram Moolenaar  call assert_equal(['foo'], getline(1,'$'))
22702931f2a5SBram Moolenaar  call assert_equal('Xreadonly.log', bufname(''))
22712931f2a5SBram Moolenaar
22722931f2a5SBram Moolenaar  " cleanup
2273e5f2a075SBram Moolenaar  call test_settime(0)
22742931f2a5SBram Moolenaar  bw!
22752931f2a5SBram Moolenaar  call delete("Xreadonly.log")
22762931f2a5SBram Moolenaarendfunc
22772931f2a5SBram Moolenaar
22782931f2a5SBram Moolenaarfunc! Test_normal52_rl()
22792931f2a5SBram Moolenaar  if !has("rightleft")
22802931f2a5SBram Moolenaar    return
22812931f2a5SBram Moolenaar  endif
22822931f2a5SBram Moolenaar  new
22832931f2a5SBram Moolenaar  call setline(1, 'abcde fghij klmnopq')
22842931f2a5SBram Moolenaar  norm! 1gg$
22852931f2a5SBram Moolenaar  set rl
22862931f2a5SBram Moolenaar  call assert_equal(19, col('.'))
22872931f2a5SBram Moolenaar  call feedkeys('l', 'tx')
22882931f2a5SBram Moolenaar  call assert_equal(18, col('.'))
22892931f2a5SBram Moolenaar  call feedkeys('h', 'tx')
22902931f2a5SBram Moolenaar  call assert_equal(19, col('.'))
22912931f2a5SBram Moolenaar  call feedkeys("\<right>", 'tx')
22922931f2a5SBram Moolenaar  call assert_equal(18, col('.'))
22932931f2a5SBram Moolenaar  call feedkeys("\<s-right>", 'tx')
22942931f2a5SBram Moolenaar  call assert_equal(13, col('.'))
22952931f2a5SBram Moolenaar  call feedkeys("\<c-right>", 'tx')
22962931f2a5SBram Moolenaar  call assert_equal(7, col('.'))
22972931f2a5SBram Moolenaar  call feedkeys("\<c-left>", 'tx')
22982931f2a5SBram Moolenaar  call assert_equal(13, col('.'))
22992931f2a5SBram Moolenaar  call feedkeys("\<s-left>", 'tx')
23002931f2a5SBram Moolenaar  call assert_equal(19, col('.'))
23012931f2a5SBram Moolenaar  call feedkeys("<<", 'tx')
23022931f2a5SBram Moolenaar  call assert_equal('	abcde fghij klmnopq',getline(1))
23032931f2a5SBram Moolenaar  call feedkeys(">>", 'tx')
23042931f2a5SBram Moolenaar  call assert_equal('abcde fghij klmnopq',getline(1))
23052931f2a5SBram Moolenaar
23062931f2a5SBram Moolenaar  " cleanup
23072931f2a5SBram Moolenaar  set norl
23082931f2a5SBram Moolenaar  bw!
23092931f2a5SBram Moolenaarendfunc
23102931f2a5SBram Moolenaar
23112931f2a5SBram Moolenaarfunc! Test_normal53_digraph()
23122931f2a5SBram Moolenaar  if !has('digraphs')
23132931f2a5SBram Moolenaar    return
23142931f2a5SBram Moolenaar  endif
23152931f2a5SBram Moolenaar  new
23162931f2a5SBram Moolenaar  call setline(1, 'abcdefgh|')
23172931f2a5SBram Moolenaar  exe "norm! 1gg0f\<c-k>!!"
23182931f2a5SBram Moolenaar  call assert_equal(9, col('.'))
23192931f2a5SBram Moolenaar  set cpo+=D
23202931f2a5SBram Moolenaar  exe "norm! 1gg0f\<c-k>!!"
23212931f2a5SBram Moolenaar  call assert_equal(1, col('.'))
23222931f2a5SBram Moolenaar
23232931f2a5SBram Moolenaar  set cpo-=D
23242931f2a5SBram Moolenaar  bw!
23252931f2a5SBram Moolenaarendfunc
23262931f2a5SBram Moolenaar
2327b1e04fcaSBram Moolenaarfunc Test_normal54_Ctrl_bsl()
23282931f2a5SBram Moolenaar  new
23292931f2a5SBram Moolenaar  call setline(1, 'abcdefghijklmn')
23302931f2a5SBram Moolenaar  exe "norm! df\<c-\>\<c-n>"
23312931f2a5SBram Moolenaar  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
23322931f2a5SBram Moolenaar  exe "norm! df\<c-\>\<c-g>"
23332931f2a5SBram Moolenaar  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
23342931f2a5SBram Moolenaar  exe "norm! df\<c-\>m"
23352931f2a5SBram Moolenaar  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
23362931f2a5SBram Moolenaar  if !has("multi_byte")
23372931f2a5SBram Moolenaar    return
23382931f2a5SBram Moolenaar  endif
23392931f2a5SBram Moolenaar  call setline(2, 'abcdefghijklmnāf')
23402931f2a5SBram Moolenaar  norm! 2gg0
23412931f2a5SBram Moolenaar  exe "norm! df\<Char-0x101>"
23422931f2a5SBram Moolenaar  call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
23432931f2a5SBram Moolenaar  norm! 1gg0
23442931f2a5SBram Moolenaar  exe "norm! df\<esc>"
23452931f2a5SBram Moolenaar  call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
23462931f2a5SBram Moolenaar
23472931f2a5SBram Moolenaar  " clean up
23482931f2a5SBram Moolenaar  bw!
23492931f2a5SBram Moolenaarendfunc
2350b1e04fcaSBram Moolenaar
2351b1e04fcaSBram Moolenaarfunc Test_normal_large_count()
2352b1e04fcaSBram Moolenaar  " This may fail with 32bit long, how do we detect that?
2353b1e04fcaSBram Moolenaar  new
2354b1e04fcaSBram Moolenaar  normal o
2355b1e04fcaSBram Moolenaar  normal 6666666666dL
2356b1e04fcaSBram Moolenaar  bwipe!
2357b1e04fcaSBram Moolenaarendfunc
2358bf3d5807SBram Moolenaar
2359bf3d5807SBram Moolenaarfunc Test_delete_until_paragraph()
2360bf3d5807SBram Moolenaar  if !has('multi_byte')
2361bf3d5807SBram Moolenaar    return
2362bf3d5807SBram Moolenaar  endif
2363bf3d5807SBram Moolenaar  new
2364bf3d5807SBram Moolenaar  normal grádv}
2365bf3d5807SBram Moolenaar  call assert_equal('á', getline(1))
2366bf3d5807SBram Moolenaar  normal grád}
2367bf3d5807SBram Moolenaar  call assert_equal('', getline(1))
2368bf3d5807SBram Moolenaar  bwipe!
2369bf3d5807SBram Moolenaarendfunc
2370