xref: /vim-8.2.3635/src/testdir/test_normal.vim (revision fb094e14)
187bc3f74SBram Moolenaar" Test for various Normal mode commands
287bc3f74SBram Moolenaar
387bc3f74SBram Moolenaarfunc! Setup_NewWindow()
487bc3f74SBram Moolenaar  10new
587bc3f74SBram Moolenaar  call setline(1, range(1,100))
687bc3f74SBram Moolenaarendfunc
787bc3f74SBram Moolenaar
887bc3f74SBram Moolenaarfunc! MyFormatExpr()
987bc3f74SBram Moolenaar  " Adds '->$' at lines having numbers followed by trailing whitespace
1087bc3f74SBram Moolenaar  for ln in range(v:lnum, v:lnum+v:count-1)
1187bc3f74SBram Moolenaar    let line = getline(ln)
1287bc3f74SBram Moolenaar    if getline(ln) =~# '\d\s\+$'
1387bc3f74SBram Moolenaar      call setline(ln, substitute(line, '\s\+$', '', '') . '->$')
1487bc3f74SBram Moolenaar    endif
1587bc3f74SBram Moolenaar  endfor
162931f2a5SBram Moolenaarendfunc
1787bc3f74SBram Moolenaar
182931f2a5SBram Moolenaarfunc! CountSpaces(type, ...)
1987bc3f74SBram Moolenaar  " for testing operatorfunc
2087bc3f74SBram Moolenaar  " will count the number of spaces
2187bc3f74SBram Moolenaar  " and return the result in g:a
2287bc3f74SBram Moolenaar  let sel_save = &selection
2387bc3f74SBram Moolenaar  let &selection = "inclusive"
2487bc3f74SBram Moolenaar  let reg_save = @@
2587bc3f74SBram Moolenaar
2687bc3f74SBram Moolenaar  if a:0  " Invoked from Visual mode, use gv command.
2787bc3f74SBram Moolenaar    silent exe "normal! gvy"
2887bc3f74SBram Moolenaar  elseif a:type == 'line'
2987bc3f74SBram Moolenaar    silent exe "normal! '[V']y"
3087bc3f74SBram Moolenaar  else
3187bc3f74SBram Moolenaar    silent exe "normal! `[v`]y"
3287bc3f74SBram Moolenaar  endif
3387bc3f74SBram Moolenaar  let g:a=strlen(substitute(@@, '[^ ]', '', 'g'))
3487bc3f74SBram Moolenaar  let &selection = sel_save
3587bc3f74SBram Moolenaar  let @@ = reg_save
362931f2a5SBram Moolenaarendfunc
372931f2a5SBram Moolenaar
384a08b0dcSBram Moolenaarfunc! OpfuncDummy(type, ...)
394a08b0dcSBram Moolenaar  " for testing operatorfunc
404a08b0dcSBram Moolenaar  let g:opt=&linebreak
414a08b0dcSBram Moolenaar
424a08b0dcSBram Moolenaar  if a:0  " Invoked from Visual mode, use gv command.
434a08b0dcSBram Moolenaar    silent exe "normal! gvy"
444a08b0dcSBram Moolenaar  elseif a:type == 'line'
454a08b0dcSBram Moolenaar    silent exe "normal! '[V']y"
464a08b0dcSBram Moolenaar  else
474a08b0dcSBram Moolenaar    silent exe "normal! `[v`]y"
484a08b0dcSBram Moolenaar  endif
494a08b0dcSBram Moolenaar  " Create a new dummy window
504a08b0dcSBram Moolenaar  new
514a08b0dcSBram Moolenaar  let g:bufnr=bufnr('%')
522931f2a5SBram Moolenaarendfunc
5387bc3f74SBram Moolenaar
5487bc3f74SBram Moolenaarfun! Test_normal00_optrans()
5587bc3f74SBram Moolenaar  new
5687bc3f74SBram Moolenaar  call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
5787bc3f74SBram Moolenaar  1
5887bc3f74SBram Moolenaar  exe "norm! Sfoobar\<esc>"
5987bc3f74SBram Moolenaar  call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$'))
6087bc3f74SBram Moolenaar  2
6187bc3f74SBram Moolenaar  exe "norm! $vbsone"
6287bc3f74SBram Moolenaar  call assert_equal(['foobar', '2 This is the second one', '3 this is the third line', ''], getline(1,'$'))
6387bc3f74SBram Moolenaar  norm! VS Second line here
6487bc3f74SBram Moolenaar  call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$'))
6587bc3f74SBram Moolenaar  %d
6687bc3f74SBram Moolenaar  call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line'])
6787bc3f74SBram Moolenaar  call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
6887bc3f74SBram Moolenaar
6987bc3f74SBram Moolenaar  1
7087bc3f74SBram Moolenaar  norm! 2D
7187bc3f74SBram 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,'$'))
7287bc3f74SBram Moolenaar  set cpo+=#
7387bc3f74SBram Moolenaar  norm! 4D
7487bc3f74SBram 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,'$'))
7587bc3f74SBram Moolenaar
7687bc3f74SBram Moolenaar  " clean up
7787bc3f74SBram Moolenaar  set cpo-=#
7887bc3f74SBram Moolenaar  bw!
792931f2a5SBram Moolenaarendfunc
8087bc3f74SBram Moolenaar
8187bc3f74SBram Moolenaarfunc! Test_normal01_keymodel()
8287bc3f74SBram Moolenaar  call Setup_NewWindow()
8387bc3f74SBram Moolenaar  " Test 1: depending on 'keymodel' <s-down> does something different
842931f2a5SBram Moolenaar  50
8587bc3f74SBram Moolenaar  call feedkeys("V\<S-Up>y", 'tx')
8687bc3f74SBram Moolenaar  call assert_equal(['47', '48', '49', '50'], getline("'<", "'>"))
872931f2a5SBram Moolenaar  set keymodel=startsel
882931f2a5SBram Moolenaar  50
8987bc3f74SBram Moolenaar  call feedkeys("V\<S-Up>y", 'tx')
9087bc3f74SBram Moolenaar  call assert_equal(['49', '50'], getline("'<", "'>"))
9187bc3f74SBram Moolenaar  " Start visual mode when keymodel = startsel
922931f2a5SBram Moolenaar  50
9387bc3f74SBram Moolenaar  call feedkeys("\<S-Up>y", 'tx')
9487bc3f74SBram Moolenaar  call assert_equal(['49', '5'], getreg(0, 0, 1))
9587bc3f74SBram Moolenaar  " Do not start visual mode when keymodel=
962931f2a5SBram Moolenaar  set keymodel=
972931f2a5SBram Moolenaar  50
9887bc3f74SBram Moolenaar  call feedkeys("\<S-Up>y$", 'tx')
9987bc3f74SBram Moolenaar  call assert_equal(['42'], getreg(0, 0, 1))
1002931f2a5SBram Moolenaar  " Stop visual mode when keymodel=stopsel
1012931f2a5SBram Moolenaar  set keymodel=stopsel
1022931f2a5SBram Moolenaar  50
1032931f2a5SBram Moolenaar  call feedkeys("Vkk\<Up>yy", 'tx')
1042931f2a5SBram Moolenaar  call assert_equal(['47'], getreg(0, 0, 1))
1052931f2a5SBram Moolenaar
1062931f2a5SBram Moolenaar  set keymodel=
1072931f2a5SBram Moolenaar  50
1082931f2a5SBram Moolenaar  call feedkeys("Vkk\<Up>yy", 'tx')
1092931f2a5SBram Moolenaar  call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1))
11087bc3f74SBram Moolenaar
11187bc3f74SBram Moolenaar  " clean up
11287bc3f74SBram Moolenaar  bw!
11387bc3f74SBram Moolenaarendfunc
11487bc3f74SBram Moolenaar
11587bc3f74SBram Moolenaarfunc! Test_normal02_selectmode()
11687bc3f74SBram Moolenaar  " some basic select mode tests
11787bc3f74SBram Moolenaar  call Setup_NewWindow()
11887bc3f74SBram Moolenaar  50
11987bc3f74SBram Moolenaar  norm! gHy
12087bc3f74SBram Moolenaar  call assert_equal('y51', getline('.'))
12187bc3f74SBram Moolenaar  call setline(1, range(1,100))
12287bc3f74SBram Moolenaar  50
12387bc3f74SBram Moolenaar  exe ":norm! V9jo\<c-g>y"
12487bc3f74SBram Moolenaar  call assert_equal('y60', getline('.'))
12587bc3f74SBram Moolenaar  " clean up
12687bc3f74SBram Moolenaar  bw!
1272931f2a5SBram Moolenaarendfunc
1282931f2a5SBram Moolenaar
1292931f2a5SBram Moolenaarfunc! Test_normal02_selectmode2()
1302931f2a5SBram Moolenaar  " some basic select mode tests
1312931f2a5SBram Moolenaar  call Setup_NewWindow()
1322931f2a5SBram Moolenaar  50
1332931f2a5SBram Moolenaar  call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx')
1342931f2a5SBram Moolenaar  call assert_equal('c51', getline('.'))
1352931f2a5SBram Moolenaar  " clean up
1362931f2a5SBram Moolenaar  bw!
1372931f2a5SBram Moolenaarendfunc
13887bc3f74SBram Moolenaar
13987bc3f74SBram Moolenaarfunc! Test_normal03_join()
14087bc3f74SBram Moolenaar  " basic join test
14187bc3f74SBram Moolenaar  call Setup_NewWindow()
14287bc3f74SBram Moolenaar  50
14387bc3f74SBram Moolenaar  norm! VJ
14487bc3f74SBram Moolenaar  call assert_equal('50 51', getline('.'))
14587bc3f74SBram Moolenaar  $
14687bc3f74SBram Moolenaar  norm! J
14787bc3f74SBram Moolenaar  call assert_equal('100', getline('.'))
14887bc3f74SBram Moolenaar  $
14987bc3f74SBram Moolenaar  norm! V9-gJ
15087bc3f74SBram Moolenaar  call assert_equal('919293949596979899100', getline('.'))
15187bc3f74SBram Moolenaar  call setline(1, range(1,100))
15287bc3f74SBram Moolenaar  $
15387bc3f74SBram Moolenaar  :j 10
15487bc3f74SBram Moolenaar  call assert_equal('100', getline('.'))
15587bc3f74SBram Moolenaar  " clean up
15687bc3f74SBram Moolenaar  bw!
1572931f2a5SBram Moolenaarendfunc
15887bc3f74SBram Moolenaar
15987bc3f74SBram Moolenaarfunc! Test_normal04_filter()
16087bc3f74SBram Moolenaar  " basic filter test
16187bc3f74SBram Moolenaar  " only test on non windows platform
1624a08b0dcSBram Moolenaar  if has('win32')
16387bc3f74SBram Moolenaar    return
16487bc3f74SBram Moolenaar  endif
16587bc3f74SBram Moolenaar  call Setup_NewWindow()
16687bc3f74SBram Moolenaar  1
16787bc3f74SBram Moolenaar  call feedkeys("!!sed -e 's/^/|    /'\n", 'tx')
16887bc3f74SBram Moolenaar  call assert_equal('|    1', getline('.'))
16987bc3f74SBram Moolenaar  90
17087bc3f74SBram Moolenaar  :sil :!echo one
17187bc3f74SBram Moolenaar  call feedkeys('.', 'tx')
17287bc3f74SBram Moolenaar  call assert_equal('|    90', getline('.'))
17387bc3f74SBram Moolenaar  95
17487bc3f74SBram Moolenaar  set cpo+=!
17587bc3f74SBram Moolenaar  " 2 <CR>, 1: for executing the command,
17687bc3f74SBram Moolenaar  "         2: clear hit-enter-prompt
17787bc3f74SBram Moolenaar  call feedkeys("!!\n", 'tx')
17887bc3f74SBram Moolenaar  call feedkeys(":!echo one\n\n", 'tx')
17987bc3f74SBram Moolenaar  call feedkeys(".", 'tx')
18087bc3f74SBram Moolenaar  call assert_equal('one', getline('.'))
18187bc3f74SBram Moolenaar  set cpo-=!
18287bc3f74SBram Moolenaar  bw!
1832931f2a5SBram Moolenaarendfunc
18487bc3f74SBram Moolenaar
18587bc3f74SBram Moolenaarfunc! Test_normal05_formatexpr()
18687bc3f74SBram Moolenaar  " basic formatexpr test
18787bc3f74SBram Moolenaar  call Setup_NewWindow()
18887bc3f74SBram Moolenaar  %d_
18987bc3f74SBram Moolenaar  call setline(1, ['here: 1   ', '2', 'here: 3   ', '4', 'not here:   '])
19087bc3f74SBram Moolenaar  1
19187bc3f74SBram Moolenaar  set formatexpr=MyFormatExpr()
19287bc3f74SBram Moolenaar  norm! gqG
19387bc3f74SBram Moolenaar  call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here:   '], getline(1,'$'))
19487bc3f74SBram Moolenaar  set formatexpr=
19587bc3f74SBram Moolenaar  bw!
1962931f2a5SBram Moolenaarendfunc
19787bc3f74SBram Moolenaar
198d77f9d59SBram Moolenaarfunc Test_normal05_formatexpr_newbuf()
199d77f9d59SBram Moolenaar  " Edit another buffer in the 'formatexpr' function
200d77f9d59SBram Moolenaar  new
201d77f9d59SBram Moolenaar  func! Format()
202d77f9d59SBram Moolenaar    edit another
203d77f9d59SBram Moolenaar  endfunc
204d77f9d59SBram Moolenaar  set formatexpr=Format()
205d77f9d59SBram Moolenaar  norm gqG
206d77f9d59SBram Moolenaar  bw!
207d77f9d59SBram Moolenaar  set formatexpr=
208d77f9d59SBram Moolenaarendfunc
209d77f9d59SBram Moolenaar
210d77f9d59SBram Moolenaarfunc Test_normal05_formatexpr_setopt()
211d77f9d59SBram Moolenaar  " Change the 'formatexpr' value in the function
212d77f9d59SBram Moolenaar  new
213d77f9d59SBram Moolenaar  func! Format()
214d77f9d59SBram Moolenaar    set formatexpr=
215d77f9d59SBram Moolenaar  endfunc
216d77f9d59SBram Moolenaar  set formatexpr=Format()
217d77f9d59SBram Moolenaar  norm gqG
218d77f9d59SBram Moolenaar  bw!
219d77f9d59SBram Moolenaar  set formatexpr=
220d77f9d59SBram Moolenaarendfunc
221d77f9d59SBram Moolenaar
22287bc3f74SBram Moolenaarfunc! Test_normal06_formatprg()
22387bc3f74SBram Moolenaar  " basic test for formatprg
22487bc3f74SBram Moolenaar  " only test on non windows platform
2254a08b0dcSBram Moolenaar  if has('win32')
22687bc3f74SBram Moolenaar    return
2279be7c04eSBram Moolenaar  endif
2289be7c04eSBram Moolenaar
22987bc3f74SBram Moolenaar  " uses sed to number non-empty lines
23087bc3f74SBram Moolenaar  call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/    /', '}'''], 'Xsed_format.sh')
23187bc3f74SBram Moolenaar  call system('chmod +x ./Xsed_format.sh')
2329be7c04eSBram Moolenaar  let text = ['a', '', 'c', '', ' ', 'd', 'e']
2339be7c04eSBram Moolenaar  let expected = ['1    a', '', '3    c', '', '5     ', '6    d', '7    e']
2349be7c04eSBram Moolenaar
2359be7c04eSBram Moolenaar  10new
2369be7c04eSBram Moolenaar  call setline(1, text)
23787bc3f74SBram Moolenaar  set formatprg=./Xsed_format.sh
23887bc3f74SBram Moolenaar  norm! gggqG
2399be7c04eSBram Moolenaar  call assert_equal(expected, getline(1, '$'))
2409be7c04eSBram Moolenaar  bw!
2419be7c04eSBram Moolenaar
2429be7c04eSBram Moolenaar  10new
2439be7c04eSBram Moolenaar  call setline(1, text)
2449be7c04eSBram Moolenaar  set formatprg=donothing
2459be7c04eSBram Moolenaar  setlocal formatprg=./Xsed_format.sh
2469be7c04eSBram Moolenaar  norm! gggqG
2479be7c04eSBram Moolenaar  call assert_equal(expected, getline(1, '$'))
2489be7c04eSBram Moolenaar  bw!
2499be7c04eSBram Moolenaar
25087bc3f74SBram Moolenaar  " clean up
25187bc3f74SBram Moolenaar  set formatprg=
2529be7c04eSBram Moolenaar  setlocal formatprg=
25387bc3f74SBram Moolenaar  call delete('Xsed_format.sh')
2542931f2a5SBram Moolenaarendfunc
25587bc3f74SBram Moolenaar
25687bc3f74SBram Moolenaarfunc! Test_normal07_internalfmt()
25787bc3f74SBram Moolenaar  " basic test for internal formmatter to textwidth of 12
25887bc3f74SBram Moolenaar  let list=range(1,11)
25987bc3f74SBram Moolenaar  call map(list, 'v:val."    "')
26087bc3f74SBram Moolenaar  10new
26187bc3f74SBram Moolenaar  call setline(1, list)
26287bc3f74SBram Moolenaar  set tw=12
26387bc3f74SBram Moolenaar  norm! gggqG
26487bc3f74SBram Moolenaar  call assert_equal(['1    2    3', '4    5    6', '7    8    9', '10    11    '], getline(1, '$'))
26587bc3f74SBram Moolenaar  " clean up
2669be7c04eSBram Moolenaar  set tw=0
26787bc3f74SBram Moolenaar  bw!
2682931f2a5SBram Moolenaarendfunc
26987bc3f74SBram Moolenaar
27087bc3f74SBram Moolenaarfunc! Test_normal08_fold()
27187bc3f74SBram Moolenaar  " basic tests for foldopen/folddelete
27287bc3f74SBram Moolenaar  if !has("folding")
27387bc3f74SBram Moolenaar    return
27487bc3f74SBram Moolenaar  endif
27587bc3f74SBram Moolenaar  call Setup_NewWindow()
27687bc3f74SBram Moolenaar  50
27787bc3f74SBram Moolenaar  setl foldenable fdm=marker
27887bc3f74SBram Moolenaar  " First fold
27987bc3f74SBram Moolenaar  norm! V4jzf
28087bc3f74SBram Moolenaar  " check that folds have been created
28187bc3f74SBram Moolenaar  call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54))
28287bc3f74SBram Moolenaar  " Second fold
28387bc3f74SBram Moolenaar  46
28487bc3f74SBram Moolenaar  norm! V10jzf
28587bc3f74SBram Moolenaar  " check that folds have been created
28687bc3f74SBram Moolenaar  call assert_equal('46/*{{{*/', getline(46))
28787bc3f74SBram Moolenaar  call assert_equal('60/*}}}*/', getline(60))
28887bc3f74SBram Moolenaar  norm! k
28987bc3f74SBram Moolenaar  call assert_equal('45', getline('.'))
29087bc3f74SBram Moolenaar  norm! j
29187bc3f74SBram Moolenaar  call assert_equal('46/*{{{*/', getline('.'))
29287bc3f74SBram Moolenaar  norm! j
29387bc3f74SBram Moolenaar  call assert_equal('61', getline('.'))
29487bc3f74SBram Moolenaar  norm! k
29587bc3f74SBram Moolenaar  " open a fold
29687bc3f74SBram Moolenaar  norm! Vzo
29787bc3f74SBram Moolenaar  norm! k
29887bc3f74SBram Moolenaar  call assert_equal('45', getline('.'))
29987bc3f74SBram Moolenaar  norm! j
30087bc3f74SBram Moolenaar  call assert_equal('46/*{{{*/', getline('.'))
30187bc3f74SBram Moolenaar  norm! j
30287bc3f74SBram Moolenaar  call assert_equal('47', getline('.'))
30387bc3f74SBram Moolenaar  norm! k
30487bc3f74SBram Moolenaar  norm! zcVzO
30587bc3f74SBram Moolenaar  call assert_equal('46/*{{{*/', getline('.'))
30687bc3f74SBram Moolenaar  norm! j
30787bc3f74SBram Moolenaar  call assert_equal('47', getline('.'))
30887bc3f74SBram Moolenaar  norm! j
30987bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
31087bc3f74SBram Moolenaar  norm! j
31187bc3f74SBram Moolenaar  call assert_equal('49', getline('.'))
31287bc3f74SBram Moolenaar  norm! j
31387bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
31487bc3f74SBram Moolenaar  norm! j
31587bc3f74SBram Moolenaar  call assert_equal('51', getline('.'))
31687bc3f74SBram Moolenaar  " delete folds
31787bc3f74SBram Moolenaar  :46
31887bc3f74SBram Moolenaar  " collapse fold
31987bc3f74SBram Moolenaar  norm! V14jzC
32087bc3f74SBram Moolenaar  " delete all folds recursively
32187bc3f74SBram Moolenaar  norm! VzD
32287bc3f74SBram Moolenaar  call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60))
32387bc3f74SBram Moolenaar
32487bc3f74SBram Moolenaar  " clean up
32587bc3f74SBram Moolenaar  setl nofoldenable fdm=marker
32687bc3f74SBram Moolenaar  bw!
3272931f2a5SBram Moolenaarendfunc
32887bc3f74SBram Moolenaar
32987bc3f74SBram Moolenaarfunc! Test_normal09_operatorfunc()
33087bc3f74SBram Moolenaar  " Test operatorfunc
33187bc3f74SBram Moolenaar  call Setup_NewWindow()
33287bc3f74SBram Moolenaar  " Add some spaces for counting
33387bc3f74SBram Moolenaar  50,60s/$/  /
33487bc3f74SBram Moolenaar  unlet! g:a
33587bc3f74SBram Moolenaar  let g:a=0
33687bc3f74SBram Moolenaar  nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@
33787bc3f74SBram Moolenaar  vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
33887bc3f74SBram Moolenaar  50
33987bc3f74SBram Moolenaar  norm V2j,,
34087bc3f74SBram Moolenaar  call assert_equal(6, g:a)
34187bc3f74SBram Moolenaar  norm V,,
34287bc3f74SBram Moolenaar  call assert_equal(2, g:a)
34387bc3f74SBram Moolenaar  norm ,,l
34487bc3f74SBram Moolenaar  call assert_equal(0, g:a)
34587bc3f74SBram Moolenaar  50
34687bc3f74SBram Moolenaar  exe "norm 0\<c-v>10j2l,,"
34787bc3f74SBram Moolenaar  call assert_equal(11, g:a)
34887bc3f74SBram Moolenaar  50
34987bc3f74SBram Moolenaar  norm V10j,,
35087bc3f74SBram Moolenaar  call assert_equal(22, g:a)
35187bc3f74SBram Moolenaar
35287bc3f74SBram Moolenaar  " clean up
35387bc3f74SBram Moolenaar  unmap <buffer> ,,
35487bc3f74SBram Moolenaar  set opfunc=
3554a08b0dcSBram Moolenaar  unlet! g:a
35687bc3f74SBram Moolenaar  bw!
3572931f2a5SBram Moolenaarendfunc
35887bc3f74SBram Moolenaar
3594a08b0dcSBram Moolenaarfunc! Test_normal09a_operatorfunc()
3604a08b0dcSBram Moolenaar  " Test operatorfunc
3614a08b0dcSBram Moolenaar  call Setup_NewWindow()
3624a08b0dcSBram Moolenaar  " Add some spaces for counting
3634a08b0dcSBram Moolenaar  50,60s/$/  /
3644a08b0dcSBram Moolenaar  unlet! g:opt
3654a08b0dcSBram Moolenaar  set linebreak
3664a08b0dcSBram Moolenaar  nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@
3674a08b0dcSBram Moolenaar  50
3684a08b0dcSBram Moolenaar  norm ,,j
3694a08b0dcSBram Moolenaar  exe "bd!" g:bufnr
3704a08b0dcSBram Moolenaar  call assert_true(&linebreak)
3714a08b0dcSBram Moolenaar  call assert_equal(g:opt, &linebreak)
3724a08b0dcSBram Moolenaar  set nolinebreak
3734a08b0dcSBram Moolenaar  norm ,,j
3744a08b0dcSBram Moolenaar  exe "bd!" g:bufnr
3754a08b0dcSBram Moolenaar  call assert_false(&linebreak)
3764a08b0dcSBram Moolenaar  call assert_equal(g:opt, &linebreak)
3774a08b0dcSBram Moolenaar
3784a08b0dcSBram Moolenaar  " clean up
3794a08b0dcSBram Moolenaar  unmap <buffer> ,,
3804a08b0dcSBram Moolenaar  set opfunc=
3814a08b0dcSBram Moolenaar  bw!
3824a08b0dcSBram Moolenaar  unlet! g:opt
3834a08b0dcSBram Moolenaarendfunc
3844a08b0dcSBram Moolenaar
38587bc3f74SBram Moolenaarfunc! Test_normal10_expand()
38687bc3f74SBram Moolenaar  " Test for expand()
38787bc3f74SBram Moolenaar  10new
38887bc3f74SBram Moolenaar  call setline(1, ['1', 'ifooar,,cbar'])
38987bc3f74SBram Moolenaar  2
39087bc3f74SBram Moolenaar  norm! $
39165f08474SBram Moolenaar  call assert_equal('cbar', expand('<cword>'))
39265f08474SBram Moolenaar  call assert_equal('ifooar,,cbar', expand('<cWORD>'))
39365f08474SBram Moolenaar
39465f08474SBram Moolenaar  call setline(1, ['prx = list[idx];'])
39565f08474SBram Moolenaar  1
39665f08474SBram Moolenaar  let expected = ['', 'prx', 'prx', 'prx',
39765f08474SBram Moolenaar	\ 'list', 'list', 'list', 'list', 'list', 'list', 'list',
39865f08474SBram Moolenaar	\ 'idx', 'idx', 'idx', 'idx',
39965f08474SBram Moolenaar	\ 'list[idx]',
40065f08474SBram Moolenaar	\ '];',
40165f08474SBram Moolenaar	\ ]
40265f08474SBram Moolenaar  for i in range(1, 16)
40365f08474SBram Moolenaar    exe 'norm ' . i . '|'
40465f08474SBram Moolenaar    call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i)
40565f08474SBram Moolenaar  endfor
40665f08474SBram Moolenaar
40787bc3f74SBram Moolenaar  " clean up
40887bc3f74SBram Moolenaar  bw!
4092931f2a5SBram Moolenaarendfunc
41087bc3f74SBram Moolenaar
41187bc3f74SBram Moolenaarfunc! Test_normal11_showcmd()
41287bc3f74SBram Moolenaar  " test for 'showcmd'
41387bc3f74SBram Moolenaar  10new
41487bc3f74SBram Moolenaar  exe "norm! ofoobar\<esc>"
41587bc3f74SBram Moolenaar  call assert_equal(2, line('$'))
41687bc3f74SBram Moolenaar  set showcmd
41787bc3f74SBram Moolenaar  exe "norm! ofoobar2\<esc>"
41887bc3f74SBram Moolenaar  call assert_equal(3, line('$'))
41987bc3f74SBram Moolenaar  exe "norm! VAfoobar3\<esc>"
42087bc3f74SBram Moolenaar  call assert_equal(3, line('$'))
42187bc3f74SBram Moolenaar  exe "norm! 0d3\<del>2l"
42287bc3f74SBram Moolenaar  call assert_equal('obar2foobar3', getline('.'))
42387bc3f74SBram Moolenaar  bw!
4242931f2a5SBram Moolenaarendfunc
42587bc3f74SBram Moolenaar
42687bc3f74SBram Moolenaarfunc! Test_normal12_nv_error()
42787bc3f74SBram Moolenaar  " Test for nv_error
42887bc3f74SBram Moolenaar  10new
42987bc3f74SBram Moolenaar  call setline(1, range(1,5))
43087bc3f74SBram Moolenaar  " should not do anything, just beep
43187bc3f74SBram Moolenaar  exe "norm! <c-k>"
43287bc3f74SBram Moolenaar  call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$'))
43387bc3f74SBram Moolenaar  bw!
4342931f2a5SBram Moolenaarendfunc
43587bc3f74SBram Moolenaar
43687bc3f74SBram Moolenaarfunc! Test_normal13_help()
43787bc3f74SBram Moolenaar  " Test for F1
43887bc3f74SBram Moolenaar  call assert_equal(1, winnr())
43987bc3f74SBram Moolenaar  call feedkeys("\<f1>", 'txi')
44087bc3f74SBram Moolenaar  call assert_match('help\.txt', bufname('%'))
44187bc3f74SBram Moolenaar  call assert_equal(2, winnr('$'))
44287bc3f74SBram Moolenaar  bw!
4432931f2a5SBram Moolenaarendfunc
44487bc3f74SBram Moolenaar
44587bc3f74SBram Moolenaarfunc! Test_normal14_page()
44687bc3f74SBram Moolenaar  " basic test for Ctrl-F and Ctrl-B
44787bc3f74SBram Moolenaar  call Setup_NewWindow()
44887bc3f74SBram Moolenaar  exe "norm! \<c-f>"
44987bc3f74SBram Moolenaar  call assert_equal('9', getline('.'))
45087bc3f74SBram Moolenaar  exe "norm! 2\<c-f>"
45187bc3f74SBram Moolenaar  call assert_equal('25', getline('.'))
45287bc3f74SBram Moolenaar  exe "norm! 2\<c-b>"
45387bc3f74SBram Moolenaar  call assert_equal('18', getline('.'))
45487bc3f74SBram Moolenaar  1
45587bc3f74SBram Moolenaar  set scrolloff=5
45687bc3f74SBram Moolenaar  exe "norm! 2\<c-f>"
45787bc3f74SBram Moolenaar  call assert_equal('21', getline('.'))
45887bc3f74SBram Moolenaar  exe "norm! \<c-b>"
45987bc3f74SBram Moolenaar  call assert_equal('13', getline('.'))
46087bc3f74SBram Moolenaar  1
46187bc3f74SBram Moolenaar  set scrolloff=99
46287bc3f74SBram Moolenaar  exe "norm! \<c-f>"
46387bc3f74SBram Moolenaar  call assert_equal('13', getline('.'))
46487bc3f74SBram Moolenaar  set scrolloff=0
46587bc3f74SBram Moolenaar  100
46687bc3f74SBram Moolenaar  exe "norm! $\<c-b>"
46787bc3f74SBram Moolenaar  call assert_equal('92', getline('.'))
46887bc3f74SBram Moolenaar  call assert_equal([0, 92, 1, 0, 1], getcurpos())
46987bc3f74SBram Moolenaar  100
47087bc3f74SBram Moolenaar  set nostartofline
47187bc3f74SBram Moolenaar  exe "norm! $\<c-b>"
47287bc3f74SBram Moolenaar  call assert_equal('92', getline('.'))
47387bc3f74SBram Moolenaar  call assert_equal([0, 92, 2, 0, 2147483647], getcurpos())
47487bc3f74SBram Moolenaar  " cleanup
47587bc3f74SBram Moolenaar  set startofline
47687bc3f74SBram Moolenaar  bw!
4772931f2a5SBram Moolenaarendfunc
47887bc3f74SBram Moolenaar
479bc54f3f3SBram Moolenaarfunc! Test_normal14_page_eol()
480bc54f3f3SBram Moolenaar  10new
481bc54f3f3SBram Moolenaar  norm oxxxxxxx
482bc54f3f3SBram Moolenaar  exe "norm 2\<c-f>"
483bc54f3f3SBram Moolenaar  " check with valgrind that cursor is put back in column 1
484bc54f3f3SBram Moolenaar  exe "norm 2\<c-b>"
485bc54f3f3SBram Moolenaar  bw!
486bc54f3f3SBram Moolenaarendfunc
487bc54f3f3SBram Moolenaar
48887bc3f74SBram Moolenaarfunc! Test_normal15_z_scroll_vert()
48987bc3f74SBram Moolenaar  " basic test for z commands that scroll the window
49087bc3f74SBram Moolenaar  call Setup_NewWindow()
49187bc3f74SBram Moolenaar  100
49287bc3f74SBram Moolenaar  norm! >>
49387bc3f74SBram Moolenaar  " Test for z<cr>
49487bc3f74SBram Moolenaar  exe "norm! z\<cr>"
49587bc3f74SBram Moolenaar  call assert_equal('	100', getline('.'))
49687bc3f74SBram Moolenaar  call assert_equal(100, winsaveview()['topline'])
49787bc3f74SBram Moolenaar  call assert_equal([0, 100, 2, 0, 9], getcurpos())
49887bc3f74SBram Moolenaar
49987bc3f74SBram Moolenaar  " Test for zt
50087bc3f74SBram Moolenaar  21
50187bc3f74SBram Moolenaar  norm! >>0zt
50287bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
50387bc3f74SBram Moolenaar  call assert_equal(21, winsaveview()['topline'])
50487bc3f74SBram Moolenaar  call assert_equal([0, 21, 1, 0, 8], getcurpos())
50587bc3f74SBram Moolenaar
50687bc3f74SBram Moolenaar  " Test for zb
50787bc3f74SBram Moolenaar  30
50887bc3f74SBram Moolenaar  norm! >>$ztzb
50987bc3f74SBram Moolenaar  call assert_equal('	30', getline('.'))
51087bc3f74SBram Moolenaar  call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
51187bc3f74SBram Moolenaar  call assert_equal([0, 30, 3, 0, 2147483647], getcurpos())
51287bc3f74SBram Moolenaar
51387bc3f74SBram Moolenaar  " Test for z-
51487bc3f74SBram Moolenaar  1
51587bc3f74SBram Moolenaar  30
51687bc3f74SBram Moolenaar  norm! 0z-
51787bc3f74SBram Moolenaar  call assert_equal('	30', getline('.'))
51887bc3f74SBram Moolenaar  call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
51987bc3f74SBram Moolenaar  call assert_equal([0, 30, 2, 0, 9], getcurpos())
52087bc3f74SBram Moolenaar
52187bc3f74SBram Moolenaar  " Test for z{height}<cr>
52287bc3f74SBram Moolenaar  call assert_equal(10, winheight(0))
52387bc3f74SBram Moolenaar  exe "norm! z12\<cr>"
52487bc3f74SBram Moolenaar  call assert_equal(12, winheight(0))
52587bc3f74SBram Moolenaar  exe "norm! z10\<cr>"
52687bc3f74SBram Moolenaar  call assert_equal(10, winheight(0))
52787bc3f74SBram Moolenaar
52887bc3f74SBram Moolenaar  " Test for z.
52987bc3f74SBram Moolenaar  1
53087bc3f74SBram Moolenaar  21
53187bc3f74SBram Moolenaar  norm! 0z.
53287bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
53387bc3f74SBram Moolenaar  call assert_equal(17, winsaveview()['topline'])
53487bc3f74SBram Moolenaar  call assert_equal([0, 21, 2, 0, 9], getcurpos())
53587bc3f74SBram Moolenaar
53687bc3f74SBram Moolenaar  " Test for zz
53787bc3f74SBram Moolenaar  1
53887bc3f74SBram Moolenaar  21
53987bc3f74SBram Moolenaar  norm! 0zz
54087bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
54187bc3f74SBram Moolenaar  call assert_equal(17, winsaveview()['topline'])
54287bc3f74SBram Moolenaar  call assert_equal([0, 21, 1, 0, 8], getcurpos())
54387bc3f74SBram Moolenaar
54487bc3f74SBram Moolenaar  " Test for z+
54587bc3f74SBram Moolenaar  11
54687bc3f74SBram Moolenaar  norm! zt
54787bc3f74SBram Moolenaar  norm! z+
54887bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
54987bc3f74SBram Moolenaar  call assert_equal(21, winsaveview()['topline'])
55087bc3f74SBram Moolenaar  call assert_equal([0, 21, 2, 0, 9], getcurpos())
55187bc3f74SBram Moolenaar
55287bc3f74SBram Moolenaar  " Test for [count]z+
55387bc3f74SBram Moolenaar  1
55487bc3f74SBram Moolenaar  norm! 21z+
55587bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
55687bc3f74SBram Moolenaar  call assert_equal(21, winsaveview()['topline'])
55787bc3f74SBram Moolenaar  call assert_equal([0, 21, 2, 0, 9], getcurpos())
55887bc3f74SBram Moolenaar
55987bc3f74SBram Moolenaar  " Test for z^
56087bc3f74SBram Moolenaar  norm! 22z+0
56187bc3f74SBram Moolenaar  norm! z^
56287bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
56387bc3f74SBram Moolenaar  call assert_equal(12, winsaveview()['topline'])
56487bc3f74SBram Moolenaar  call assert_equal([0, 21, 2, 0, 9], getcurpos())
56587bc3f74SBram Moolenaar
56687bc3f74SBram Moolenaar  " Test for [count]z^
56787bc3f74SBram Moolenaar  1
56887bc3f74SBram Moolenaar  norm! 30z^
56987bc3f74SBram Moolenaar  call assert_equal('	21', getline('.'))
57087bc3f74SBram Moolenaar  call assert_equal(12, winsaveview()['topline'])
57187bc3f74SBram Moolenaar  call assert_equal([0, 21, 2, 0, 9], getcurpos())
57287bc3f74SBram Moolenaar
57387bc3f74SBram Moolenaar  " cleanup
57487bc3f74SBram Moolenaar  bw!
5752931f2a5SBram Moolenaarendfunc
57687bc3f74SBram Moolenaar
57787bc3f74SBram Moolenaarfunc! Test_normal16_z_scroll_hor()
57887bc3f74SBram Moolenaar  " basic test for z commands that scroll the window
57987bc3f74SBram Moolenaar  10new
58087bc3f74SBram Moolenaar  15vsp
58187bc3f74SBram Moolenaar  set nowrap listchars=
58287bc3f74SBram Moolenaar  let lineA='abcdefghijklmnopqrstuvwxyz'
58387bc3f74SBram Moolenaar  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
58487bc3f74SBram Moolenaar  $put =lineA
58587bc3f74SBram Moolenaar  $put =lineB
58687bc3f74SBram Moolenaar  1d
58787bc3f74SBram Moolenaar
58887bc3f74SBram Moolenaar  " Test for zl
58987bc3f74SBram Moolenaar  1
59087bc3f74SBram Moolenaar  norm! 5zl
59187bc3f74SBram Moolenaar  call assert_equal(lineA, getline('.'))
59287bc3f74SBram Moolenaar  call assert_equal(6, col('.'))
59387bc3f74SBram Moolenaar  call assert_equal(5, winsaveview()['leftcol'])
59487bc3f74SBram Moolenaar  norm! yl
59587bc3f74SBram Moolenaar  call assert_equal('f', @0)
59687bc3f74SBram Moolenaar
59787bc3f74SBram Moolenaar  " Test for zh
59887bc3f74SBram Moolenaar  norm! 2zh
59987bc3f74SBram Moolenaar  call assert_equal(lineA, getline('.'))
60087bc3f74SBram Moolenaar  call assert_equal(6, col('.'))
60187bc3f74SBram Moolenaar  norm! yl
60287bc3f74SBram Moolenaar  call assert_equal('f', @0)
60387bc3f74SBram Moolenaar  call assert_equal(3, winsaveview()['leftcol'])
60487bc3f74SBram Moolenaar
60587bc3f74SBram Moolenaar  " Test for zL
60687bc3f74SBram Moolenaar  norm! zL
60787bc3f74SBram Moolenaar  call assert_equal(11, col('.'))
60887bc3f74SBram Moolenaar  norm! yl
60987bc3f74SBram Moolenaar  call assert_equal('k', @0)
61087bc3f74SBram Moolenaar  call assert_equal(10, winsaveview()['leftcol'])
61187bc3f74SBram Moolenaar  norm! 2zL
61287bc3f74SBram Moolenaar  call assert_equal(25, col('.'))
61387bc3f74SBram Moolenaar  norm! yl
61487bc3f74SBram Moolenaar  call assert_equal('y', @0)
61587bc3f74SBram Moolenaar  call assert_equal(24, winsaveview()['leftcol'])
61687bc3f74SBram Moolenaar
61787bc3f74SBram Moolenaar  " Test for zH
61887bc3f74SBram Moolenaar  norm! 2zH
61987bc3f74SBram Moolenaar  call assert_equal(25, col('.'))
62087bc3f74SBram Moolenaar  call assert_equal(10, winsaveview()['leftcol'])
62187bc3f74SBram Moolenaar  norm! yl
62287bc3f74SBram Moolenaar  call assert_equal('y', @0)
62387bc3f74SBram Moolenaar
62487bc3f74SBram Moolenaar  " Test for zs
62587bc3f74SBram Moolenaar  norm! $zs
62687bc3f74SBram Moolenaar  call assert_equal(26, col('.'))
62787bc3f74SBram Moolenaar  call assert_equal(25, winsaveview()['leftcol'])
62887bc3f74SBram Moolenaar  norm! yl
62987bc3f74SBram Moolenaar  call assert_equal('z', @0)
63087bc3f74SBram Moolenaar
63187bc3f74SBram Moolenaar  " Test for ze
63287bc3f74SBram Moolenaar  norm! ze
63387bc3f74SBram Moolenaar  call assert_equal(26, col('.'))
63487bc3f74SBram Moolenaar  call assert_equal(11, winsaveview()['leftcol'])
63587bc3f74SBram Moolenaar  norm! yl
63687bc3f74SBram Moolenaar  call assert_equal('z', @0)
63787bc3f74SBram Moolenaar
63887bc3f74SBram Moolenaar  " cleanup
63987bc3f74SBram Moolenaar  set wrap listchars=eol:$
64087bc3f74SBram Moolenaar  bw!
6412931f2a5SBram Moolenaarendfunc
64287bc3f74SBram Moolenaar
64387bc3f74SBram Moolenaarfunc! Test_normal17_z_scroll_hor2()
64487bc3f74SBram Moolenaar  " basic test for z commands that scroll the window
64587bc3f74SBram Moolenaar  " using 'sidescrolloff' setting
64687bc3f74SBram Moolenaar  10new
64787bc3f74SBram Moolenaar  20vsp
64887bc3f74SBram Moolenaar  set nowrap listchars= sidescrolloff=5
64987bc3f74SBram Moolenaar  let lineA='abcdefghijklmnopqrstuvwxyz'
65087bc3f74SBram Moolenaar  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
65187bc3f74SBram Moolenaar  $put =lineA
65287bc3f74SBram Moolenaar  $put =lineB
65387bc3f74SBram Moolenaar  1d
65487bc3f74SBram Moolenaar
65587bc3f74SBram Moolenaar  " Test for zl
65687bc3f74SBram Moolenaar  1
65787bc3f74SBram Moolenaar  norm! 5zl
65887bc3f74SBram Moolenaar  call assert_equal(lineA, getline('.'))
65987bc3f74SBram Moolenaar  call assert_equal(11, col('.'))
66087bc3f74SBram Moolenaar  call assert_equal(5, winsaveview()['leftcol'])
66187bc3f74SBram Moolenaar  norm! yl
66287bc3f74SBram Moolenaar  call assert_equal('k', @0)
66387bc3f74SBram Moolenaar
66487bc3f74SBram Moolenaar  " Test for zh
66587bc3f74SBram Moolenaar  norm! 2zh
66687bc3f74SBram Moolenaar  call assert_equal(lineA, getline('.'))
66787bc3f74SBram Moolenaar  call assert_equal(11, col('.'))
66887bc3f74SBram Moolenaar  norm! yl
66987bc3f74SBram Moolenaar  call assert_equal('k', @0)
67087bc3f74SBram Moolenaar  call assert_equal(3, winsaveview()['leftcol'])
67187bc3f74SBram Moolenaar
67287bc3f74SBram Moolenaar  " Test for zL
67387bc3f74SBram Moolenaar  norm! 0zL
67487bc3f74SBram Moolenaar  call assert_equal(16, col('.'))
67587bc3f74SBram Moolenaar  norm! yl
67687bc3f74SBram Moolenaar  call assert_equal('p', @0)
67787bc3f74SBram Moolenaar  call assert_equal(10, winsaveview()['leftcol'])
67887bc3f74SBram Moolenaar  norm! 2zL
67987bc3f74SBram Moolenaar  call assert_equal(26, col('.'))
68087bc3f74SBram Moolenaar  norm! yl
68187bc3f74SBram Moolenaar  call assert_equal('z', @0)
68287bc3f74SBram Moolenaar  call assert_equal(15, winsaveview()['leftcol'])
68387bc3f74SBram Moolenaar
68487bc3f74SBram Moolenaar  " Test for zH
68587bc3f74SBram Moolenaar  norm! 2zH
68687bc3f74SBram Moolenaar  call assert_equal(15, col('.'))
68787bc3f74SBram Moolenaar  call assert_equal(0, winsaveview()['leftcol'])
68887bc3f74SBram Moolenaar  norm! yl
68987bc3f74SBram Moolenaar  call assert_equal('o', @0)
69087bc3f74SBram Moolenaar
69187bc3f74SBram Moolenaar  " Test for zs
69287bc3f74SBram Moolenaar  norm! $zs
69387bc3f74SBram Moolenaar  call assert_equal(26, col('.'))
69487bc3f74SBram Moolenaar  call assert_equal(20, winsaveview()['leftcol'])
69587bc3f74SBram Moolenaar  norm! yl
69687bc3f74SBram Moolenaar  call assert_equal('z', @0)
69787bc3f74SBram Moolenaar
69887bc3f74SBram Moolenaar  " Test for ze
69987bc3f74SBram Moolenaar  norm! ze
70087bc3f74SBram Moolenaar  call assert_equal(26, col('.'))
70187bc3f74SBram Moolenaar  call assert_equal(11, winsaveview()['leftcol'])
70287bc3f74SBram Moolenaar  norm! yl
70387bc3f74SBram Moolenaar  call assert_equal('z', @0)
70487bc3f74SBram Moolenaar
70587bc3f74SBram Moolenaar  " cleanup
70687bc3f74SBram Moolenaar  set wrap listchars=eol:$ sidescrolloff=0
70787bc3f74SBram Moolenaar  bw!
7082931f2a5SBram Moolenaarendfunc
70987bc3f74SBram Moolenaar
71087bc3f74SBram Moolenaarfunc! Test_normal18_z_fold()
71187bc3f74SBram Moolenaar  " basic tests for foldopen/folddelete
71287bc3f74SBram Moolenaar  if !has("folding")
71387bc3f74SBram Moolenaar    return
71487bc3f74SBram Moolenaar  endif
71587bc3f74SBram Moolenaar  call Setup_NewWindow()
71687bc3f74SBram Moolenaar  50
71787bc3f74SBram Moolenaar  setl foldenable fdm=marker foldlevel=5
71887bc3f74SBram Moolenaar
71987bc3f74SBram Moolenaar  " Test for zF
72087bc3f74SBram Moolenaar  " First fold
72187bc3f74SBram Moolenaar  norm! 4zF
72287bc3f74SBram Moolenaar  " check that folds have been created
72387bc3f74SBram Moolenaar  call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53))
72487bc3f74SBram Moolenaar
72587bc3f74SBram Moolenaar  " Test for zd
72687bc3f74SBram Moolenaar  51
72787bc3f74SBram Moolenaar  norm! 2zF
72887bc3f74SBram Moolenaar  call assert_equal(2, foldlevel('.'))
72987bc3f74SBram Moolenaar  norm! kzd
73087bc3f74SBram Moolenaar  call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53))
73187bc3f74SBram Moolenaar  norm! j
73287bc3f74SBram Moolenaar  call assert_equal(1, foldlevel('.'))
73387bc3f74SBram Moolenaar
73487bc3f74SBram Moolenaar  " Test for zD
73587bc3f74SBram Moolenaar  " also deletes partially selected folds recursively
73687bc3f74SBram Moolenaar  51
73787bc3f74SBram Moolenaar  norm! zF
73887bc3f74SBram Moolenaar  call assert_equal(2, foldlevel('.'))
73987bc3f74SBram Moolenaar  norm! kV2jzD
74087bc3f74SBram Moolenaar  call assert_equal(['50', '51', '52', '53'], getline(50,53))
74187bc3f74SBram Moolenaar
74287bc3f74SBram Moolenaar  " Test for zE
74387bc3f74SBram Moolenaar  85
74487bc3f74SBram Moolenaar  norm! 4zF
74587bc3f74SBram Moolenaar  86
74687bc3f74SBram Moolenaar  norm! 2zF
74787bc3f74SBram Moolenaar  90
74887bc3f74SBram Moolenaar  norm! 4zF
74987bc3f74SBram Moolenaar  call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93))
75087bc3f74SBram Moolenaar  norm! zE
75187bc3f74SBram Moolenaar  call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93))
75287bc3f74SBram Moolenaar
75387bc3f74SBram Moolenaar  " Test for zn
75487bc3f74SBram Moolenaar  50
75587bc3f74SBram Moolenaar  set foldlevel=0
75687bc3f74SBram Moolenaar  norm! 2zF
75787bc3f74SBram Moolenaar  norm! zn
75887bc3f74SBram Moolenaar  norm! k
75987bc3f74SBram Moolenaar  call assert_equal('49', getline('.'))
76087bc3f74SBram Moolenaar  norm! j
76187bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
76287bc3f74SBram Moolenaar  norm! j
76387bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
76487bc3f74SBram Moolenaar  norm! j
76587bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
76687bc3f74SBram Moolenaar  call assert_equal(0, &foldenable)
76787bc3f74SBram Moolenaar
76887bc3f74SBram Moolenaar  " Test for zN
76987bc3f74SBram Moolenaar  49
77087bc3f74SBram Moolenaar  norm! zN
77187bc3f74SBram Moolenaar  call assert_equal('49', getline('.'))
77287bc3f74SBram Moolenaar  norm! j
77387bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
77487bc3f74SBram Moolenaar  norm! j
77587bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
77687bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
77787bc3f74SBram Moolenaar
77887bc3f74SBram Moolenaar  " Test for zi
77987bc3f74SBram Moolenaar  norm! zi
78087bc3f74SBram Moolenaar  call assert_equal(0, &foldenable)
78187bc3f74SBram Moolenaar  norm! zi
78287bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
78387bc3f74SBram Moolenaar  norm! zi
78487bc3f74SBram Moolenaar  call assert_equal(0, &foldenable)
78587bc3f74SBram Moolenaar  norm! zi
78687bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
78787bc3f74SBram Moolenaar
78887bc3f74SBram Moolenaar  " Test for za
78987bc3f74SBram Moolenaar  50
79087bc3f74SBram Moolenaar  norm! za
79187bc3f74SBram Moolenaar  norm! k
79287bc3f74SBram Moolenaar  call assert_equal('49', getline('.'))
79387bc3f74SBram Moolenaar  norm! j
79487bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
79587bc3f74SBram Moolenaar  norm! j
79687bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
79787bc3f74SBram Moolenaar  norm! j
79887bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
79987bc3f74SBram Moolenaar  50
80087bc3f74SBram Moolenaar  norm! za
80187bc3f74SBram Moolenaar  norm! k
80287bc3f74SBram Moolenaar  call assert_equal('49', getline('.'))
80387bc3f74SBram Moolenaar  norm! j
80487bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
80587bc3f74SBram Moolenaar  norm! j
80687bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
80787bc3f74SBram Moolenaar
80887bc3f74SBram Moolenaar  49
80987bc3f74SBram Moolenaar  norm! 5zF
81087bc3f74SBram Moolenaar  norm! k
81187bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
81287bc3f74SBram Moolenaar  norm! j
81387bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
81487bc3f74SBram Moolenaar  norm! j
81587bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
81687bc3f74SBram Moolenaar  49
81787bc3f74SBram Moolenaar  norm! za
81887bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
81987bc3f74SBram Moolenaar  norm! j
82087bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
82187bc3f74SBram Moolenaar  norm! j
82287bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
82387bc3f74SBram Moolenaar  set nofoldenable
82487bc3f74SBram Moolenaar  " close fold and set foldenable
82587bc3f74SBram Moolenaar  norm! za
82687bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
82787bc3f74SBram Moolenaar
82887bc3f74SBram Moolenaar  50
82987bc3f74SBram Moolenaar  " have to use {count}za to open all folds and make the cursor visible
83087bc3f74SBram Moolenaar  norm! 2za
83187bc3f74SBram Moolenaar  norm! 2k
83287bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
83387bc3f74SBram Moolenaar  norm! j
83487bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
83587bc3f74SBram Moolenaar  norm! j
83687bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
83787bc3f74SBram Moolenaar  norm! j
83887bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
83987bc3f74SBram Moolenaar  norm! j
84087bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
84187bc3f74SBram Moolenaar
84287bc3f74SBram Moolenaar  " Test for zA
84387bc3f74SBram Moolenaar  49
84487bc3f74SBram Moolenaar  set foldlevel=0
84587bc3f74SBram Moolenaar  50
84687bc3f74SBram Moolenaar  norm! zA
84787bc3f74SBram Moolenaar  norm! 2k
84887bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
84987bc3f74SBram Moolenaar  norm! j
85087bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
85187bc3f74SBram Moolenaar  norm! j
85287bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
85387bc3f74SBram Moolenaar  norm! j
85487bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
85587bc3f74SBram Moolenaar  norm! j
85687bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
85787bc3f74SBram Moolenaar
858395b6babSBram Moolenaar  " zA on a opened fold when foldenable is not set
85987bc3f74SBram Moolenaar  50
86087bc3f74SBram Moolenaar  set nofoldenable
86187bc3f74SBram Moolenaar  norm! zA
86287bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
86387bc3f74SBram Moolenaar  norm! k
86487bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
86587bc3f74SBram Moolenaar  norm! j
86687bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
86787bc3f74SBram Moolenaar  norm! j
86887bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
86987bc3f74SBram Moolenaar
87087bc3f74SBram Moolenaar  " Test for zc
87187bc3f74SBram Moolenaar  norm! zE
87287bc3f74SBram Moolenaar  50
87387bc3f74SBram Moolenaar  norm! 2zF
87487bc3f74SBram Moolenaar  49
87587bc3f74SBram Moolenaar  norm! 5zF
87687bc3f74SBram Moolenaar  set nofoldenable
87787bc3f74SBram Moolenaar  50
87887bc3f74SBram Moolenaar  " There most likely is a bug somewhere:
87987bc3f74SBram Moolenaar  " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ
88087bc3f74SBram Moolenaar  " TODO: Should this only close the inner most fold or both folds?
88187bc3f74SBram Moolenaar  norm! zc
88287bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
88387bc3f74SBram Moolenaar  norm! k
88487bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
88587bc3f74SBram Moolenaar  norm! j
88687bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
88787bc3f74SBram Moolenaar  norm! j
88887bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
88987bc3f74SBram Moolenaar  set nofoldenable
89087bc3f74SBram Moolenaar  50
89187bc3f74SBram Moolenaar  norm! Vjzc
89287bc3f74SBram Moolenaar  norm! k
89387bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
89487bc3f74SBram Moolenaar  norm! j
89587bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
89687bc3f74SBram Moolenaar  norm! j
89787bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
89887bc3f74SBram Moolenaar
89987bc3f74SBram Moolenaar  " Test for zC
90087bc3f74SBram Moolenaar  set nofoldenable
90187bc3f74SBram Moolenaar  50
90287bc3f74SBram Moolenaar  norm! zCk
90387bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
90487bc3f74SBram Moolenaar  norm! j
90587bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
90687bc3f74SBram Moolenaar  norm! j
90787bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
90887bc3f74SBram Moolenaar
90987bc3f74SBram Moolenaar  " Test for zx
91087bc3f74SBram Moolenaar  " 1) close folds at line 49-54
91187bc3f74SBram Moolenaar  set nofoldenable
91287bc3f74SBram Moolenaar  48
91387bc3f74SBram Moolenaar  norm! zx
91487bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
91587bc3f74SBram Moolenaar  norm! j
91687bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
91787bc3f74SBram Moolenaar  norm! j
91887bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
91987bc3f74SBram Moolenaar
920395b6babSBram Moolenaar  " 2) do not close fold under cursor
92187bc3f74SBram Moolenaar  51
92287bc3f74SBram Moolenaar  set nofoldenable
92387bc3f74SBram Moolenaar  norm! zx
92487bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
92587bc3f74SBram Moolenaar  norm! 3k
92687bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
92787bc3f74SBram Moolenaar  norm! j
92887bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
92987bc3f74SBram Moolenaar  norm! j
93087bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
93187bc3f74SBram Moolenaar  norm! j
93287bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
93387bc3f74SBram Moolenaar  norm! j
93487bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
93587bc3f74SBram Moolenaar  norm! j
93687bc3f74SBram Moolenaar  call assert_equal('53', getline('.'))
93787bc3f74SBram Moolenaar  norm! j
93887bc3f74SBram Moolenaar  call assert_equal('54/*}}}*/', getline('.'))
93987bc3f74SBram Moolenaar  norm! j
94087bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
94187bc3f74SBram Moolenaar
94287bc3f74SBram Moolenaar  " 3) close one level of folds
94387bc3f74SBram Moolenaar  48
94487bc3f74SBram Moolenaar  set nofoldenable
94587bc3f74SBram Moolenaar  set foldlevel=1
94687bc3f74SBram Moolenaar  norm! zx
94787bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
94887bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
94987bc3f74SBram Moolenaar  norm! j
95087bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
95187bc3f74SBram Moolenaar  norm! j
95287bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
95387bc3f74SBram Moolenaar  norm! j
95487bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
95587bc3f74SBram Moolenaar  norm! j
95687bc3f74SBram Moolenaar  call assert_equal('53', getline('.'))
95787bc3f74SBram Moolenaar  norm! j
95887bc3f74SBram Moolenaar  call assert_equal('54/*}}}*/', getline('.'))
95987bc3f74SBram Moolenaar  norm! j
96087bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
96187bc3f74SBram Moolenaar
96287bc3f74SBram Moolenaar  " Test for zX
96387bc3f74SBram Moolenaar  " Close all folds
96487bc3f74SBram Moolenaar  set foldlevel=0 nofoldenable
96587bc3f74SBram Moolenaar  50
96687bc3f74SBram Moolenaar  norm! zX
96787bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
96887bc3f74SBram Moolenaar  norm! k
96987bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
97087bc3f74SBram Moolenaar  norm! j
97187bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
97287bc3f74SBram Moolenaar  norm! j
97387bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
97487bc3f74SBram Moolenaar
97587bc3f74SBram Moolenaar  " Test for zm
97687bc3f74SBram Moolenaar  50
97787bc3f74SBram Moolenaar  set nofoldenable foldlevel=2
97887bc3f74SBram Moolenaar  norm! zm
97987bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
98087bc3f74SBram Moolenaar  call assert_equal(1, &foldlevel)
98187bc3f74SBram Moolenaar  norm! zm
98287bc3f74SBram Moolenaar  call assert_equal(0, &foldlevel)
98387bc3f74SBram Moolenaar  norm! zm
98487bc3f74SBram Moolenaar  call assert_equal(0, &foldlevel)
98587bc3f74SBram Moolenaar  norm! k
98687bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
98787bc3f74SBram Moolenaar  norm! j
98887bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
98987bc3f74SBram Moolenaar  norm! j
99087bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
99187bc3f74SBram Moolenaar
99287bc3f74SBram Moolenaar  " Test for zM
99387bc3f74SBram Moolenaar  48
99487bc3f74SBram Moolenaar  set nofoldenable foldlevel=99
99587bc3f74SBram Moolenaar  norm! zM
99687bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
99787bc3f74SBram Moolenaar  call assert_equal(0, &foldlevel)
99887bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
99987bc3f74SBram Moolenaar  norm! j
100087bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
100187bc3f74SBram Moolenaar  norm! j
100287bc3f74SBram Moolenaar  call assert_equal('55', getline('.'))
100387bc3f74SBram Moolenaar
100487bc3f74SBram Moolenaar  " Test for zr
100587bc3f74SBram Moolenaar  48
100687bc3f74SBram Moolenaar  set nofoldenable foldlevel=0
100787bc3f74SBram Moolenaar  norm! zr
100887bc3f74SBram Moolenaar  call assert_equal(0, &foldenable)
100987bc3f74SBram Moolenaar  call assert_equal(1, &foldlevel)
101087bc3f74SBram Moolenaar  set foldlevel=0 foldenable
101187bc3f74SBram Moolenaar  norm! zr
101287bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
101387bc3f74SBram Moolenaar  call assert_equal(1, &foldlevel)
101487bc3f74SBram Moolenaar  norm! zr
101587bc3f74SBram Moolenaar  call assert_equal(2, &foldlevel)
101687bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
101787bc3f74SBram Moolenaar  norm! j
101887bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
101987bc3f74SBram Moolenaar  norm! j
102087bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
102187bc3f74SBram Moolenaar  norm! j
102287bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
102387bc3f74SBram Moolenaar  norm! j
102487bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
102587bc3f74SBram Moolenaar
102687bc3f74SBram Moolenaar  " Test for zR
102787bc3f74SBram Moolenaar  48
102887bc3f74SBram Moolenaar  set nofoldenable foldlevel=0
102987bc3f74SBram Moolenaar  norm! zR
103087bc3f74SBram Moolenaar  call assert_equal(0, &foldenable)
103187bc3f74SBram Moolenaar  call assert_equal(2, &foldlevel)
103287bc3f74SBram Moolenaar  set foldenable foldlevel=0
103387bc3f74SBram Moolenaar  norm! zR
103487bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
103587bc3f74SBram Moolenaar  call assert_equal(2, &foldlevel)
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('51/*}}}*/', getline('.'))
104387bc3f74SBram Moolenaar  norm! j
104487bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
104587bc3f74SBram Moolenaar  call append(50, ['a /*{{{*/', 'b /*}}}*/'])
104687bc3f74SBram Moolenaar  48
104787bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
104887bc3f74SBram Moolenaar  norm! j
104987bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
105087bc3f74SBram Moolenaar  norm! j
105187bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
105287bc3f74SBram Moolenaar  norm! j
105387bc3f74SBram Moolenaar  call assert_equal('a /*{{{*/', getline('.'))
105487bc3f74SBram Moolenaar  norm! j
105587bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
105687bc3f74SBram Moolenaar  norm! j
105787bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
105887bc3f74SBram Moolenaar  48
105987bc3f74SBram Moolenaar  norm! zR
106087bc3f74SBram Moolenaar  call assert_equal(1, &foldenable)
106187bc3f74SBram Moolenaar  call assert_equal(3, &foldlevel)
106287bc3f74SBram Moolenaar  call assert_equal('48', getline('.'))
106387bc3f74SBram Moolenaar  norm! j
106487bc3f74SBram Moolenaar  call assert_equal('49/*{{{*/', getline('.'))
106587bc3f74SBram Moolenaar  norm! j
106687bc3f74SBram Moolenaar  call assert_equal('50/*{{{*/', getline('.'))
106787bc3f74SBram Moolenaar  norm! j
106887bc3f74SBram Moolenaar  call assert_equal('a /*{{{*/', getline('.'))
106987bc3f74SBram Moolenaar  norm! j
107087bc3f74SBram Moolenaar  call assert_equal('b /*}}}*/', getline('.'))
107187bc3f74SBram Moolenaar  norm! j
107287bc3f74SBram Moolenaar  call assert_equal('51/*}}}*/', getline('.'))
107387bc3f74SBram Moolenaar  norm! j
107487bc3f74SBram Moolenaar  call assert_equal('52', getline('.'))
107587bc3f74SBram Moolenaar
107687bc3f74SBram Moolenaar  " clean up
107787bc3f74SBram Moolenaar  setl nofoldenable fdm=marker foldlevel=0
107887bc3f74SBram Moolenaar  bw!
10792931f2a5SBram Moolenaarendfunc
108087bc3f74SBram Moolenaar
108187bc3f74SBram Moolenaarfunc! Test_normal19_z_spell()
108287bc3f74SBram Moolenaar  if !has("spell") || !has('syntax')
108387bc3f74SBram Moolenaar    return
108487bc3f74SBram Moolenaar  endif
108587bc3f74SBram Moolenaar  new
108687bc3f74SBram Moolenaar  call append(0, ['1 good', '2 goood', '3 goood'])
108787bc3f74SBram Moolenaar  set spell spellfile=./Xspellfile.add spelllang=en
108887bc3f74SBram Moolenaar  let oldlang=v:lang
108987bc3f74SBram Moolenaar  lang C
109087bc3f74SBram Moolenaar
109187bc3f74SBram Moolenaar  " Test for zg
109287bc3f74SBram Moolenaar  1
109387bc3f74SBram Moolenaar  norm! ]s
109487bc3f74SBram Moolenaar  call assert_equal('2 goood', getline('.'))
109587bc3f74SBram Moolenaar  norm! zg
109687bc3f74SBram Moolenaar  1
109787bc3f74SBram Moolenaar  let a=execute('unsilent :norm! ]s')
109887bc3f74SBram Moolenaar  call assert_equal('1 good', getline('.'))
109987bc3f74SBram Moolenaar  call assert_equal('search hit BOTTOM, continuing at TOP', a[1:])
110087bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
110187bc3f74SBram Moolenaar  call assert_equal('goood', cnt[0])
110287bc3f74SBram Moolenaar
110387bc3f74SBram Moolenaar  " Test for zw
110487bc3f74SBram Moolenaar  2
110587bc3f74SBram Moolenaar  norm! $zw
110687bc3f74SBram Moolenaar  1
110787bc3f74SBram Moolenaar  norm! ]s
110887bc3f74SBram Moolenaar  call assert_equal('2 goood', getline('.'))
110987bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
111087bc3f74SBram Moolenaar  call assert_equal('#oood', cnt[0])
111187bc3f74SBram Moolenaar  call assert_equal('goood/!', cnt[1])
111287bc3f74SBram Moolenaar
111387bc3f74SBram Moolenaar  " Test for zg in visual mode
111487bc3f74SBram Moolenaar  let a=execute('unsilent :norm! V$zg')
111587bc3f74SBram Moolenaar  call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
111687bc3f74SBram Moolenaar  1
111787bc3f74SBram Moolenaar  norm! ]s
111887bc3f74SBram Moolenaar  call assert_equal('3 goood', getline('.'))
111987bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
112087bc3f74SBram Moolenaar  call assert_equal('2 goood', cnt[2])
112187bc3f74SBram Moolenaar  " Remove "2 good" from spellfile
112287bc3f74SBram Moolenaar  2
112387bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zw')
112487bc3f74SBram Moolenaar  call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
112587bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
112687bc3f74SBram Moolenaar  call assert_equal('2 goood/!', cnt[3])
112787bc3f74SBram Moolenaar
112887bc3f74SBram Moolenaar  " Test for zG
112987bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zG')
113087bc3f74SBram Moolenaar  call assert_match("Word '2 goood' added to .*", a)
113187bc3f74SBram Moolenaar  let fname=matchstr(a, 'to\s\+\zs\f\+$')
113287bc3f74SBram Moolenaar  let cnt=readfile(fname)
113387bc3f74SBram Moolenaar  call assert_equal('2 goood', cnt[0])
113487bc3f74SBram Moolenaar
113587bc3f74SBram Moolenaar  " Test for zW
113687bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zW')
113787bc3f74SBram Moolenaar  call assert_match("Word '2 goood' added to .*", a)
113887bc3f74SBram Moolenaar  let cnt=readfile(fname)
113987bc3f74SBram Moolenaar  call assert_equal('# goood', cnt[0])
114087bc3f74SBram Moolenaar  call assert_equal('2 goood/!', cnt[1])
114187bc3f74SBram Moolenaar
114287bc3f74SBram Moolenaar  " Test for zuW
114387bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zuW')
114487bc3f74SBram Moolenaar  call assert_match("Word '2 goood' removed from .*", a)
114587bc3f74SBram Moolenaar  let cnt=readfile(fname)
114687bc3f74SBram Moolenaar  call assert_equal('# goood', cnt[0])
114787bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[1])
114887bc3f74SBram Moolenaar
114987bc3f74SBram Moolenaar  " Test for zuG
115087bc3f74SBram Moolenaar  let a=execute('unsilent norm! $zG')
115187bc3f74SBram Moolenaar  call assert_match("Word 'goood' added to .*", a)
115287bc3f74SBram Moolenaar  let cnt=readfile(fname)
115387bc3f74SBram Moolenaar  call assert_equal('# goood', cnt[0])
115487bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[1])
115587bc3f74SBram Moolenaar  call assert_equal('goood', cnt[2])
115687bc3f74SBram Moolenaar  let a=execute('unsilent norm! $zuG')
115787bc3f74SBram Moolenaar  let cnt=readfile(fname)
115887bc3f74SBram Moolenaar  call assert_match("Word 'goood' removed from .*", a)
115987bc3f74SBram Moolenaar  call assert_equal('# goood', cnt[0])
116087bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[1])
116187bc3f74SBram Moolenaar  call assert_equal('#oood', cnt[2])
116287bc3f74SBram Moolenaar  " word not found in wordlist
116387bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zuG')
116487bc3f74SBram Moolenaar  let cnt=readfile(fname)
116587bc3f74SBram Moolenaar  call assert_match("", a)
116687bc3f74SBram Moolenaar  call assert_equal('# goood', cnt[0])
116787bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[1])
116887bc3f74SBram Moolenaar  call assert_equal('#oood', cnt[2])
116987bc3f74SBram Moolenaar
117087bc3f74SBram Moolenaar  " Test for zug
117187bc3f74SBram Moolenaar  call delete('./Xspellfile.add')
117287bc3f74SBram Moolenaar  2
117387bc3f74SBram Moolenaar  let a=execute('unsilent norm! $zg')
117487bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
117587bc3f74SBram Moolenaar  call assert_equal('goood', cnt[0])
117687bc3f74SBram Moolenaar  let a=execute('unsilent norm! $zug')
117787bc3f74SBram Moolenaar  call assert_match("Word 'goood' removed from \./Xspellfile.add", a)
117887bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
117987bc3f74SBram Moolenaar  call assert_equal('#oood', cnt[0])
118087bc3f74SBram Moolenaar  " word not in wordlist
118187bc3f74SBram Moolenaar  let a=execute('unsilent norm! V$zug')
118287bc3f74SBram Moolenaar  call assert_match('', a)
118387bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
118487bc3f74SBram Moolenaar  call assert_equal('#oood', cnt[0])
118587bc3f74SBram Moolenaar
118687bc3f74SBram Moolenaar  " Test for zuw
118787bc3f74SBram Moolenaar  call delete('./Xspellfile.add')
118887bc3f74SBram Moolenaar  2
118987bc3f74SBram Moolenaar  let a=execute('unsilent norm! Vzw')
119087bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
119187bc3f74SBram Moolenaar  call assert_equal('2 goood/!', cnt[0])
119287bc3f74SBram Moolenaar  let a=execute('unsilent norm! Vzuw')
119387bc3f74SBram Moolenaar  call assert_match("Word '2 goood' removed from \./Xspellfile.add", a)
119487bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
119587bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[0])
119687bc3f74SBram Moolenaar  " word not in wordlist
119787bc3f74SBram Moolenaar  let a=execute('unsilent norm! $zug')
119887bc3f74SBram Moolenaar  call assert_match('', a)
119987bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile.add')
120087bc3f74SBram Moolenaar  call assert_equal('# goood/!', cnt[0])
120187bc3f74SBram Moolenaar
120287bc3f74SBram Moolenaar  " add second entry to spellfile setting
120387bc3f74SBram Moolenaar  set spellfile=./Xspellfile.add,./Xspellfile2.add
120487bc3f74SBram Moolenaar  call delete('./Xspellfile.add')
120587bc3f74SBram Moolenaar  2
120687bc3f74SBram Moolenaar  let a=execute('unsilent norm! $2zg')
120787bc3f74SBram Moolenaar  let cnt=readfile('./Xspellfile2.add')
120887bc3f74SBram Moolenaar  call assert_match("Word 'goood' added to ./Xspellfile2.add", a)
120987bc3f74SBram Moolenaar  call assert_equal('goood', cnt[0])
121087bc3f74SBram Moolenaar
1211f45938ccSBram Moolenaar  " Test for :spellgood!
1212f45938ccSBram Moolenaar  let temp = execute(':spe!0/0')
1213f45938ccSBram Moolenaar  call assert_match('Invalid region', temp)
1214f45938ccSBram Moolenaar  let spellfile = matchstr(temp, 'Invalid region nr in \zs.*\ze line \d: 0')
1215f45938ccSBram Moolenaar  call assert_equal(['# goood', '# goood/!', '#oood', '0/0'], readfile(spellfile))
1216f45938ccSBram Moolenaar  call delete(spellfile)
1217f45938ccSBram Moolenaar
121887bc3f74SBram Moolenaar  " clean up
121987bc3f74SBram Moolenaar  exe "lang" oldlang
122087bc3f74SBram Moolenaar  call delete("./Xspellfile.add")
122187bc3f74SBram Moolenaar  call delete("./Xspellfile2.add")
1222df0db16cSBram Moolenaar  call delete("./Xspellfile.add.spl")
1223df0db16cSBram Moolenaar  call delete("./Xspellfile2.add.spl")
122487bc3f74SBram Moolenaar
122587bc3f74SBram Moolenaar  " zux -> no-op
122687bc3f74SBram Moolenaar  2
122787bc3f74SBram Moolenaar  norm! $zux
122887bc3f74SBram Moolenaar  call assert_equal([], glob('Xspellfile.add',0,1))
122987bc3f74SBram Moolenaar  call assert_equal([], glob('Xspellfile2.add',0,1))
123087bc3f74SBram Moolenaar
123187bc3f74SBram Moolenaar  set spellfile=
123287bc3f74SBram Moolenaar  bw!
12332931f2a5SBram Moolenaarendfunc
123487bc3f74SBram Moolenaar
123587bc3f74SBram Moolenaarfunc! Test_normal20_exmode()
12360913a108SBram Moolenaar  if !has("unix")
12370913a108SBram Moolenaar    " Reading from redirected file doesn't work on MS-Windows
123887bc3f74SBram Moolenaar    return
123987bc3f74SBram Moolenaar  endif
124087bc3f74SBram Moolenaar  call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript')
124187bc3f74SBram Moolenaar  call writefile(['1', '2'], 'Xfile')
124287bc3f74SBram Moolenaar  call system(v:progpath .' -e -s < Xscript Xfile')
124387bc3f74SBram Moolenaar  let a=readfile('Xfile2')
124487bc3f74SBram Moolenaar  call assert_equal(['1', 'foo', 'bar', '2'], a)
124587bc3f74SBram Moolenaar
124687bc3f74SBram Moolenaar  " clean up
124787bc3f74SBram Moolenaar  for file in ['Xfile', 'Xfile2', 'Xscript']
124887bc3f74SBram Moolenaar    call delete(file)
124987bc3f74SBram Moolenaar  endfor
125087bc3f74SBram Moolenaar  bw!
12512931f2a5SBram Moolenaarendfunc
125287bc3f74SBram Moolenaar
125387bc3f74SBram Moolenaarfunc! Test_normal21_nv_hat()
125487bc3f74SBram Moolenaar  set hidden
12552931f2a5SBram Moolenaar  new
12562931f2a5SBram Moolenaar  " to many buffers opened already, will not work
12572931f2a5SBram Moolenaar  "call assert_fails(":b#", 'E23')
12582931f2a5SBram Moolenaar  "call assert_equal('', @#)
125987bc3f74SBram Moolenaar  e Xfoobar
126087bc3f74SBram Moolenaar  e Xfile2
126187bc3f74SBram Moolenaar  call feedkeys("\<c-^>", 't')
126287bc3f74SBram Moolenaar  call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t'))
126387bc3f74SBram Moolenaar  call feedkeys("f\<c-^>", 't')
126487bc3f74SBram Moolenaar  call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t'))
126587bc3f74SBram Moolenaar  " clean up
126687bc3f74SBram Moolenaar  set nohidden
126787bc3f74SBram Moolenaar  bw!
12682931f2a5SBram Moolenaarendfunc
126987bc3f74SBram Moolenaar
127087bc3f74SBram Moolenaarfunc! Test_normal22_zet()
127187bc3f74SBram Moolenaar  " Test for ZZ
12720913a108SBram Moolenaar  " let shell = &shell
12730913a108SBram Moolenaar  " let &shell = 'sh'
127487bc3f74SBram Moolenaar  call writefile(['1', '2'], 'Xfile')
127587bc3f74SBram Moolenaar  let args = ' -u NONE -N -U NONE -i NONE --noplugins -X --not-a-term'
127687bc3f74SBram Moolenaar  call system(v:progpath . args . ' -c "%d" -c ":norm! ZZ" Xfile')
127787bc3f74SBram Moolenaar  let a = readfile('Xfile')
127887bc3f74SBram Moolenaar  call assert_equal([], a)
127987bc3f74SBram Moolenaar  " Test for ZQ
128087bc3f74SBram Moolenaar  call writefile(['1', '2'], 'Xfile')
128187bc3f74SBram Moolenaar  call system(v:progpath . args . ' -c "%d" -c ":norm! ZQ" Xfile')
128287bc3f74SBram Moolenaar  let a = readfile('Xfile')
128387bc3f74SBram Moolenaar  call assert_equal(['1', '2'], a)
128487bc3f74SBram Moolenaar
128587bc3f74SBram Moolenaar  " clean up
128687bc3f74SBram Moolenaar  for file in ['Xfile']
128787bc3f74SBram Moolenaar    call delete(file)
128887bc3f74SBram Moolenaar  endfor
12890913a108SBram Moolenaar  " let &shell = shell
12902931f2a5SBram Moolenaarendfunc
129187bc3f74SBram Moolenaar
129287bc3f74SBram Moolenaarfunc! Test_normal23_K()
129387bc3f74SBram Moolenaar  " Test for K command
129487bc3f74SBram Moolenaar  new
1295426f3754SBram Moolenaar  call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd'])
129687bc3f74SBram Moolenaar  let k = &keywordprg
129787bc3f74SBram Moolenaar  set keywordprg=:help
129887bc3f74SBram Moolenaar  1
129987bc3f74SBram Moolenaar  norm! VK
130087bc3f74SBram Moolenaar  call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
130187bc3f74SBram Moolenaar  call assert_equal('help', &ft)
130287bc3f74SBram Moolenaar  call assert_match('\*version8.txt\*', getline('.'))
130387bc3f74SBram Moolenaar  helpclose
130487bc3f74SBram Moolenaar  norm! 0K
130587bc3f74SBram Moolenaar  call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
130687bc3f74SBram Moolenaar  call assert_equal('help', &ft)
130787bc3f74SBram Moolenaar  call assert_match('\*version8\.0\*', getline('.'))
130887bc3f74SBram Moolenaar  helpclose
130987bc3f74SBram Moolenaar
1310426f3754SBram Moolenaar  set keywordprg=:new
1311426f3754SBram Moolenaar  set iskeyword+=%
1312426f3754SBram Moolenaar  set iskeyword+=\|
1313426f3754SBram Moolenaar  2
1314426f3754SBram Moolenaar  norm! K
1315426f3754SBram Moolenaar  call assert_equal('man', fnamemodify(bufname('%'), ':t'))
1316426f3754SBram Moolenaar  bwipe!
1317426f3754SBram Moolenaar  3
1318426f3754SBram Moolenaar  norm! K
1319426f3754SBram Moolenaar  call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t'))
1320426f3754SBram Moolenaar  bwipe!
1321eb828d01SBram Moolenaar  if !has('win32')
1322426f3754SBram Moolenaar    4
1323426f3754SBram Moolenaar    norm! K
1324426f3754SBram Moolenaar    call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t'))
1325426f3754SBram Moolenaar    bwipe!
1326eb828d01SBram Moolenaar  endif
1327426f3754SBram Moolenaar  set iskeyword-=%
1328426f3754SBram Moolenaar  set iskeyword-=\|
1329426f3754SBram Moolenaar
13300913a108SBram Moolenaar  " Only expect "man" to work on Unix
13310913a108SBram Moolenaar  if !has("unix")
133287bc3f74SBram Moolenaar    let &keywordprg = k
133387bc3f74SBram Moolenaar    bw!
133487bc3f74SBram Moolenaar    return
133587bc3f74SBram Moolenaar  endif
133687bc3f74SBram Moolenaar  set keywordprg=man\ --pager=cat
133787bc3f74SBram Moolenaar  " Test for using man
133887bc3f74SBram Moolenaar  2
133987bc3f74SBram Moolenaar  let a = execute('unsilent norm! K')
134087bc3f74SBram Moolenaar  call assert_match("man --pager=cat 'man'", a)
134187bc3f74SBram Moolenaar
134287bc3f74SBram Moolenaar  " clean up
134387bc3f74SBram Moolenaar  let &keywordprg = k
134487bc3f74SBram Moolenaar  bw!
13452931f2a5SBram Moolenaarendfunc
134687bc3f74SBram Moolenaar
134787bc3f74SBram Moolenaarfunc! Test_normal24_rot13()
134887bc3f74SBram Moolenaar  " This test uses multi byte characters
134987bc3f74SBram Moolenaar  if !has("multi_byte")
135087bc3f74SBram Moolenaar    return
135187bc3f74SBram Moolenaar  endif
135287bc3f74SBram Moolenaar  " Testing for g?? g?g?
135387bc3f74SBram Moolenaar  new
135487bc3f74SBram Moolenaar  call append(0, 'abcdefghijklmnopqrstuvwxyzäüö')
135587bc3f74SBram Moolenaar  1
135687bc3f74SBram Moolenaar  norm! g??
135787bc3f74SBram Moolenaar  call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.'))
135887bc3f74SBram Moolenaar  norm! g?g?
135987bc3f74SBram Moolenaar  call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.'))
136087bc3f74SBram Moolenaar
136187bc3f74SBram Moolenaar  " clean up
136287bc3f74SBram Moolenaar  bw!
13632931f2a5SBram Moolenaarendfunc
136487bc3f74SBram Moolenaar
136587bc3f74SBram Moolenaarfunc! Test_normal25_tag()
136687bc3f74SBram Moolenaar  " Testing for CTRL-] g CTRL-] g]
136787bc3f74SBram Moolenaar  " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-]
136887bc3f74SBram Moolenaar  h
136987bc3f74SBram Moolenaar  " Test for CTRL-]
137087bc3f74SBram Moolenaar  call search('\<x\>$')
137187bc3f74SBram Moolenaar  exe "norm! \<c-]>"
137287bc3f74SBram Moolenaar  call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
137387bc3f74SBram Moolenaar  norm! yiW
137487bc3f74SBram Moolenaar  call assert_equal("*x*", @0)
137587bc3f74SBram Moolenaar  exe ":norm \<c-o>"
137687bc3f74SBram Moolenaar
137787bc3f74SBram Moolenaar  " Test for g_CTRL-]
137887bc3f74SBram Moolenaar  call search('\<v_u\>$')
137987bc3f74SBram Moolenaar  exe "norm! g\<c-]>"
138087bc3f74SBram Moolenaar  call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
138187bc3f74SBram Moolenaar  norm! yiW
138287bc3f74SBram Moolenaar  call assert_equal("*v_u*", @0)
138387bc3f74SBram Moolenaar  exe ":norm \<c-o>"
138487bc3f74SBram Moolenaar
138587bc3f74SBram Moolenaar  " Test for g]
138687bc3f74SBram Moolenaar  call search('\<i_<Esc>$')
138787bc3f74SBram Moolenaar  let a = execute(":norm! g]")
138887bc3f74SBram Moolenaar  call assert_match('i_<Esc>.*insert.txt', a)
138987bc3f74SBram Moolenaar
139087bc3f74SBram Moolenaar  if !empty(exepath('cscope')) && has('cscope')
139187bc3f74SBram Moolenaar    " setting cscopetag changes how g] works
139287bc3f74SBram Moolenaar    set cst
139387bc3f74SBram Moolenaar    exe "norm! g]"
139487bc3f74SBram Moolenaar    call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
139587bc3f74SBram Moolenaar    norm! yiW
139687bc3f74SBram Moolenaar    call assert_equal("*i_<Esc>*", @0)
139787bc3f74SBram Moolenaar    exe ":norm \<c-o>"
139887bc3f74SBram Moolenaar    " Test for CTRL-W g]
139987bc3f74SBram Moolenaar    exe "norm! \<C-W>g]"
140087bc3f74SBram Moolenaar    call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
140187bc3f74SBram Moolenaar    norm! yiW
140287bc3f74SBram Moolenaar    call assert_equal("*i_<Esc>*", @0)
140387bc3f74SBram Moolenaar    call assert_equal(3, winnr('$'))
140487bc3f74SBram Moolenaar    helpclose
140587bc3f74SBram Moolenaar    set nocst
140687bc3f74SBram Moolenaar  endif
140787bc3f74SBram Moolenaar
140887bc3f74SBram Moolenaar  " Test for CTRL-W g]
140987bc3f74SBram Moolenaar  let a = execute("norm! \<C-W>g]")
141087bc3f74SBram Moolenaar  call assert_match('i_<Esc>.*insert.txt', a)
141187bc3f74SBram Moolenaar
141287bc3f74SBram Moolenaar  " Test for CTRL-W CTRL-]
141387bc3f74SBram Moolenaar  exe "norm! \<C-W>\<C-]>"
141487bc3f74SBram Moolenaar  call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
141587bc3f74SBram Moolenaar  norm! yiW
141687bc3f74SBram Moolenaar  call assert_equal("*i_<Esc>*", @0)
141787bc3f74SBram Moolenaar  call assert_equal(3, winnr('$'))
141887bc3f74SBram Moolenaar  helpclose
141987bc3f74SBram Moolenaar
142087bc3f74SBram Moolenaar  " Test for CTRL-W g CTRL-]
142187bc3f74SBram Moolenaar  exe "norm! \<C-W>g\<C-]>"
142287bc3f74SBram Moolenaar  call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
142387bc3f74SBram Moolenaar  norm! yiW
142487bc3f74SBram Moolenaar  call assert_equal("*i_<Esc>*", @0)
142587bc3f74SBram Moolenaar  call assert_equal(3, winnr('$'))
142687bc3f74SBram Moolenaar  helpclose
142787bc3f74SBram Moolenaar
142887bc3f74SBram Moolenaar  " clean up
142987bc3f74SBram Moolenaar  helpclose
14302931f2a5SBram Moolenaarendfunc
143187bc3f74SBram Moolenaar
143287bc3f74SBram Moolenaarfunc! Test_normal26_put()
143387bc3f74SBram Moolenaar  " Test for ]p ]P [p and [P
143487bc3f74SBram Moolenaar  new
143587bc3f74SBram Moolenaar  call append(0, ['while read LINE', 'do', '  ((count++))', '  if [ $? -ne 0 ]; then', "    echo 'Error writing file'", '  fi', 'done'])
143687bc3f74SBram Moolenaar  1
143787bc3f74SBram Moolenaar  /Error/y a
143887bc3f74SBram Moolenaar  2
143987bc3f74SBram Moolenaar  norm! "a]pj"a[p
144087bc3f74SBram Moolenaar  call assert_equal(['do', "echo 'Error writing file'", "  echo 'Error writing file'", '  ((count++))'], getline(2,5))
144187bc3f74SBram Moolenaar  1
144287bc3f74SBram Moolenaar  /^\s\{4}/
144387bc3f74SBram Moolenaar  exe "norm!  \"a]P3Eldt'"
144487bc3f74SBram Moolenaar  exe "norm! j\"a[P2Eldt'"
144587bc3f74SBram Moolenaar  call assert_equal(['  if [ $? -ne 0 ]; then', "    echo 'Error writing'", "    echo 'Error'", "    echo 'Error writing file'", '  fi'], getline(6,10))
144687bc3f74SBram Moolenaar
144787bc3f74SBram Moolenaar  " clean up
144887bc3f74SBram Moolenaar  bw!
14492931f2a5SBram Moolenaarendfunc
145087bc3f74SBram Moolenaar
145187bc3f74SBram Moolenaarfunc! Test_normal27_bracket()
145287bc3f74SBram Moolenaar  " Test for [' [` ]' ]`
145387bc3f74SBram Moolenaar  call Setup_NewWindow()
145487bc3f74SBram Moolenaar  1,21s/.\+/  &   b/
145587bc3f74SBram Moolenaar  1
145687bc3f74SBram Moolenaar  norm! $ma
145787bc3f74SBram Moolenaar  5
145887bc3f74SBram Moolenaar  norm! $mb
145987bc3f74SBram Moolenaar  10
146087bc3f74SBram Moolenaar  norm! $mc
146187bc3f74SBram Moolenaar  15
146287bc3f74SBram Moolenaar  norm! $md
146387bc3f74SBram Moolenaar  20
146487bc3f74SBram Moolenaar  norm! $me
146587bc3f74SBram Moolenaar
146687bc3f74SBram Moolenaar  " Test for ['
146787bc3f74SBram Moolenaar  9
146887bc3f74SBram Moolenaar  norm! 2['
146987bc3f74SBram Moolenaar  call assert_equal('  1   b', getline('.'))
147087bc3f74SBram Moolenaar  call assert_equal(1, line('.'))
147187bc3f74SBram Moolenaar  call assert_equal(3, col('.'))
147287bc3f74SBram Moolenaar
147387bc3f74SBram Moolenaar  " Test for ]'
147487bc3f74SBram Moolenaar  norm! ]'
147587bc3f74SBram Moolenaar  call assert_equal('  5   b', getline('.'))
147687bc3f74SBram Moolenaar  call assert_equal(5, line('.'))
147787bc3f74SBram Moolenaar  call assert_equal(3, col('.'))
147887bc3f74SBram Moolenaar
147987bc3f74SBram Moolenaar  " No mark after line 21, cursor moves to first non blank on current line
148087bc3f74SBram Moolenaar  21
148187bc3f74SBram Moolenaar  norm! $]'
148287bc3f74SBram Moolenaar  call assert_equal('  21   b', getline('.'))
148387bc3f74SBram Moolenaar  call assert_equal(21, line('.'))
148487bc3f74SBram Moolenaar  call assert_equal(3, col('.'))
148587bc3f74SBram Moolenaar
148687bc3f74SBram Moolenaar  " Test for [`
148787bc3f74SBram Moolenaar  norm! 2[`
148887bc3f74SBram Moolenaar  call assert_equal('  15   b', getline('.'))
148987bc3f74SBram Moolenaar  call assert_equal(15, line('.'))
149087bc3f74SBram Moolenaar  call assert_equal(8, col('.'))
149187bc3f74SBram Moolenaar
149287bc3f74SBram Moolenaar  " Test for ]`
149387bc3f74SBram Moolenaar  norm! ]`
149487bc3f74SBram Moolenaar  call assert_equal('  20   b', getline('.'))
149587bc3f74SBram Moolenaar  call assert_equal(20, line('.'))
149687bc3f74SBram Moolenaar  call assert_equal(8, col('.'))
149787bc3f74SBram Moolenaar
149887bc3f74SBram Moolenaar  " clean up
149987bc3f74SBram Moolenaar  bw!
15002931f2a5SBram Moolenaarendfunc
150187bc3f74SBram Moolenaar
150287bc3f74SBram Moolenaarfunc! Test_normal28_parenthesis()
150387bc3f74SBram Moolenaar  " basic testing for ( and )
150487bc3f74SBram Moolenaar  new
150587bc3f74SBram Moolenaar  call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
150687bc3f74SBram Moolenaar
150787bc3f74SBram Moolenaar  $
150887bc3f74SBram Moolenaar  norm! d(
150987bc3f74SBram Moolenaar  call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$'))
151087bc3f74SBram Moolenaar  norm! 2d(
151187bc3f74SBram Moolenaar  call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$'))
151287bc3f74SBram Moolenaar  1
151387bc3f74SBram Moolenaar  norm! 0d)
151487bc3f74SBram Moolenaar  call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$'))
151587bc3f74SBram Moolenaar
151687bc3f74SBram Moolenaar  call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. '])
151787bc3f74SBram Moolenaar  $
151887bc3f74SBram Moolenaar  norm! $d(
151987bc3f74SBram Moolenaar  call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$'))
152087bc3f74SBram Moolenaar
152187bc3f74SBram Moolenaar  " clean up
152287bc3f74SBram Moolenaar  bw!
15232931f2a5SBram Moolenaarendfunc
152487bc3f74SBram Moolenaar
152587bc3f74SBram Moolenaarfun! Test_normal29_brace()
152687bc3f74SBram Moolenaar  " basic test for { and } movements
152787bc3f74SBram Moolenaar  let text= ['A paragraph begins after each empty line, and also at each of a set of',
152887bc3f74SBram Moolenaar  \ 'paragraph macros, specified by the pairs of characters in the ''paragraphs''',
152987bc3f74SBram Moolenaar  \ 'option.  The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to',
153087bc3f74SBram Moolenaar  \ 'the macros ".IP", ".LP", etc.  (These are nroff macros, so the dot must be in',
153187bc3f74SBram Moolenaar  \ 'the first column).  A section boundary is also a paragraph boundary.',
153287bc3f74SBram Moolenaar  \ 'Note that a blank line (only containing white space) is NOT a paragraph',
153387bc3f74SBram Moolenaar  \ 'boundary.',
153487bc3f74SBram Moolenaar  \ '',
153587bc3f74SBram Moolenaar  \ '',
153687bc3f74SBram Moolenaar  \ 'Also note that this does not include a ''{'' or ''}'' in the first column.  When',
153787bc3f74SBram Moolenaar  \ 'the ''{'' flag is in ''cpoptions'' then ''{'' in the first column is used as a',
153887bc3f74SBram Moolenaar  \ 'paragraph boundary |posix|.',
153987bc3f74SBram Moolenaar  \ '{',
154087bc3f74SBram Moolenaar  \ 'This is no paragaraph',
154187bc3f74SBram Moolenaar  \ 'unless the ''{'' is set',
154287bc3f74SBram Moolenaar  \ 'in ''cpoptions''',
154387bc3f74SBram Moolenaar  \ '}',
154487bc3f74SBram Moolenaar  \ '.IP',
154587bc3f74SBram Moolenaar  \ 'The nroff macros IP seperates a paragraph',
154687bc3f74SBram Moolenaar  \ 'That means, it must be a ''.''',
154787bc3f74SBram Moolenaar  \ 'followed by IP',
154887bc3f74SBram Moolenaar  \ '.LPIt does not matter, if afterwards some',
154987bc3f74SBram Moolenaar  \ 'more characters follow.',
155087bc3f74SBram Moolenaar  \ '.SHAlso section boundaries from the nroff',
155187bc3f74SBram Moolenaar  \ 'macros terminate a paragraph. That means',
155287bc3f74SBram Moolenaar  \ 'a character like this:',
155387bc3f74SBram Moolenaar  \ '.NH',
155487bc3f74SBram Moolenaar  \ 'End of text here']
155587bc3f74SBram Moolenaar  new
155687bc3f74SBram Moolenaar  call append(0, text)
155787bc3f74SBram Moolenaar  1
155887bc3f74SBram Moolenaar  norm! 0d2}
155987bc3f74SBram Moolenaar  call assert_equal(['.IP',
156087bc3f74SBram Moolenaar    \  'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''', 'followed by IP',
156187bc3f74SBram Moolenaar    \ '.LPIt does not matter, if afterwards some', 'more characters follow.', '.SHAlso section boundaries from the nroff',
156287bc3f74SBram Moolenaar    \  'macros terminate a paragraph. That means', 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
156387bc3f74SBram Moolenaar  norm! 0d}
156487bc3f74SBram Moolenaar  call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.',
156587bc3f74SBram Moolenaar    \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
156687bc3f74SBram Moolenaar    \ 'a character like this:', '.NH', 'End of text here', ''], getline(1, '$'))
156787bc3f74SBram Moolenaar  $
156887bc3f74SBram Moolenaar  norm! d{
156987bc3f74SBram Moolenaar  call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.',
157087bc3f74SBram Moolenaar	\ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means', 'a character like this:', ''], getline(1, '$'))
157187bc3f74SBram Moolenaar  norm! d{
157287bc3f74SBram Moolenaar  call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.', ''], getline(1,'$'))
157387bc3f74SBram Moolenaar  " Test with { in cpooptions
157487bc3f74SBram Moolenaar  %d
157587bc3f74SBram Moolenaar  call append(0, text)
157687bc3f74SBram Moolenaar  set cpo+={
157787bc3f74SBram Moolenaar  1
157887bc3f74SBram Moolenaar  norm! 0d2}
157987bc3f74SBram Moolenaar  call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}',
158087bc3f74SBram Moolenaar    \ '.IP', 'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''',
158187bc3f74SBram Moolenaar    \ 'followed by IP', '.LPIt does not matter, if afterwards some', 'more characters follow.',
158287bc3f74SBram Moolenaar    \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
158387bc3f74SBram Moolenaar    \ 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
158487bc3f74SBram Moolenaar  $
158587bc3f74SBram Moolenaar  norm! d}
158687bc3f74SBram Moolenaar  call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}',
158787bc3f74SBram Moolenaar    \ '.IP', 'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''',
158887bc3f74SBram Moolenaar    \ 'followed by IP', '.LPIt does not matter, if afterwards some', 'more characters follow.',
158987bc3f74SBram Moolenaar    \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
159087bc3f74SBram Moolenaar    \ 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
159187bc3f74SBram Moolenaar  norm! gg}
159287bc3f74SBram Moolenaar  norm! d5}
159387bc3f74SBram Moolenaar  call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}', ''], getline(1,'$'))
159487bc3f74SBram Moolenaar
159587bc3f74SBram Moolenaar  " clean up
159687bc3f74SBram Moolenaar  set cpo-={
159787bc3f74SBram Moolenaar  bw!
15982931f2a5SBram Moolenaarendfunc
159987bc3f74SBram Moolenaar
160087bc3f74SBram Moolenaarfun! Test_normal30_changecase()
160187bc3f74SBram Moolenaar  " This test uses multi byte characters
160287bc3f74SBram Moolenaar  if !has("multi_byte")
160387bc3f74SBram Moolenaar    return
160487bc3f74SBram Moolenaar  endif
160587bc3f74SBram Moolenaar  new
160687bc3f74SBram Moolenaar  call append(0, 'This is a simple test: äüöß')
160787bc3f74SBram Moolenaar  norm! 1ggVu
160887bc3f74SBram Moolenaar  call assert_equal('this is a simple test: äüöß', getline('.'))
160987bc3f74SBram Moolenaar  norm! VU
161087bc3f74SBram Moolenaar  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
161187bc3f74SBram Moolenaar  norm! guu
161287bc3f74SBram Moolenaar  call assert_equal('this is a simple test: äüöss', getline('.'))
161387bc3f74SBram Moolenaar  norm! gUgU
161487bc3f74SBram Moolenaar  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
161587bc3f74SBram Moolenaar  norm! gugu
161687bc3f74SBram Moolenaar  call assert_equal('this is a simple test: äüöss', getline('.'))
161787bc3f74SBram Moolenaar  norm! gUU
161887bc3f74SBram Moolenaar  call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
161987bc3f74SBram Moolenaar  norm! 010~
162087bc3f74SBram Moolenaar  call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.'))
162187bc3f74SBram Moolenaar  norm! V~
162287bc3f74SBram Moolenaar  call assert_equal('THIS IS A simple test: äüöss', getline('.'))
162387bc3f74SBram Moolenaar
16249f4de1f5SBram Moolenaar  " Turkish ASCII turns to multi-byte.  On Mac the Turkish locale is available
16259f4de1f5SBram Moolenaar  " but toupper()/tolower() don't do the right thing.
1626d2381a2cSBram Moolenaar  if !has('mac') && !has('osx')
16273317d5ebSBram Moolenaar    try
16283317d5ebSBram Moolenaar      lang tr_TR.UTF-8
16293317d5ebSBram Moolenaar      set casemap=
16303317d5ebSBram Moolenaar      call setline(1, 'iI')
16313317d5ebSBram Moolenaar      1normal gUU
16323317d5ebSBram Moolenaar      call assert_equal("\u0130I", getline(1))
16333317d5ebSBram Moolenaar      call assert_equal("\u0130I", toupper("iI"))
16343317d5ebSBram Moolenaar
16353317d5ebSBram Moolenaar      call setline(1, 'iI')
16363317d5ebSBram Moolenaar      1normal guu
16373317d5ebSBram Moolenaar      call assert_equal("i\u0131", getline(1))
16383317d5ebSBram Moolenaar      call assert_equal("i\u0131", tolower("iI"))
16393317d5ebSBram Moolenaar
16401cc48206SBram Moolenaar      set casemap&
16411cc48206SBram Moolenaar      call setline(1, 'iI')
16421cc48206SBram Moolenaar      1normal gUU
16431cc48206SBram Moolenaar      call assert_equal("II", getline(1))
16441cc48206SBram Moolenaar      call assert_equal("II", toupper("iI"))
16451cc48206SBram Moolenaar
16461cc48206SBram Moolenaar      call setline(1, 'iI')
16471cc48206SBram Moolenaar      1normal guu
16481cc48206SBram Moolenaar      call assert_equal("ii", getline(1))
16491cc48206SBram Moolenaar      call assert_equal("ii", tolower("iI"))
16501cc48206SBram Moolenaar
16513317d5ebSBram Moolenaar      lang en_US.UTF-8
16523317d5ebSBram Moolenaar    catch /E197:/
16533317d5ebSBram Moolenaar      " can't use Turkish locale
16543317d5ebSBram Moolenaar      throw 'Skipped: Turkish locale not available'
16553317d5ebSBram Moolenaar    endtry
16569f4de1f5SBram Moolenaar  endif
16573317d5ebSBram Moolenaar
165887bc3f74SBram Moolenaar  " clean up
165987bc3f74SBram Moolenaar  bw!
16602931f2a5SBram Moolenaarendfunc
166187bc3f74SBram Moolenaar
166287bc3f74SBram Moolenaarfun! Test_normal31_r_cmd()
166387bc3f74SBram Moolenaar  " Test for r command
166487bc3f74SBram Moolenaar  new
166587bc3f74SBram Moolenaar  call append(0, 'This is a simple test: abcd')
166687bc3f74SBram Moolenaar  exe "norm! 1gg$r\<cr>"
166787bc3f74SBram Moolenaar  call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$'))
166887bc3f74SBram Moolenaar  exe "norm! 1gg2wlr\<cr>"
166987bc3f74SBram Moolenaar  call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$'))
167087bc3f74SBram Moolenaar  exe "norm! 2gg0W5r\<cr>"
167187bc3f74SBram Moolenaar  call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$'))
167287bc3f74SBram Moolenaar  set autoindent
167387bc3f74SBram Moolenaar  call setline(2, ['simple test: abc', ''])
167487bc3f74SBram Moolenaar  exe "norm! 2gg0W5r\<cr>"
167587bc3f74SBram Moolenaar  call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$'))
167687bc3f74SBram Moolenaar  exe "norm! 1ggVr\<cr>"
167787bc3f74SBram Moolenaar  call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1)))
167887bc3f74SBram Moolenaar  call setline(1, 'This is a')
167987bc3f74SBram Moolenaar  exe "norm! 1gg05rf"
168087bc3f74SBram Moolenaar  call assert_equal('fffffis a', getline(1))
168187bc3f74SBram Moolenaar
168287bc3f74SBram Moolenaar  " clean up
168387bc3f74SBram Moolenaar  set noautoindent
168487bc3f74SBram Moolenaar  bw!
16852931f2a5SBram Moolenaarendfunc
168687bc3f74SBram Moolenaar
168787bc3f74SBram Moolenaarfunc! Test_normal32_g_cmd1()
168887bc3f74SBram Moolenaar  " Test for g*, g#
168987bc3f74SBram Moolenaar  new
169087bc3f74SBram Moolenaar  call append(0, ['abc.x_foo', 'x_foobar.abc'])
169187bc3f74SBram Moolenaar  1
169287bc3f74SBram Moolenaar  norm! $g*
169387bc3f74SBram Moolenaar  call assert_equal('x_foo', @/)
169487bc3f74SBram Moolenaar  call assert_equal('x_foobar.abc', getline('.'))
169587bc3f74SBram Moolenaar  norm! $g#
169687bc3f74SBram Moolenaar  call assert_equal('abc', @/)
169787bc3f74SBram Moolenaar  call assert_equal('abc.x_foo', getline('.'))
169887bc3f74SBram Moolenaar
169987bc3f74SBram Moolenaar  " clean up
170087bc3f74SBram Moolenaar  bw!
17012931f2a5SBram Moolenaarendfunc
170287bc3f74SBram Moolenaar
170387bc3f74SBram Moolenaarfun! Test_normal33_g_cmd2()
170487bc3f74SBram Moolenaar  if !has("jumplist")
170587bc3f74SBram Moolenaar    return
170687bc3f74SBram Moolenaar  endif
170787bc3f74SBram Moolenaar  " Tests for g cmds
170887bc3f74SBram Moolenaar  call Setup_NewWindow()
170987bc3f74SBram Moolenaar  " Test for g`
171087bc3f74SBram Moolenaar  clearjumps
171187bc3f74SBram Moolenaar  norm! ma10j
171287bc3f74SBram Moolenaar  let a=execute(':jumps')
171387bc3f74SBram Moolenaar  " empty jumplist
171487bc3f74SBram Moolenaar  call assert_equal('>', a[-1:])
171587bc3f74SBram Moolenaar  norm! g`a
171687bc3f74SBram Moolenaar  call assert_equal('>', a[-1:])
171787bc3f74SBram Moolenaar  call assert_equal(1, line('.'))
171887bc3f74SBram Moolenaar  call assert_equal('1', getline('.'))
171987bc3f74SBram Moolenaar
172087bc3f74SBram Moolenaar  " Test for g; and g,
172187bc3f74SBram Moolenaar  norm! g;
172287bc3f74SBram Moolenaar  " there is only one change in the changelist
172387bc3f74SBram Moolenaar  " currently, when we setup the window
172487bc3f74SBram Moolenaar  call assert_equal(2, line('.'))
172587bc3f74SBram Moolenaar  call assert_fails(':norm! g;', 'E662')
172687bc3f74SBram Moolenaar  call assert_fails(':norm! g,', 'E663')
172787bc3f74SBram Moolenaar  let &ul=&ul
172887bc3f74SBram Moolenaar  call append('$', ['a', 'b', 'c', 'd'])
172987bc3f74SBram Moolenaar  let &ul=&ul
173087bc3f74SBram Moolenaar  call append('$', ['Z', 'Y', 'X', 'W'])
173187bc3f74SBram Moolenaar  let a = execute(':changes')
173287bc3f74SBram Moolenaar  call assert_match('2\s\+0\s\+2', a)
173387bc3f74SBram Moolenaar  call assert_match('101\s\+0\s\+a', a)
173487bc3f74SBram Moolenaar  call assert_match('105\s\+0\s\+Z', a)
173587bc3f74SBram Moolenaar  norm! 3g;
173687bc3f74SBram Moolenaar  call assert_equal(2, line('.'))
173787bc3f74SBram Moolenaar  norm! 2g,
173887bc3f74SBram Moolenaar  call assert_equal(105, line('.'))
173987bc3f74SBram Moolenaar
174087bc3f74SBram Moolenaar  " Test for g& - global substitute
174187bc3f74SBram Moolenaar  %d
174287bc3f74SBram Moolenaar  call setline(1, range(1,10))
174387bc3f74SBram Moolenaar  call append('$', ['a', 'b', 'c', 'd'])
174487bc3f74SBram Moolenaar  $s/\w/&&/g
174587bc3f74SBram Moolenaar  exe "norm! /[1-8]\<cr>"
174687bc3f74SBram Moolenaar  norm! g&
174787bc3f74SBram Moolenaar  call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$'))
174887bc3f74SBram Moolenaar
174987bc3f74SBram Moolenaar  " Test for gv
175087bc3f74SBram Moolenaar  %d
175187bc3f74SBram Moolenaar  call append('$', repeat(['abcdefgh'], 8))
175287bc3f74SBram Moolenaar  exe "norm! 2gg02l\<c-v>2j2ly"
175387bc3f74SBram Moolenaar  call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1))
175487bc3f74SBram Moolenaar  " in visual mode, gv swaps current and last selected region
175587bc3f74SBram Moolenaar  exe "norm! G0\<c-v>4k4lgvd"
175687bc3f74SBram Moolenaar  call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$'))
175787bc3f74SBram Moolenaar  exe "norm! G0\<c-v>4k4ly"
175887bc3f74SBram Moolenaar  exe "norm! gvood"
175987bc3f74SBram Moolenaar  call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$'))
176087bc3f74SBram Moolenaar
176187bc3f74SBram Moolenaar  " Test for gk/gj
176287bc3f74SBram Moolenaar  %d
176387bc3f74SBram Moolenaar  15vsp
176487bc3f74SBram Moolenaar  set wrap listchars= sbr=
176587bc3f74SBram Moolenaar  let lineA='abcdefghijklmnopqrstuvwxyz'
176687bc3f74SBram Moolenaar  let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
176787bc3f74SBram Moolenaar  $put =lineA
176887bc3f74SBram Moolenaar  $put =lineB
176987bc3f74SBram Moolenaar
177087bc3f74SBram Moolenaar  norm! 3gg0dgk
177187bc3f74SBram Moolenaar  call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$'))
177287bc3f74SBram Moolenaar  set nu
177387bc3f74SBram Moolenaar  norm! 3gg0gjdgj
177487bc3f74SBram Moolenaar  call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
177587bc3f74SBram Moolenaar
177687bc3f74SBram Moolenaar  " Test for gJ
177787bc3f74SBram Moolenaar  norm! 2gggJ
177887bc3f74SBram Moolenaar  call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
177987bc3f74SBram Moolenaar  call assert_equal(16, col('.'))
178087bc3f74SBram Moolenaar  " shouldn't do anything
178187bc3f74SBram Moolenaar  norm! 10gJ
178287bc3f74SBram Moolenaar  call assert_equal(1, col('.'))
178387bc3f74SBram Moolenaar
178487bc3f74SBram Moolenaar  " Test for g0 g^ gm g$
178587bc3f74SBram Moolenaar  exe "norm! 2gg0gji   "
178687bc3f74SBram Moolenaar  call assert_equal(['', 'abcdefghijk   lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
178787bc3f74SBram Moolenaar  norm! g0yl
178887bc3f74SBram Moolenaar  call assert_equal(12, col('.'))
178987bc3f74SBram Moolenaar  call assert_equal(' ', getreg(0))
179087bc3f74SBram Moolenaar  norm! g$yl
179187bc3f74SBram Moolenaar  call assert_equal(22, col('.'))
179287bc3f74SBram Moolenaar  call assert_equal('3', getreg(0))
179387bc3f74SBram Moolenaar  norm! gmyl
179487bc3f74SBram Moolenaar  call assert_equal(17, col('.'))
179587bc3f74SBram Moolenaar  call assert_equal('n', getreg(0))
179687bc3f74SBram Moolenaar  norm! g^yl
179787bc3f74SBram Moolenaar  call assert_equal(15, col('.'))
179887bc3f74SBram Moolenaar  call assert_equal('l', getreg(0))
179987bc3f74SBram Moolenaar
180087bc3f74SBram Moolenaar  " Test for g Ctrl-G
18010913a108SBram Moolenaar  set ff=unix
180287bc3f74SBram Moolenaar  let a=execute(":norm! g\<c-g>")
180387bc3f74SBram Moolenaar  call assert_match('Col 15 of 43; Line 2 of 2; Word 2 of 2; Byte 16 of 45', a)
180487bc3f74SBram Moolenaar
180587bc3f74SBram Moolenaar  " Test for gI
180687bc3f74SBram Moolenaar  norm! gIfoo
180787bc3f74SBram Moolenaar  call assert_equal(['', 'fooabcdefghijk   lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
180887bc3f74SBram Moolenaar
180987bc3f74SBram Moolenaar  " Test for gi
181087bc3f74SBram Moolenaar  wincmd c
181187bc3f74SBram Moolenaar  %d
181287bc3f74SBram Moolenaar  set tw=0
181387bc3f74SBram Moolenaar  call setline(1, ['foobar', 'new line'])
181487bc3f74SBram Moolenaar  norm! A next word
181587bc3f74SBram Moolenaar  $put ='third line'
181687bc3f74SBram Moolenaar  norm! gi another word
181787bc3f74SBram Moolenaar  call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$'))
181887bc3f74SBram Moolenaar
181987bc3f74SBram Moolenaar  " clean up
182087bc3f74SBram Moolenaar  bw!
18212931f2a5SBram Moolenaarendfunc
182287bc3f74SBram Moolenaar
182387bc3f74SBram Moolenaarfun! Test_normal34_g_cmd3()
182487bc3f74SBram Moolenaar  if !has("multi_byte")
182587bc3f74SBram Moolenaar    return
182687bc3f74SBram Moolenaar  endif
1827395b6babSBram Moolenaar
182887bc3f74SBram Moolenaar  " Test for g8
182987bc3f74SBram Moolenaar  new
1830395b6babSBram Moolenaar  let a=execute(':norm! 1G0g8')
1831395b6babSBram Moolenaar  call assert_equal("\nNUL", a)
183287bc3f74SBram Moolenaar
1833395b6babSBram Moolenaar  call setline(1, 'abcdefghijklmnopqrstuvwxyzäüö')
1834395b6babSBram Moolenaar  let a=execute(':norm! 1G$g8')
1835395b6babSBram Moolenaar  call assert_equal("\nc3 b6 ", a)
1836395b6babSBram Moolenaar
1837395b6babSBram Moolenaar  call setline(1, "a\u0302")
1838395b6babSBram Moolenaar  let a=execute(':norm! 1G0g8')
1839395b6babSBram Moolenaar  call assert_equal("\n61 + cc 82 ", a)
1840395b6babSBram Moolenaar
184187bc3f74SBram Moolenaar  " clean up
184287bc3f74SBram Moolenaar  bw!
18432931f2a5SBram Moolenaarendfunc
184487bc3f74SBram Moolenaar
1845395b6babSBram Moolenaarfunc Test_normal_8g8()
1846395b6babSBram Moolenaar  if !has("multi_byte")
1847395b6babSBram Moolenaar    return
1848395b6babSBram Moolenaar  endif
1849395b6babSBram Moolenaar  new
1850395b6babSBram Moolenaar
1851395b6babSBram Moolenaar  " Test 8g8 which finds invalid utf8 at or after the cursor.
1852395b6babSBram Moolenaar
1853395b6babSBram Moolenaar  " With invalid byte.
1854395b6babSBram Moolenaar  call setline(1, "___\xff___")
1855395b6babSBram Moolenaar  norm! 1G08g8g
1856395b6babSBram Moolenaar  call assert_equal([0, 1, 4, 0, 1], getcurpos())
1857395b6babSBram Moolenaar
1858395b6babSBram Moolenaar  " With invalid byte before the cursor.
1859395b6babSBram Moolenaar  call setline(1, "___\xff___")
1860395b6babSBram Moolenaar  norm! 1G$h8g8g
1861395b6babSBram Moolenaar  call assert_equal([0, 1, 6, 0, 9], getcurpos())
1862395b6babSBram Moolenaar
1863395b6babSBram Moolenaar  " With truncated sequence.
1864395b6babSBram Moolenaar  call setline(1, "___\xE2\x82___")
1865395b6babSBram Moolenaar  norm! 1G08g8g
1866395b6babSBram Moolenaar  call assert_equal([0, 1, 4, 0, 1], getcurpos())
1867395b6babSBram Moolenaar
1868395b6babSBram Moolenaar  " With overlong sequence.
1869395b6babSBram Moolenaar  call setline(1, "___\xF0\x82\x82\xAC___")
1870395b6babSBram Moolenaar  norm! 1G08g8g
1871395b6babSBram Moolenaar  call assert_equal([0, 1, 4, 0, 1], getcurpos())
1872395b6babSBram Moolenaar
1873395b6babSBram Moolenaar  " With valid utf8.
1874395b6babSBram Moolenaar  call setline(1, "café")
1875395b6babSBram Moolenaar  norm! 1G08g8
1876395b6babSBram Moolenaar  call assert_equal([0, 1, 1, 0, 1], getcurpos())
1877395b6babSBram Moolenaar
1878395b6babSBram Moolenaar  bw!
1879395b6babSBram Moolenaarendfunc
1880395b6babSBram Moolenaar
188187bc3f74SBram Moolenaarfun! Test_normal35_g_cmd4()
188287bc3f74SBram Moolenaar  " Test for g<
188387bc3f74SBram Moolenaar  " Cannot capture its output,
188487bc3f74SBram Moolenaar  " probably a bug, therefore, test disabled:
188531845093SBram Moolenaar  throw "Skipped: output of g< can't be tested currently"
188687bc3f74SBram Moolenaar  echo "a\nb\nc\nd"
188787bc3f74SBram Moolenaar  let b=execute(':norm! g<')
188887bc3f74SBram Moolenaar  call assert_true(!empty(b), 'failed `execute(g<)`')
18892931f2a5SBram Moolenaarendfunc
189087bc3f74SBram Moolenaar
189187bc3f74SBram Moolenaarfun! Test_normal36_g_cmd5()
189287bc3f74SBram Moolenaar  new
189387bc3f74SBram Moolenaar  call append(0, 'abcdefghijklmnopqrstuvwxyz')
18940913a108SBram Moolenaar  set ff=unix
189587bc3f74SBram Moolenaar  " Test for gp gP
189687bc3f74SBram Moolenaar  call append(1, range(1,10))
189787bc3f74SBram Moolenaar  1
189887bc3f74SBram Moolenaar  norm! 1yy
189987bc3f74SBram Moolenaar  3
190087bc3f74SBram Moolenaar  norm! gp
190187bc3f74SBram Moolenaar  call assert_equal([0, 5, 1, 0, 1], getcurpos())
190287bc3f74SBram Moolenaar  $
190387bc3f74SBram Moolenaar  norm! gP
190487bc3f74SBram Moolenaar  call assert_equal([0, 14, 1, 0, 1], getcurpos())
190587bc3f74SBram Moolenaar
190687bc3f74SBram Moolenaar  " Test for go
190787bc3f74SBram Moolenaar  norm! 26go
190887bc3f74SBram Moolenaar  call assert_equal([0, 1, 26, 0, 26], getcurpos())
190987bc3f74SBram Moolenaar  norm! 27go
191087bc3f74SBram Moolenaar  call assert_equal([0, 1, 26, 0, 26], getcurpos())
191187bc3f74SBram Moolenaar  norm! 28go
191287bc3f74SBram Moolenaar  call assert_equal([0, 2, 1, 0, 1], getcurpos())
191387bc3f74SBram Moolenaar  set ff=dos
191487bc3f74SBram Moolenaar  norm! 29go
191587bc3f74SBram Moolenaar  call assert_equal([0, 2, 1, 0, 1], getcurpos())
191687bc3f74SBram Moolenaar  set ff=unix
191787bc3f74SBram Moolenaar  norm! gg0
191887bc3f74SBram Moolenaar  norm! 101go
191987bc3f74SBram Moolenaar  call assert_equal([0, 13, 26, 0, 26], getcurpos())
192087bc3f74SBram Moolenaar  norm! 103go
192187bc3f74SBram Moolenaar  call assert_equal([0, 14, 1, 0, 1], getcurpos())
192287bc3f74SBram Moolenaar  " count > buffer content
192387bc3f74SBram Moolenaar  norm! 120go
192487bc3f74SBram Moolenaar  call assert_equal([0, 14, 1, 0, 2147483647], getcurpos())
192587bc3f74SBram Moolenaar  " clean up
192687bc3f74SBram Moolenaar  bw!
19272931f2a5SBram Moolenaarendfunc
192887bc3f74SBram Moolenaar
192987bc3f74SBram Moolenaarfun! Test_normal37_g_cmd6()
193087bc3f74SBram Moolenaar  " basic test for gt and gT
193187bc3f74SBram Moolenaar  tabnew 1.txt
193287bc3f74SBram Moolenaar  tabnew 2.txt
193387bc3f74SBram Moolenaar  tabnew 3.txt
193487bc3f74SBram Moolenaar  norm! 1gt
193587bc3f74SBram Moolenaar  call assert_equal(1, tabpagenr())
193687bc3f74SBram Moolenaar  norm! 3gt
193787bc3f74SBram Moolenaar  call assert_equal(3, tabpagenr())
193887bc3f74SBram Moolenaar  norm! 1gT
193987bc3f74SBram Moolenaar  " count gT goes not to the absolute tabpagenumber
194087bc3f74SBram Moolenaar  " but, but goes to the count previous tabpagenumber
194187bc3f74SBram Moolenaar  call assert_equal(2, tabpagenr())
194287bc3f74SBram Moolenaar  " wrap around
194387bc3f74SBram Moolenaar  norm! 3gT
194487bc3f74SBram Moolenaar  call assert_equal(3, tabpagenr())
194587bc3f74SBram Moolenaar  " gt does not wrap around
194687bc3f74SBram Moolenaar  norm! 5gt
194787bc3f74SBram Moolenaar  call assert_equal(3, tabpagenr())
194887bc3f74SBram Moolenaar
194987bc3f74SBram Moolenaar  for i in range(3)
195087bc3f74SBram Moolenaar    tabclose
195187bc3f74SBram Moolenaar  endfor
195287bc3f74SBram Moolenaar  " clean up
195387bc3f74SBram Moolenaar  call assert_fails(':tabclose', 'E784')
19542931f2a5SBram Moolenaarendfunc
195587bc3f74SBram Moolenaar
195687bc3f74SBram Moolenaarfun! Test_normal38_nvhome()
195787bc3f74SBram Moolenaar  " Test for <Home> and <C-Home> key
195887bc3f74SBram Moolenaar  new
195987bc3f74SBram Moolenaar  call setline(1, range(10))
196087bc3f74SBram Moolenaar  $
196187bc3f74SBram Moolenaar  setl et sw=2
196287bc3f74SBram Moolenaar  norm! V10>$
196387bc3f74SBram Moolenaar  " count is ignored
196487bc3f74SBram Moolenaar  exe "norm! 10\<home>"
196587bc3f74SBram Moolenaar  call assert_equal(1, col('.'))
196687bc3f74SBram Moolenaar  exe "norm! \<home>"
196787bc3f74SBram Moolenaar  call assert_equal([0, 10, 1, 0, 1], getcurpos())
196887bc3f74SBram Moolenaar  exe "norm! 5\<c-home>"
196987bc3f74SBram Moolenaar  call assert_equal([0, 5, 1, 0, 1], getcurpos())
197087bc3f74SBram Moolenaar  exe "norm! \<c-home>"
197187bc3f74SBram Moolenaar  call assert_equal([0, 1, 1, 0, 1], getcurpos())
197287bc3f74SBram Moolenaar
197387bc3f74SBram Moolenaar  " clean up
197487bc3f74SBram Moolenaar  bw!
19752931f2a5SBram Moolenaarendfunc
197687bc3f74SBram Moolenaar
197787bc3f74SBram Moolenaarfun! Test_normal39_cw()
197887bc3f74SBram Moolenaar  " Test for cw and cW on whitespace
197987bc3f74SBram Moolenaar  " and cpo+=w setting
198087bc3f74SBram Moolenaar  new
198187bc3f74SBram Moolenaar  set tw=0
198287bc3f74SBram Moolenaar  call append(0, 'here      are   some words')
198387bc3f74SBram Moolenaar  norm! 1gg0elcwZZZ
198487bc3f74SBram Moolenaar  call assert_equal('hereZZZare   some words', getline('.'))
198587bc3f74SBram Moolenaar  norm! 1gg0elcWYYY
198687bc3f74SBram Moolenaar  call assert_equal('hereZZZareYYYsome words', getline('.'))
198787bc3f74SBram Moolenaar  set cpo+=w
198887bc3f74SBram Moolenaar  call setline(1, 'here      are   some words')
198987bc3f74SBram Moolenaar  norm! 1gg0elcwZZZ
199087bc3f74SBram Moolenaar  call assert_equal('hereZZZ     are   some words', getline('.'))
199187bc3f74SBram Moolenaar  norm! 1gg2elcWYYY
199287bc3f74SBram Moolenaar  call assert_equal('hereZZZ     areYYY  some words', getline('.'))
199387bc3f74SBram Moolenaar  set cpo-=w
199487bc3f74SBram Moolenaar  norm! 2gg0cwfoo
199587bc3f74SBram Moolenaar  call assert_equal('foo', getline('.'))
199687bc3f74SBram Moolenaar
199787bc3f74SBram Moolenaar  " clean up
199887bc3f74SBram Moolenaar  bw!
19992931f2a5SBram Moolenaarendfunc
200087bc3f74SBram Moolenaar
200187bc3f74SBram Moolenaarfun! Test_normal40_ctrl_bsl()
200287bc3f74SBram Moolenaar  " Basic test for CTRL-\ commands
200387bc3f74SBram Moolenaar  new
200487bc3f74SBram Moolenaar  call append(0, 'here      are   some words')
200587bc3f74SBram Moolenaar  exe "norm! 1gg0a\<C-\>\<C-N>"
200687bc3f74SBram Moolenaar  call assert_equal('n', mode())
200787bc3f74SBram Moolenaar  call assert_equal(1, col('.'))
200887bc3f74SBram Moolenaar  call assert_equal('', visualmode())
200987bc3f74SBram Moolenaar  exe "norm! 1gg0viw\<C-\>\<C-N>"
201087bc3f74SBram Moolenaar  call assert_equal('n', mode())
201187bc3f74SBram Moolenaar  call assert_equal(4, col('.'))
201287bc3f74SBram Moolenaar  exe "norm! 1gg0a\<C-\>\<C-G>"
201387bc3f74SBram Moolenaar  call assert_equal('n', mode())
201487bc3f74SBram Moolenaar  call assert_equal(1, col('.'))
201587bc3f74SBram Moolenaar  "imap <buffer> , <c-\><c-n>
201687bc3f74SBram Moolenaar  set im
201787bc3f74SBram Moolenaar  exe ":norm! \<c-\>\<c-n>dw"
201887bc3f74SBram Moolenaar  set noim
201987bc3f74SBram Moolenaar  call assert_equal('are   some words', getline(1))
202087bc3f74SBram Moolenaar  call assert_false(&insertmode)
202187bc3f74SBram Moolenaar
202287bc3f74SBram Moolenaar  " clean up
202387bc3f74SBram Moolenaar  bw!
20242931f2a5SBram Moolenaarendfunc
202587bc3f74SBram Moolenaar
202687bc3f74SBram Moolenaarfun! Test_normal41_insert_reg()
202787bc3f74SBram Moolenaar  " Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>=
202887bc3f74SBram Moolenaar  " in insert mode
202987bc3f74SBram Moolenaar  new
203087bc3f74SBram Moolenaar  set sts=2 sw=2 ts=8 tw=0
203187bc3f74SBram Moolenaar  call append(0, ["aaa\tbbb\tccc", '', '', ''])
203287bc3f74SBram Moolenaar  let a=getline(1)
203387bc3f74SBram Moolenaar  norm! 2gg0
203487bc3f74SBram Moolenaar  exe "norm! a\<c-r>=a\<cr>"
203587bc3f74SBram Moolenaar  norm! 3gg0
203687bc3f74SBram Moolenaar  exe "norm! a\<c-r>\<c-r>=a\<cr>"
203787bc3f74SBram Moolenaar  norm! 4gg0
203887bc3f74SBram Moolenaar  exe "norm! a\<c-r>\<c-o>=a\<cr>"
203987bc3f74SBram Moolenaar  call assert_equal(['aaa	bbb	ccc', 'aaa bbb	ccc', 'aaa bbb	ccc', 'aaa	bbb	ccc', ''], getline(1, '$'))
204087bc3f74SBram Moolenaar
204187bc3f74SBram Moolenaar  " clean up
204287bc3f74SBram Moolenaar  set sts=0 sw=8 ts=8
204331845093SBram Moolenaar  bw!
20442931f2a5SBram Moolenaarendfunc
204587bc3f74SBram Moolenaar
204687bc3f74SBram Moolenaarfunc! Test_normal42_halfpage()
204787bc3f74SBram Moolenaar  " basic test for Ctrl-D and Ctrl-U
204887bc3f74SBram Moolenaar  call Setup_NewWindow()
204987bc3f74SBram Moolenaar  call assert_equal(5, &scroll)
205087bc3f74SBram Moolenaar  exe "norm! \<c-d>"
205187bc3f74SBram Moolenaar  call assert_equal('6', getline('.'))
205287bc3f74SBram Moolenaar  exe "norm! 2\<c-d>"
205387bc3f74SBram Moolenaar  call assert_equal('8', getline('.'))
205487bc3f74SBram Moolenaar  call assert_equal(2, &scroll)
205587bc3f74SBram Moolenaar  set scroll=5
205687bc3f74SBram Moolenaar  exe "norm! \<c-u>"
205787bc3f74SBram Moolenaar  call assert_equal('3', getline('.'))
205887bc3f74SBram Moolenaar  1
205987bc3f74SBram Moolenaar  set scrolloff=5
206087bc3f74SBram Moolenaar  exe "norm! \<c-d>"
206187bc3f74SBram Moolenaar  call assert_equal('10', getline('.'))
206287bc3f74SBram Moolenaar  exe "norm! \<c-u>"
206387bc3f74SBram Moolenaar  call assert_equal('5', getline('.'))
206487bc3f74SBram Moolenaar  1
206587bc3f74SBram Moolenaar  set scrolloff=99
206687bc3f74SBram Moolenaar  exe "norm! \<c-d>"
206787bc3f74SBram Moolenaar  call assert_equal('10', getline('.'))
206887bc3f74SBram Moolenaar  set scrolloff=0
206987bc3f74SBram Moolenaar  100
207087bc3f74SBram Moolenaar  exe "norm! $\<c-u>"
207187bc3f74SBram Moolenaar  call assert_equal('95', getline('.'))
207287bc3f74SBram Moolenaar  call assert_equal([0, 95, 1, 0, 1], getcurpos())
207387bc3f74SBram Moolenaar  100
207487bc3f74SBram Moolenaar  set nostartofline
207587bc3f74SBram Moolenaar  exe "norm! $\<c-u>"
207687bc3f74SBram Moolenaar  call assert_equal('95', getline('.'))
207787bc3f74SBram Moolenaar  call assert_equal([0, 95, 2, 0, 2147483647], getcurpos())
207887bc3f74SBram Moolenaar  " cleanup
207987bc3f74SBram Moolenaar  set startofline
208087bc3f74SBram Moolenaar  bw!
20812931f2a5SBram Moolenaarendfunc
208287bc3f74SBram Moolenaar
208387bc3f74SBram Moolenaarfun! Test_normal43_textobject1()
208487bc3f74SBram Moolenaar  " basic tests for text object aw
208587bc3f74SBram Moolenaar  new
208687bc3f74SBram Moolenaar  call append(0, ['foobar,eins,foobar', 'foo,zwei,foo    '])
208787bc3f74SBram Moolenaar  " diw
208887bc3f74SBram Moolenaar  norm! 1gg0diw
208987bc3f74SBram Moolenaar  call assert_equal([',eins,foobar', 'foo,zwei,foo    ', ''], getline(1,'$'))
209087bc3f74SBram Moolenaar  " daw
209187bc3f74SBram Moolenaar  norm! 2ggEdaw
209287bc3f74SBram Moolenaar  call assert_equal([',eins,foobar', 'foo,zwei,', ''], getline(1, '$'))
209387bc3f74SBram Moolenaar  %d
209487bc3f74SBram Moolenaar  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
209587bc3f74SBram Moolenaar  " diW
209687bc3f74SBram Moolenaar  norm! 2ggwd2iW
209787bc3f74SBram Moolenaar  call assert_equal(['foo	eins	foobar', 'foo	foo   ', ''], getline(1,'$'))
209887bc3f74SBram Moolenaar  " daW
209987bc3f74SBram Moolenaar  norm! 1ggd2aW
210087bc3f74SBram Moolenaar  call assert_equal(['foobar', 'foo	foo   ', ''], getline(1,'$'))
210187bc3f74SBram Moolenaar
210287bc3f74SBram Moolenaar  %d
210387bc3f74SBram Moolenaar  call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo   "])
210487bc3f74SBram Moolenaar  " aw in visual line mode switches to characterwise mode
210587bc3f74SBram Moolenaar  norm! 2gg$Vawd
210687bc3f74SBram Moolenaar  call assert_equal(['foo	eins	foobar', 'foo	zwei	foo'], getline(1,'$'))
210787bc3f74SBram Moolenaar  norm! 1gg$Viwd
210887bc3f74SBram Moolenaar  call assert_equal(['foo	eins	', 'foo	zwei	foo'], getline(1,'$'))
210987bc3f74SBram Moolenaar
211087bc3f74SBram Moolenaar  " clean up
211187bc3f74SBram Moolenaar  bw!
21122931f2a5SBram Moolenaarendfunc
211387bc3f74SBram Moolenaar
211487bc3f74SBram Moolenaarfunc! Test_normal44_textobjects2()
211587bc3f74SBram Moolenaar  " basic testing for is and as text objects
211687bc3f74SBram Moolenaar  new
211787bc3f74SBram Moolenaar  call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
211887bc3f74SBram Moolenaar  " Test for dis - does not remove trailing whitespace
211987bc3f74SBram Moolenaar  norm! 1gg0dis
212087bc3f74SBram Moolenaar  call assert_equal([' With some sentences!', '', 'Even with a question? And one more. And no sentence here', ''], getline(1,'$'))
212187bc3f74SBram Moolenaar  " Test for das - removes leading whitespace
212287bc3f74SBram Moolenaar  norm! 3ggf?ldas
212387bc3f74SBram Moolenaar  call assert_equal([' With some sentences!', '', 'Even with a question? And no sentence here', ''], getline(1,'$'))
212487bc3f74SBram Moolenaar  " when used in visual mode, is made characterwise
212587bc3f74SBram Moolenaar  norm! 3gg$Visy
212687bc3f74SBram Moolenaar  call assert_equal('v', visualmode())
212787bc3f74SBram Moolenaar  " reset visualmode()
212887bc3f74SBram Moolenaar  norm! 3ggVy
212987bc3f74SBram Moolenaar  norm! 3gg$Vasy
213087bc3f74SBram Moolenaar  call assert_equal('v', visualmode())
213187bc3f74SBram Moolenaar  " basic testing for textobjects a< and at
213287bc3f74SBram Moolenaar  %d
213387bc3f74SBram Moolenaar  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
213487bc3f74SBram Moolenaar  " a<
213587bc3f74SBram Moolenaar  norm! 1gg0da<
213687bc3f74SBram Moolenaar  call assert_equal([' ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
213787bc3f74SBram Moolenaar  norm! 1pj
213887bc3f74SBram Moolenaar  call assert_equal([' <div>', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
213987bc3f74SBram Moolenaar  " at
214087bc3f74SBram Moolenaar  norm! d2at
214187bc3f74SBram Moolenaar  call assert_equal([' '], getline(1,'$'))
214287bc3f74SBram Moolenaar  %d
214387bc3f74SBram Moolenaar  call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>','    </div>', ' '])
214487bc3f74SBram Moolenaar  " i<
214587bc3f74SBram Moolenaar  norm! 1gg0di<
214687bc3f74SBram Moolenaar  call assert_equal(['<> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
214787bc3f74SBram Moolenaar  norm! 1Pj
214887bc3f74SBram Moolenaar  call assert_equal(['<div> ', '<a href="foobar" class="foo">xyz</a>', '    </div>', ' '], getline(1,'$'))
214987bc3f74SBram Moolenaar  norm! d2it
215087bc3f74SBram Moolenaar  call assert_equal(['<div></div>',' '], getline(1,'$'))
215187bc3f74SBram Moolenaar  " basic testing for a[ and i[ text object
215287bc3f74SBram Moolenaar  %d
215387bc3f74SBram Moolenaar  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
215487bc3f74SBram Moolenaar  norm! 3gg0di[
215587bc3f74SBram Moolenaar  call assert_equal([' ', '[', ']'], getline(1,'$'))
215687bc3f74SBram Moolenaar  call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
215787bc3f74SBram Moolenaar  norm! 3gg0ftd2a[
215887bc3f74SBram Moolenaar  call assert_equal([' '], getline(1,'$'))
215987bc3f74SBram Moolenaar  %d
216087bc3f74SBram Moolenaar  " Test for i" when cursor is in front of a quoted object
216187bc3f74SBram Moolenaar  call append(0, 'foo "bar"')
216287bc3f74SBram Moolenaar  norm! 1gg0di"
216387bc3f74SBram Moolenaar  call assert_equal(['foo ""', ''], getline(1,'$'))
216487bc3f74SBram Moolenaar
216587bc3f74SBram Moolenaar  " clean up
216687bc3f74SBram Moolenaar  bw!
21672931f2a5SBram Moolenaarendfunc
216887bc3f74SBram Moolenaar
216987bc3f74SBram Moolenaarfunc! Test_normal45_drop()
217087bc3f74SBram Moolenaar  if !has("dnd")
217187bc3f74SBram Moolenaar    return
217287bc3f74SBram Moolenaar  endif
217387bc3f74SBram Moolenaar  " basic test for :drop command
217487bc3f74SBram Moolenaar  " unfortunately, without a gui, we can't really test much here,
217587bc3f74SBram Moolenaar  " so simply test that ~p fails (which uses the drop register)
217687bc3f74SBram Moolenaar  new
217787bc3f74SBram Moolenaar  call assert_fails(':norm! "~p', 'E353')
217887bc3f74SBram Moolenaar  call assert_equal([],  getreg('~', 1, 1))
217987bc3f74SBram Moolenaar  " the ~ register is read only
218087bc3f74SBram Moolenaar  call assert_fails(':let @~="1"', 'E354')
218187bc3f74SBram Moolenaar  bw!
21822931f2a5SBram Moolenaarendfunc
218387bc3f74SBram Moolenaar
218487bc3f74SBram Moolenaarfunc! Test_normal46_ignore()
21852931f2a5SBram Moolenaar  " This test uses multi byte characters
21862931f2a5SBram Moolenaar  if !has("multi_byte")
21872931f2a5SBram Moolenaar    return
21882931f2a5SBram Moolenaar  endif
21892931f2a5SBram Moolenaar
219087bc3f74SBram Moolenaar  new
219187bc3f74SBram Moolenaar  " How to test this?
219287bc3f74SBram Moolenaar  " let's just for now test, that the buffer
219387bc3f74SBram Moolenaar  " does not change
219487bc3f74SBram Moolenaar  call feedkeys("\<c-s>", 't')
219587bc3f74SBram Moolenaar  call assert_equal([''], getline(1,'$'))
219687bc3f74SBram Moolenaar
21972931f2a5SBram Moolenaar  " no valid commands
21982931f2a5SBram Moolenaar  exe "norm! \<char-0x100>"
21992931f2a5SBram Moolenaar  call assert_equal([''], getline(1,'$'))
22002931f2a5SBram Moolenaar
22012931f2a5SBram Moolenaar  exe "norm! ä"
22022931f2a5SBram Moolenaar  call assert_equal([''], getline(1,'$'))
22032931f2a5SBram Moolenaar
220487bc3f74SBram Moolenaar  " clean up
220587bc3f74SBram Moolenaar  bw!
22062931f2a5SBram Moolenaarendfunc
2207c4a908e8SBram Moolenaar
2208c4a908e8SBram Moolenaarfunc! Test_normal47_visual_buf_wipe()
2209c4a908e8SBram Moolenaar  " This was causing a crash or ml_get error.
2210c4a908e8SBram Moolenaar  enew!
2211c4a908e8SBram Moolenaar  call setline(1,'xxx')
2212c4a908e8SBram Moolenaar  normal $
2213c4a908e8SBram Moolenaar  new
2214c4a908e8SBram Moolenaar  call setline(1, range(1,2))
2215c4a908e8SBram Moolenaar  2
2216c4a908e8SBram Moolenaar  exe "norm \<C-V>$"
2217c4a908e8SBram Moolenaar  bw!
2218c4a908e8SBram Moolenaar  norm yp
2219c4a908e8SBram Moolenaar  set nomodified
22202931f2a5SBram Moolenaarendfunc
22212931f2a5SBram Moolenaar
22222931f2a5SBram Moolenaarfunc! Test_normal47_autocmd()
22232931f2a5SBram Moolenaar  " disabled, does not seem to be possible currently
22242931f2a5SBram Moolenaar  throw "Skipped: not possible to test cursorhold autocmd while waiting for input in normal_cmd"
22252931f2a5SBram Moolenaar  new
22262931f2a5SBram Moolenaar  call append(0, repeat('-',20))
22272931f2a5SBram Moolenaar  au CursorHold * call feedkeys('2l', '')
22282931f2a5SBram Moolenaar  1
22292931f2a5SBram Moolenaar  set updatetime=20
22302931f2a5SBram Moolenaar  " should delete 12 chars (d12l)
22312931f2a5SBram Moolenaar  call feedkeys('d1', '!')
22322931f2a5SBram Moolenaar  call assert_equal('--------', getline(1))
22332931f2a5SBram Moolenaar
22342931f2a5SBram Moolenaar  " clean up
22352931f2a5SBram Moolenaar  au! CursorHold
22362931f2a5SBram Moolenaar  set updatetime=4000
22372931f2a5SBram Moolenaar  bw!
22382931f2a5SBram Moolenaarendfunc
22392931f2a5SBram Moolenaar
22402931f2a5SBram Moolenaarfunc! Test_normal48_wincmd()
22412931f2a5SBram Moolenaar  new
22422931f2a5SBram Moolenaar  exe "norm! \<c-w>c"
22432931f2a5SBram Moolenaar  call assert_equal(1, winnr('$'))
22442931f2a5SBram Moolenaar  call assert_fails(":norm! \<c-w>c", "E444")
22452931f2a5SBram Moolenaarendfunc
22462931f2a5SBram Moolenaar
22472931f2a5SBram Moolenaarfunc! Test_normal49_counts()
22482931f2a5SBram Moolenaar  new
22492931f2a5SBram Moolenaar  call setline(1, 'one two three four five six seven eight nine ten')
22502931f2a5SBram Moolenaar  1
22512931f2a5SBram Moolenaar  norm! 3d2w
22522931f2a5SBram Moolenaar  call assert_equal('seven eight nine ten', getline(1))
22532931f2a5SBram Moolenaar  bw!
22542931f2a5SBram Moolenaarendfunc
22552931f2a5SBram Moolenaar
22562931f2a5SBram Moolenaarfunc! Test_normal50_commandline()
22574033c55eSBram Moolenaar  if !has("timers") || !has("cmdline_hist")
22582931f2a5SBram Moolenaar    return
22592931f2a5SBram Moolenaar  endif
22602931f2a5SBram Moolenaar  func! DoTimerWork(id)
22612931f2a5SBram Moolenaar    call assert_equal('[Command Line]', bufname(''))
22622931f2a5SBram Moolenaar    " should fail, with E11, but does fail with E23?
22632931f2a5SBram Moolenaar    "call feedkeys("\<c-^>", 'tm')
22642931f2a5SBram Moolenaar
22652931f2a5SBram Moolenaar    " should also fail with E11
22662931f2a5SBram Moolenaar    call assert_fails(":wincmd p", 'E11')
22672931f2a5SBram Moolenaar    " return from commandline window
22682931f2a5SBram Moolenaar    call feedkeys("\<cr>")
22692931f2a5SBram Moolenaar  endfunc
22702931f2a5SBram Moolenaar
22712931f2a5SBram Moolenaar  let oldlang=v:lang
22722931f2a5SBram Moolenaar  lang C
22732931f2a5SBram Moolenaar  set updatetime=20
22742931f2a5SBram Moolenaar  call timer_start(100, 'DoTimerWork')
22752931f2a5SBram Moolenaar  try
22762931f2a5SBram Moolenaar    " throws E23, for whatever reason...
22772931f2a5SBram Moolenaar    call feedkeys('q:', 'x!')
22782931f2a5SBram Moolenaar  catch /E23/
22792931f2a5SBram Moolenaar    " no-op
22802931f2a5SBram Moolenaar  endtry
22812931f2a5SBram Moolenaar  " clean up
22822931f2a5SBram Moolenaar  set updatetime=4000
22832931f2a5SBram Moolenaar  exe "lang" oldlang
22842931f2a5SBram Moolenaar  bw!
22852931f2a5SBram Moolenaarendfunc
22862931f2a5SBram Moolenaar
22872931f2a5SBram Moolenaarfunc! Test_normal51_FileChangedRO()
22882931f2a5SBram Moolenaar  if !has("autocmd")
22892931f2a5SBram Moolenaar    return
22902931f2a5SBram Moolenaar  endif
2291e5f2a075SBram Moolenaar  " Don't sleep after the warning message.
2292e5f2a075SBram Moolenaar  call test_settime(1)
22932931f2a5SBram Moolenaar  call writefile(['foo'], 'Xreadonly.log')
22942931f2a5SBram Moolenaar  new Xreadonly.log
22952931f2a5SBram Moolenaar  setl ro
22962931f2a5SBram Moolenaar  au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix')
22972931f2a5SBram Moolenaar  call assert_fails(":norm! Af", 'E788')
22982931f2a5SBram Moolenaar  call assert_equal(['foo'], getline(1,'$'))
22992931f2a5SBram Moolenaar  call assert_equal('Xreadonly.log', bufname(''))
23002931f2a5SBram Moolenaar
23012931f2a5SBram Moolenaar  " cleanup
2302e5f2a075SBram Moolenaar  call test_settime(0)
23032931f2a5SBram Moolenaar  bw!
23042931f2a5SBram Moolenaar  call delete("Xreadonly.log")
23052931f2a5SBram Moolenaarendfunc
23062931f2a5SBram Moolenaar
23072931f2a5SBram Moolenaarfunc! Test_normal52_rl()
23082931f2a5SBram Moolenaar  if !has("rightleft")
23092931f2a5SBram Moolenaar    return
23102931f2a5SBram Moolenaar  endif
23112931f2a5SBram Moolenaar  new
23122931f2a5SBram Moolenaar  call setline(1, 'abcde fghij klmnopq')
23132931f2a5SBram Moolenaar  norm! 1gg$
23142931f2a5SBram Moolenaar  set rl
23152931f2a5SBram Moolenaar  call assert_equal(19, col('.'))
23162931f2a5SBram Moolenaar  call feedkeys('l', 'tx')
23172931f2a5SBram Moolenaar  call assert_equal(18, col('.'))
23182931f2a5SBram Moolenaar  call feedkeys('h', 'tx')
23192931f2a5SBram Moolenaar  call assert_equal(19, col('.'))
23202931f2a5SBram Moolenaar  call feedkeys("\<right>", 'tx')
23212931f2a5SBram Moolenaar  call assert_equal(18, col('.'))
23222931f2a5SBram Moolenaar  call feedkeys("\<s-right>", 'tx')
23232931f2a5SBram Moolenaar  call assert_equal(13, col('.'))
23242931f2a5SBram Moolenaar  call feedkeys("\<c-right>", 'tx')
23252931f2a5SBram Moolenaar  call assert_equal(7, col('.'))
23262931f2a5SBram Moolenaar  call feedkeys("\<c-left>", 'tx')
23272931f2a5SBram Moolenaar  call assert_equal(13, col('.'))
23282931f2a5SBram Moolenaar  call feedkeys("\<s-left>", 'tx')
23292931f2a5SBram Moolenaar  call assert_equal(19, col('.'))
23302931f2a5SBram Moolenaar  call feedkeys("<<", 'tx')
23312931f2a5SBram Moolenaar  call assert_equal('	abcde fghij klmnopq',getline(1))
23322931f2a5SBram Moolenaar  call feedkeys(">>", 'tx')
23332931f2a5SBram Moolenaar  call assert_equal('abcde fghij klmnopq',getline(1))
23342931f2a5SBram Moolenaar
23352931f2a5SBram Moolenaar  " cleanup
23362931f2a5SBram Moolenaar  set norl
23372931f2a5SBram Moolenaar  bw!
23382931f2a5SBram Moolenaarendfunc
23392931f2a5SBram Moolenaar
23402931f2a5SBram Moolenaarfunc! Test_normal53_digraph()
23412931f2a5SBram Moolenaar  if !has('digraphs')
23422931f2a5SBram Moolenaar    return
23432931f2a5SBram Moolenaar  endif
23442931f2a5SBram Moolenaar  new
23452931f2a5SBram Moolenaar  call setline(1, 'abcdefgh|')
23462931f2a5SBram Moolenaar  exe "norm! 1gg0f\<c-k>!!"
23472931f2a5SBram Moolenaar  call assert_equal(9, col('.'))
23482931f2a5SBram Moolenaar  set cpo+=D
23492931f2a5SBram Moolenaar  exe "norm! 1gg0f\<c-k>!!"
23502931f2a5SBram Moolenaar  call assert_equal(1, col('.'))
23512931f2a5SBram Moolenaar
23522931f2a5SBram Moolenaar  set cpo-=D
23532931f2a5SBram Moolenaar  bw!
23542931f2a5SBram Moolenaarendfunc
23552931f2a5SBram Moolenaar
2356b1e04fcaSBram Moolenaarfunc Test_normal54_Ctrl_bsl()
23572931f2a5SBram Moolenaar  new
23582931f2a5SBram Moolenaar  call setline(1, 'abcdefghijklmn')
23592931f2a5SBram Moolenaar  exe "norm! df\<c-\>\<c-n>"
23602931f2a5SBram Moolenaar  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
23612931f2a5SBram Moolenaar  exe "norm! df\<c-\>\<c-g>"
23622931f2a5SBram Moolenaar  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
23632931f2a5SBram Moolenaar  exe "norm! df\<c-\>m"
23642931f2a5SBram Moolenaar  call assert_equal(['abcdefghijklmn'], getline(1,'$'))
23652931f2a5SBram Moolenaar  if !has("multi_byte")
23662931f2a5SBram Moolenaar    return
23672931f2a5SBram Moolenaar  endif
23682931f2a5SBram Moolenaar  call setline(2, 'abcdefghijklmnāf')
23692931f2a5SBram Moolenaar  norm! 2gg0
23702931f2a5SBram Moolenaar  exe "norm! df\<Char-0x101>"
23712931f2a5SBram Moolenaar  call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
23722931f2a5SBram Moolenaar  norm! 1gg0
23732931f2a5SBram Moolenaar  exe "norm! df\<esc>"
23742931f2a5SBram Moolenaar  call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
23752931f2a5SBram Moolenaar
23762931f2a5SBram Moolenaar  " clean up
23772931f2a5SBram Moolenaar  bw!
23782931f2a5SBram Moolenaarendfunc
2379b1e04fcaSBram Moolenaar
2380b1e04fcaSBram Moolenaarfunc Test_normal_large_count()
2381b1e04fcaSBram Moolenaar  " This may fail with 32bit long, how do we detect that?
2382b1e04fcaSBram Moolenaar  new
2383b1e04fcaSBram Moolenaar  normal o
2384b1e04fcaSBram Moolenaar  normal 6666666666dL
2385b1e04fcaSBram Moolenaar  bwipe!
2386b1e04fcaSBram Moolenaarendfunc
2387bf3d5807SBram Moolenaar
2388bf3d5807SBram Moolenaarfunc Test_delete_until_paragraph()
2389bf3d5807SBram Moolenaar  if !has('multi_byte')
2390bf3d5807SBram Moolenaar    return
2391bf3d5807SBram Moolenaar  endif
2392bf3d5807SBram Moolenaar  new
2393bf3d5807SBram Moolenaar  normal grádv}
2394bf3d5807SBram Moolenaar  call assert_equal('á', getline(1))
2395bf3d5807SBram Moolenaar  normal grád}
2396bf3d5807SBram Moolenaar  call assert_equal('', getline(1))
2397bf3d5807SBram Moolenaar  bwipe!
2398bf3d5807SBram Moolenaarendfunc
2399*fb094e14SBram Moolenaar
2400*fb094e14SBram Moolenaar" Test for the gr (virtual replace) command
2401*fb094e14SBram Moolenaar" Test for the bug fixed by 7.4.387
2402*fb094e14SBram Moolenaarfunc Test_gr_command()
2403*fb094e14SBram Moolenaar  enew!
2404*fb094e14SBram Moolenaar  let save_cpo = &cpo
2405*fb094e14SBram Moolenaar  call append(0, ['First line', 'Second line', 'Third line'])
2406*fb094e14SBram Moolenaar  exe "normal i\<C-G>u"
2407*fb094e14SBram Moolenaar  call cursor(2, 1)
2408*fb094e14SBram Moolenaar  set cpo-=X
2409*fb094e14SBram Moolenaar  normal 4gro
2410*fb094e14SBram Moolenaar  call assert_equal('oooond line', getline(2))
2411*fb094e14SBram Moolenaar  undo
2412*fb094e14SBram Moolenaar  set cpo+=X
2413*fb094e14SBram Moolenaar  normal 4gro
2414*fb094e14SBram Moolenaar  call assert_equal('ooooecond line', getline(2))
2415*fb094e14SBram Moolenaar  let &cpo = save_cpo
2416*fb094e14SBram Moolenaar  enew!
2417*fb094e14SBram Moolenaarendfunc
2418*fb094e14SBram Moolenaar
2419*fb094e14SBram Moolenaar" When splitting a window the changelist position is wrong.
2420*fb094e14SBram Moolenaar" Test the changelist position after splitting a window.
2421*fb094e14SBram Moolenaar" Test for the bug fixed by 7.4.386
2422*fb094e14SBram Moolenaarfunc Test_changelist()
2423*fb094e14SBram Moolenaar  let save_ul = &ul
2424*fb094e14SBram Moolenaar  enew!
2425*fb094e14SBram Moolenaar  call append('$', ['1', '2'])
2426*fb094e14SBram Moolenaar  exe "normal i\<C-G>u"
2427*fb094e14SBram Moolenaar  exe "normal Gkylpa\<C-G>u"
2428*fb094e14SBram Moolenaar  set ul=100
2429*fb094e14SBram Moolenaar  exe "normal Gylpa\<C-G>u"
2430*fb094e14SBram Moolenaar  set ul=100
2431*fb094e14SBram Moolenaar  normal gg
2432*fb094e14SBram Moolenaar  vsplit
2433*fb094e14SBram Moolenaar  normal g;
2434*fb094e14SBram Moolenaar  call assert_equal([3, 2], [line('.'), col('.')])
2435*fb094e14SBram Moolenaar  normal g;
2436*fb094e14SBram Moolenaar  call assert_equal([2, 2], [line('.'), col('.')])
2437*fb094e14SBram Moolenaar  call assert_fails('normal g;', 'E662:')
2438*fb094e14SBram Moolenaar  %bwipe!
2439*fb094e14SBram Moolenaar  let &ul = save_ul
2440*fb094e14SBram Moolenaarendfunc
2441