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