blob: 2a06bb5b01d576438b5273a471184da3995b706c [file] [log] [blame]
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001" Test for various Normal mode commands
2
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01003source shared.vim
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01004source check.vim
Bram Moolenaarca68ae12020-03-30 19:32:53 +02005source view_util.vim
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01006
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01007func Setup_NewWindow()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02008 10new
9 call setline(1, range(1,100))
10endfunc
11
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010012func MyFormatExpr()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020013 " Adds '->$' at lines having numbers followed by trailing whitespace
14 for ln in range(v:lnum, v:lnum+v:count-1)
15 let line = getline(ln)
16 if getline(ln) =~# '\d\s\+$'
17 call setline(ln, substitute(line, '\s\+$', '', '') . '->$')
18 endif
19 endfor
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020020endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020021
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010022func CountSpaces(type, ...)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020023 " for testing operatorfunc
24 " will count the number of spaces
25 " and return the result in g:a
26 let sel_save = &selection
27 let &selection = "inclusive"
28 let reg_save = @@
29
30 if a:0 " Invoked from Visual mode, use gv command.
31 silent exe "normal! gvy"
32 elseif a:type == 'line'
33 silent exe "normal! '[V']y"
34 else
35 silent exe "normal! `[v`]y"
36 endif
37 let g:a=strlen(substitute(@@, '[^ ]', '', 'g'))
38 let &selection = sel_save
39 let @@ = reg_save
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020040endfunc
41
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010042func OpfuncDummy(type, ...)
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +010043 " for testing operatorfunc
44 let g:opt=&linebreak
45
46 if a:0 " Invoked from Visual mode, use gv command.
47 silent exe "normal! gvy"
48 elseif a:type == 'line'
49 silent exe "normal! '[V']y"
50 else
51 silent exe "normal! `[v`]y"
52 endif
53 " Create a new dummy window
54 new
55 let g:bufnr=bufnr('%')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020056endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020057
Bram Moolenaar1671f442020-03-10 07:48:13 +010058func Test_normal00_optrans()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020059 new
60 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
61 1
62 exe "norm! Sfoobar\<esc>"
63 call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$'))
64 2
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020065 exe "norm! $vbsone"
66 call assert_equal(['foobar', '2 This is the second one', '3 this is the third line', ''], getline(1,'$'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020067 norm! VS Second line here
68 call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$'))
69 %d
70 call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line'])
71 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
72
73 1
74 norm! 2D
75 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,'$'))
76 set cpo+=#
77 norm! 4D
78 call assert_equal(['', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
79
80 " clean up
81 set cpo-=#
82 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020083endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020084
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010085func Test_normal01_keymodel()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020086 call Setup_NewWindow()
87 " Test 1: depending on 'keymodel' <s-down> does something different
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020088 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020089 call feedkeys("V\<S-Up>y", 'tx')
90 call assert_equal(['47', '48', '49', '50'], getline("'<", "'>"))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020091 set keymodel=startsel
92 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020093 call feedkeys("V\<S-Up>y", 'tx')
94 call assert_equal(['49', '50'], getline("'<", "'>"))
95 " Start visual mode when keymodel = startsel
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020096 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020097 call feedkeys("\<S-Up>y", 'tx')
98 call assert_equal(['49', '5'], getreg(0, 0, 1))
Bram Moolenaar1671f442020-03-10 07:48:13 +010099 " Use the different Shift special keys
100 50
101 call feedkeys("\<S-Right>\<S-Left>\<S-Up>\<S-Down>\<S-Home>\<S-End>y", 'tx')
102 call assert_equal(['50'], getline("'<", "'>"))
103 call assert_equal(['50', ''], getreg(0, 0, 1))
104
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200105 " Do not start visual mode when keymodel=
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200106 set keymodel=
107 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200108 call feedkeys("\<S-Up>y$", 'tx')
109 call assert_equal(['42'], getreg(0, 0, 1))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200110 " Stop visual mode when keymodel=stopsel
111 set keymodel=stopsel
112 50
113 call feedkeys("Vkk\<Up>yy", 'tx')
114 call assert_equal(['47'], getreg(0, 0, 1))
115
116 set keymodel=
117 50
118 call feedkeys("Vkk\<Up>yy", 'tx')
119 call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200120
121 " clean up
122 bw!
123endfunc
124
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100125func Test_normal03_join()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200126 " basic join test
127 call Setup_NewWindow()
128 50
129 norm! VJ
130 call assert_equal('50 51', getline('.'))
131 $
132 norm! J
133 call assert_equal('100', getline('.'))
134 $
135 norm! V9-gJ
136 call assert_equal('919293949596979899100', getline('.'))
137 call setline(1, range(1,100))
138 $
139 :j 10
140 call assert_equal('100', getline('.'))
Bram Moolenaar004a6782020-04-11 17:09:31 +0200141 call assert_beeps('normal GVJ')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200142 " clean up
143 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200144endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200145
Bram Moolenaar004a6782020-04-11 17:09:31 +0200146" basic filter test
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100147func Test_normal04_filter()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200148 " only test on non windows platform
Bram Moolenaar004a6782020-04-11 17:09:31 +0200149 CheckNotMSWindows
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200150 call Setup_NewWindow()
151 1
152 call feedkeys("!!sed -e 's/^/| /'\n", 'tx')
153 call assert_equal('| 1', getline('.'))
154 90
155 :sil :!echo one
156 call feedkeys('.', 'tx')
157 call assert_equal('| 90', getline('.'))
158 95
159 set cpo+=!
160 " 2 <CR>, 1: for executing the command,
161 " 2: clear hit-enter-prompt
162 call feedkeys("!!\n", 'tx')
163 call feedkeys(":!echo one\n\n", 'tx')
164 call feedkeys(".", 'tx')
165 call assert_equal('one', getline('.'))
166 set cpo-=!
167 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200168endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200169
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100170func Test_normal05_formatexpr()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200171 " basic formatexpr test
172 call Setup_NewWindow()
173 %d_
174 call setline(1, ['here: 1 ', '2', 'here: 3 ', '4', 'not here: '])
175 1
176 set formatexpr=MyFormatExpr()
177 norm! gqG
178 call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here: '], getline(1,'$'))
179 set formatexpr=
180 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200181endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200182
Bram Moolenaard77f9d52016-09-04 15:13:39 +0200183func Test_normal05_formatexpr_newbuf()
184 " Edit another buffer in the 'formatexpr' function
185 new
186 func! Format()
187 edit another
188 endfunc
189 set formatexpr=Format()
190 norm gqG
191 bw!
192 set formatexpr=
193endfunc
194
195func Test_normal05_formatexpr_setopt()
196 " Change the 'formatexpr' value in the function
197 new
198 func! Format()
199 set formatexpr=
200 endfunc
201 set formatexpr=Format()
202 norm gqG
203 bw!
204 set formatexpr=
205endfunc
206
Bram Moolenaar2eaeaf32020-05-03 16:04:43 +0200207" When 'formatexpr' returns non-zero, internal formatting is used.
208func Test_normal_formatexpr_returns_nonzero()
209 new
210 call setline(1, ['one', 'two'])
211 func! Format()
212 return 1
213 endfunc
214 setlocal formatexpr=Format()
215 normal VGgq
216 call assert_equal(['one two'], getline(1, '$'))
217 setlocal formatexpr=
218 delfunc Format
219 close!
220endfunc
221
Bram Moolenaar004a6782020-04-11 17:09:31 +0200222" basic test for formatprg
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100223func Test_normal06_formatprg()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200224 " only test on non windows platform
Bram Moolenaar004a6782020-04-11 17:09:31 +0200225 CheckNotMSWindows
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100226
227 " uses sed to number non-empty lines
228 call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/ /', '}'''], 'Xsed_format.sh')
229 call system('chmod +x ./Xsed_format.sh')
230 let text = ['a', '', 'c', '', ' ', 'd', 'e']
231 let expected = ['1 a', '', '3 c', '', '5 ', '6 d', '7 e']
232
233 10new
234 call setline(1, text)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200235 set formatprg=./Xsed_format.sh
236 norm! gggqG
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100237 call assert_equal(expected, getline(1, '$'))
Bram Moolenaar004a6782020-04-11 17:09:31 +0200238 %d
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100239
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100240 call setline(1, text)
241 set formatprg=donothing
242 setlocal formatprg=./Xsed_format.sh
243 norm! gggqG
244 call assert_equal(expected, getline(1, '$'))
Bram Moolenaar004a6782020-04-11 17:09:31 +0200245 %d
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100246
Bram Moolenaar004a6782020-04-11 17:09:31 +0200247 " Check for the command-line ranges added to 'formatprg'
248 set formatprg=cat
249 call setline(1, ['one', 'two', 'three', 'four', 'five'])
250 call feedkeys('gggqG', 'xt')
251 call assert_equal('.,$!cat', @:)
252 call feedkeys('2Ggq2j', 'xt')
253 call assert_equal('.,.+2!cat', @:)
254
255 bw!
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200256 " clean up
257 set formatprg=
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100258 setlocal formatprg=
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200259 call delete('Xsed_format.sh')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200260endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200261
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100262func Test_normal07_internalfmt()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200263 " basic test for internal formmatter to textwidth of 12
264 let list=range(1,11)
265 call map(list, 'v:val." "')
266 10new
267 call setline(1, list)
268 set tw=12
Bram Moolenaar004a6782020-04-11 17:09:31 +0200269 norm! ggVGgq
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200270 call assert_equal(['1 2 3', '4 5 6', '7 8 9', '10 11 '], getline(1, '$'))
271 " clean up
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100272 set tw=0
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200273 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200274endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200275
Bram Moolenaar004a6782020-04-11 17:09:31 +0200276" basic tests for foldopen/folddelete
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100277func Test_normal08_fold()
Bram Moolenaar004a6782020-04-11 17:09:31 +0200278 CheckFeature folding
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200279 call Setup_NewWindow()
280 50
281 setl foldenable fdm=marker
282 " First fold
283 norm! V4jzf
284 " check that folds have been created
285 call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54))
286 " Second fold
287 46
288 norm! V10jzf
289 " check that folds have been created
290 call assert_equal('46/*{{{*/', getline(46))
291 call assert_equal('60/*}}}*/', getline(60))
292 norm! k
293 call assert_equal('45', getline('.'))
294 norm! j
295 call assert_equal('46/*{{{*/', getline('.'))
296 norm! j
297 call assert_equal('61', getline('.'))
298 norm! k
299 " open a fold
300 norm! Vzo
301 norm! k
302 call assert_equal('45', getline('.'))
303 norm! j
304 call assert_equal('46/*{{{*/', getline('.'))
305 norm! j
306 call assert_equal('47', getline('.'))
307 norm! k
308 norm! zcVzO
309 call assert_equal('46/*{{{*/', getline('.'))
310 norm! j
311 call assert_equal('47', getline('.'))
312 norm! j
313 call assert_equal('48', getline('.'))
314 norm! j
315 call assert_equal('49', getline('.'))
316 norm! j
317 call assert_equal('50/*{{{*/', getline('.'))
318 norm! j
319 call assert_equal('51', getline('.'))
320 " delete folds
321 :46
322 " collapse fold
323 norm! V14jzC
324 " delete all folds recursively
325 norm! VzD
326 call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60))
327
328 " clean up
329 setl nofoldenable fdm=marker
330 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200331endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200332
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100333func Test_normal09_operatorfunc()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200334 " Test operatorfunc
335 call Setup_NewWindow()
336 " Add some spaces for counting
337 50,60s/$/ /
338 unlet! g:a
339 let g:a=0
340 nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@
341 vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
342 50
343 norm V2j,,
344 call assert_equal(6, g:a)
345 norm V,,
346 call assert_equal(2, g:a)
347 norm ,,l
348 call assert_equal(0, g:a)
349 50
350 exe "norm 0\<c-v>10j2l,,"
351 call assert_equal(11, g:a)
352 50
353 norm V10j,,
354 call assert_equal(22, g:a)
355
356 " clean up
357 unmap <buffer> ,,
358 set opfunc=
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100359 unlet! g:a
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200360 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200361endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200362
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100363func Test_normal09a_operatorfunc()
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100364 " Test operatorfunc
365 call Setup_NewWindow()
366 " Add some spaces for counting
367 50,60s/$/ /
368 unlet! g:opt
369 set linebreak
370 nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@
371 50
372 norm ,,j
373 exe "bd!" g:bufnr
374 call assert_true(&linebreak)
375 call assert_equal(g:opt, &linebreak)
376 set nolinebreak
377 norm ,,j
378 exe "bd!" g:bufnr
379 call assert_false(&linebreak)
380 call assert_equal(g:opt, &linebreak)
381
382 " clean up
383 unmap <buffer> ,,
384 set opfunc=
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200385 call assert_fails('normal Vg@', 'E774:')
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100386 bw!
387 unlet! g:opt
388endfunc
389
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100390func Test_normal10_expand()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200391 " Test for expand()
392 10new
393 call setline(1, ['1', 'ifooar,,cbar'])
394 2
395 norm! $
Bram Moolenaar65f08472017-09-10 18:16:20 +0200396 call assert_equal('cbar', expand('<cword>'))
397 call assert_equal('ifooar,,cbar', expand('<cWORD>'))
398
399 call setline(1, ['prx = list[idx];'])
400 1
401 let expected = ['', 'prx', 'prx', 'prx',
402 \ 'list', 'list', 'list', 'list', 'list', 'list', 'list',
403 \ 'idx', 'idx', 'idx', 'idx',
404 \ 'list[idx]',
405 \ '];',
406 \ ]
407 for i in range(1, 16)
408 exe 'norm ' . i . '|'
409 call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i)
410 endfor
411
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100412 if executable('echo')
413 " Test expand(`...`) i.e. backticks command expansion.
Bram Moolenaar077ff432019-10-28 00:42:21 +0100414 call assert_equal('abcde', expand('`echo abcde`'))
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100415 endif
416
417 " Test expand(`=...`) i.e. backticks expression expansion
418 call assert_equal('5', expand('`=2+3`'))
Bram Moolenaar8b633132020-03-20 18:20:51 +0100419 call assert_equal('3.14', expand('`=3.14`'))
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100420
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200421 " clean up
422 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200423endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200424
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100425func Test_normal11_showcmd()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200426 " test for 'showcmd'
427 10new
428 exe "norm! ofoobar\<esc>"
429 call assert_equal(2, line('$'))
430 set showcmd
431 exe "norm! ofoobar2\<esc>"
432 call assert_equal(3, line('$'))
433 exe "norm! VAfoobar3\<esc>"
434 call assert_equal(3, line('$'))
435 exe "norm! 0d3\<del>2l"
436 call assert_equal('obar2foobar3', getline('.'))
437 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200438endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200439
Bram Moolenaar1671f442020-03-10 07:48:13 +0100440" Test for nv_error and normal command errors
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100441func Test_normal12_nv_error()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200442 10new
443 call setline(1, range(1,5))
444 " should not do anything, just beep
Bram Moolenaarf5f1e102020-03-08 05:13:15 +0100445 call assert_beeps('exe "norm! <c-k>"')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200446 call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +0100447 call assert_beeps('normal! G2dd')
448 call assert_beeps("normal! g\<C-A>")
449 call assert_beeps("normal! g\<C-X>")
450 call assert_beeps("normal! g\<C-B>")
Bram Moolenaar1671f442020-03-10 07:48:13 +0100451 call assert_beeps("normal! vQ\<Esc>")
452 call assert_beeps("normal! 2[[")
453 call assert_beeps("normal! 2]]")
454 call assert_beeps("normal! 2[]")
455 call assert_beeps("normal! 2][")
456 call assert_beeps("normal! 4[z")
457 call assert_beeps("normal! 4]z")
458 call assert_beeps("normal! 4[c")
459 call assert_beeps("normal! 4]c")
460 call assert_beeps("normal! 200%")
461 call assert_beeps("normal! %")
462 call assert_beeps("normal! 2{")
463 call assert_beeps("normal! 2}")
464 call assert_beeps("normal! r\<Right>")
465 call assert_beeps("normal! 8ry")
466 call assert_beeps('normal! "@')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200467 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200468endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200469
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100470func Test_normal13_help()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200471 " Test for F1
472 call assert_equal(1, winnr())
473 call feedkeys("\<f1>", 'txi')
474 call assert_match('help\.txt', bufname('%'))
475 call assert_equal(2, winnr('$'))
476 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200477endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200478
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100479func Test_normal14_page()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200480 " basic test for Ctrl-F and Ctrl-B
481 call Setup_NewWindow()
482 exe "norm! \<c-f>"
483 call assert_equal('9', getline('.'))
484 exe "norm! 2\<c-f>"
485 call assert_equal('25', getline('.'))
486 exe "norm! 2\<c-b>"
487 call assert_equal('18', getline('.'))
488 1
489 set scrolloff=5
490 exe "norm! 2\<c-f>"
491 call assert_equal('21', getline('.'))
492 exe "norm! \<c-b>"
493 call assert_equal('13', getline('.'))
494 1
495 set scrolloff=99
496 exe "norm! \<c-f>"
497 call assert_equal('13', getline('.'))
498 set scrolloff=0
499 100
500 exe "norm! $\<c-b>"
501 call assert_equal('92', getline('.'))
502 call assert_equal([0, 92, 1, 0, 1], getcurpos())
503 100
504 set nostartofline
505 exe "norm! $\<c-b>"
506 call assert_equal('92', getline('.'))
507 call assert_equal([0, 92, 2, 0, 2147483647], getcurpos())
508 " cleanup
509 set startofline
510 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200511endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200512
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100513func Test_normal14_page_eol()
Bram Moolenaarbc54f3f2016-09-04 14:34:28 +0200514 10new
515 norm oxxxxxxx
516 exe "norm 2\<c-f>"
517 " check with valgrind that cursor is put back in column 1
518 exe "norm 2\<c-b>"
519 bw!
520endfunc
521
Bram Moolenaar1671f442020-03-10 07:48:13 +0100522" Test for errors with z command
523func Test_normal_z_error()
524 call assert_beeps('normal! z2p')
525 call assert_beeps('normal! zp')
526endfunc
527
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100528func Test_normal15_z_scroll_vert()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200529 " basic test for z commands that scroll the window
530 call Setup_NewWindow()
531 100
532 norm! >>
533 " Test for z<cr>
534 exe "norm! z\<cr>"
535 call assert_equal(' 100', getline('.'))
536 call assert_equal(100, winsaveview()['topline'])
537 call assert_equal([0, 100, 2, 0, 9], getcurpos())
538
539 " Test for zt
540 21
541 norm! >>0zt
542 call assert_equal(' 21', getline('.'))
543 call assert_equal(21, winsaveview()['topline'])
544 call assert_equal([0, 21, 1, 0, 8], getcurpos())
545
546 " Test for zb
547 30
548 norm! >>$ztzb
549 call assert_equal(' 30', getline('.'))
550 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
551 call assert_equal([0, 30, 3, 0, 2147483647], getcurpos())
552
553 " Test for z-
554 1
555 30
556 norm! 0z-
557 call assert_equal(' 30', getline('.'))
558 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
559 call assert_equal([0, 30, 2, 0, 9], getcurpos())
560
561 " Test for z{height}<cr>
562 call assert_equal(10, winheight(0))
563 exe "norm! z12\<cr>"
564 call assert_equal(12, winheight(0))
565 exe "norm! z10\<cr>"
566 call assert_equal(10, winheight(0))
567
568 " Test for z.
569 1
570 21
571 norm! 0z.
572 call assert_equal(' 21', getline('.'))
573 call assert_equal(17, winsaveview()['topline'])
574 call assert_equal([0, 21, 2, 0, 9], getcurpos())
575
576 " Test for zz
577 1
578 21
579 norm! 0zz
580 call assert_equal(' 21', getline('.'))
581 call assert_equal(17, winsaveview()['topline'])
582 call assert_equal([0, 21, 1, 0, 8], getcurpos())
583
584 " Test for z+
585 11
586 norm! zt
587 norm! z+
588 call assert_equal(' 21', getline('.'))
589 call assert_equal(21, winsaveview()['topline'])
590 call assert_equal([0, 21, 2, 0, 9], getcurpos())
591
592 " Test for [count]z+
593 1
594 norm! 21z+
595 call assert_equal(' 21', getline('.'))
596 call assert_equal(21, winsaveview()['topline'])
597 call assert_equal([0, 21, 2, 0, 9], getcurpos())
598
599 " Test for z^
600 norm! 22z+0
601 norm! z^
602 call assert_equal(' 21', getline('.'))
603 call assert_equal(12, winsaveview()['topline'])
604 call assert_equal([0, 21, 2, 0, 9], getcurpos())
605
606 " Test for [count]z^
607 1
608 norm! 30z^
609 call assert_equal(' 21', getline('.'))
610 call assert_equal(12, winsaveview()['topline'])
611 call assert_equal([0, 21, 2, 0, 9], getcurpos())
612
613 " cleanup
614 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200615endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200616
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100617func Test_normal16_z_scroll_hor()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200618 " basic test for z commands that scroll the window
619 10new
620 15vsp
621 set nowrap listchars=
622 let lineA='abcdefghijklmnopqrstuvwxyz'
623 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
624 $put =lineA
625 $put =lineB
626 1d
627
Bram Moolenaar1671f442020-03-10 07:48:13 +0100628 " Test for zl and zh with a count
629 norm! 0z10l
630 call assert_equal([11, 1], [col('.'), wincol()])
631 norm! z4h
632 call assert_equal([11, 5], [col('.'), wincol()])
633 normal! 2gg
634
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200635 " Test for zl
636 1
637 norm! 5zl
638 call assert_equal(lineA, getline('.'))
639 call assert_equal(6, col('.'))
640 call assert_equal(5, winsaveview()['leftcol'])
641 norm! yl
642 call assert_equal('f', @0)
643
644 " Test for zh
645 norm! 2zh
646 call assert_equal(lineA, getline('.'))
647 call assert_equal(6, col('.'))
648 norm! yl
649 call assert_equal('f', @0)
650 call assert_equal(3, winsaveview()['leftcol'])
651
652 " Test for zL
653 norm! zL
654 call assert_equal(11, col('.'))
655 norm! yl
656 call assert_equal('k', @0)
657 call assert_equal(10, winsaveview()['leftcol'])
658 norm! 2zL
659 call assert_equal(25, col('.'))
660 norm! yl
661 call assert_equal('y', @0)
662 call assert_equal(24, winsaveview()['leftcol'])
663
664 " Test for zH
665 norm! 2zH
666 call assert_equal(25, col('.'))
667 call assert_equal(10, winsaveview()['leftcol'])
668 norm! yl
669 call assert_equal('y', @0)
670
671 " Test for zs
672 norm! $zs
673 call assert_equal(26, col('.'))
674 call assert_equal(25, winsaveview()['leftcol'])
675 norm! yl
676 call assert_equal('z', @0)
677
678 " Test for ze
679 norm! ze
680 call assert_equal(26, col('.'))
681 call assert_equal(11, winsaveview()['leftcol'])
682 norm! yl
683 call assert_equal('z', @0)
684
685 " cleanup
686 set wrap listchars=eol:$
687 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200688endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200689
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100690func Test_normal17_z_scroll_hor2()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200691 " basic test for z commands that scroll the window
692 " using 'sidescrolloff' setting
693 10new
694 20vsp
695 set nowrap listchars= sidescrolloff=5
696 let lineA='abcdefghijklmnopqrstuvwxyz'
697 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
698 $put =lineA
699 $put =lineB
700 1d
701
702 " Test for zl
703 1
704 norm! 5zl
705 call assert_equal(lineA, getline('.'))
706 call assert_equal(11, col('.'))
707 call assert_equal(5, winsaveview()['leftcol'])
708 norm! yl
709 call assert_equal('k', @0)
710
711 " Test for zh
712 norm! 2zh
713 call assert_equal(lineA, getline('.'))
714 call assert_equal(11, col('.'))
715 norm! yl
716 call assert_equal('k', @0)
717 call assert_equal(3, winsaveview()['leftcol'])
718
719 " Test for zL
720 norm! 0zL
721 call assert_equal(16, col('.'))
722 norm! yl
723 call assert_equal('p', @0)
724 call assert_equal(10, winsaveview()['leftcol'])
725 norm! 2zL
726 call assert_equal(26, col('.'))
727 norm! yl
728 call assert_equal('z', @0)
729 call assert_equal(15, winsaveview()['leftcol'])
730
731 " Test for zH
732 norm! 2zH
733 call assert_equal(15, col('.'))
734 call assert_equal(0, winsaveview()['leftcol'])
735 norm! yl
736 call assert_equal('o', @0)
737
738 " Test for zs
739 norm! $zs
740 call assert_equal(26, col('.'))
741 call assert_equal(20, winsaveview()['leftcol'])
742 norm! yl
743 call assert_equal('z', @0)
744
745 " Test for ze
746 norm! ze
747 call assert_equal(26, col('.'))
748 call assert_equal(11, winsaveview()['leftcol'])
749 norm! yl
750 call assert_equal('z', @0)
751
752 " cleanup
753 set wrap listchars=eol:$ sidescrolloff=0
754 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200755endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200756
Bram Moolenaarbdd2c292020-06-22 21:34:30 +0200757" Test for commands that scroll the window horizontally. Test with folds.
758" H, M, L, CTRL-E, CTRL-Y, CTRL-U, CTRL-D, PageUp, PageDown commands
759func Test_vert_scroll_cmds()
Bram Moolenaar1671f442020-03-10 07:48:13 +0100760 15new
761 call setline(1, range(1, 100))
762 exe "normal! 30ggz\<CR>"
763 set foldenable
764 33,36fold
765 40,43fold
766 46,49fold
767 let h = winheight(0)
Bram Moolenaarbdd2c292020-06-22 21:34:30 +0200768
769 " Test for H, M and L commands
Bram Moolenaar1671f442020-03-10 07:48:13 +0100770 " Top of the screen = 30
771 " Folded lines = 9
772 " Bottom of the screen = 30 + h + 9 - 1
773 normal! 4L
774 call assert_equal(35 + h, line('.'))
775 normal! 4H
776 call assert_equal(33, line('.'))
Bram Moolenaarbdd2c292020-06-22 21:34:30 +0200777
778 " Test for the CTRL-E and CTRL-Y commands with folds
779 %d
780 call setline(1, range(1, 10))
781 3,5fold
782 exe "normal 6G3\<C-E>"
783 call assert_equal(6, line('w0'))
784 exe "normal 2\<C-Y>"
785 call assert_equal(2, line('w0'))
786
787 " Test for CTRL-Y on a folded line
788 %d
789 call setline(1, range(1, 100))
790 exe (h + 2) .. "," .. (h + 4) .. "fold"
791 exe h + 5
792 normal z-
793 exe "normal \<C-Y>\<C-Y>"
794 call assert_equal(h + 1, line('w$'))
795
796 " Using <PageUp> and <PageDown> in an empty buffer should beep
797 %d
798 call assert_beeps('exe "normal \<PageUp>"')
799 call assert_beeps('exe "normal \<C-B>"')
800 call assert_beeps('exe "normal \<PageDown>"')
801 call assert_beeps('exe "normal \<C-F>"')
802
803 " Test for <C-U> and <C-D> with fold
804 %d
805 call setline(1, range(1, 100))
806 10,35fold
807 set scroll=10
808 exe "normal \<C-D>"
809 call assert_equal(36, line('.'))
810 exe "normal \<C-D>"
811 call assert_equal(46, line('.'))
812 exe "normal \<C-U>"
813 call assert_equal(36, line('.'))
814 exe "normal \<C-U>"
815 call assert_equal(10, line('.'))
816 exe "normal \<C-U>"
817 call assert_equal(1, line('.'))
818 set scroll&
819
820 " Test for scrolling to the top of the file with <C-U> and a fold
821 10
822 normal ztL
823 exe "normal \<C-U>\<C-U>"
824 call assert_equal(1, line('w0'))
825
826 " Test for CTRL-D on a folded line
827 %d
828 call setline(1, range(1, 100))
829 50,100fold
830 75
831 normal z-
832 exe "normal \<C-D>"
833 call assert_equal(50, line('.'))
834 call assert_equal(100, line('w$'))
835 normal z.
836 let lnum = winline()
837 exe "normal \<C-D>"
838 call assert_equal(lnum, winline())
839 call assert_equal(50, line('.'))
840 normal zt
841 exe "normal \<C-D>"
842 call assert_equal(50, line('w0'))
843
Bram Moolenaar1671f442020-03-10 07:48:13 +0100844 set foldenable&
845 close!
846endfunc
847
Bram Moolenaarbdd2c292020-06-22 21:34:30 +0200848" Test for the 'sidescroll' option
849func Test_sidescroll_opt()
850 new
851 20vnew
852
853 " scroll by 2 characters horizontally
854 set sidescroll=2 nowrap
855 call setline(1, repeat('a', 40))
856 normal g$l
857 call assert_equal(19, screenpos(0, 1, 21).col)
858 normal l
859 call assert_equal(20, screenpos(0, 1, 22).col)
860 normal g0h
861 call assert_equal(2, screenpos(0, 1, 2).col)
862 call assert_equal(20, screenpos(0, 1, 20).col)
863
864 " when 'sidescroll' is 0, cursor positioned at the center
865 set sidescroll=0
866 normal g$l
867 call assert_equal(11, screenpos(0, 1, 21).col)
868 normal g0h
869 call assert_equal(10, screenpos(0, 1, 10).col)
870
871 %bw!
872 set wrap& sidescroll&
873endfunc
874
Bram Moolenaar004a6782020-04-11 17:09:31 +0200875" basic tests for foldopen/folddelete
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100876func Test_normal18_z_fold()
Bram Moolenaar004a6782020-04-11 17:09:31 +0200877 CheckFeature folding
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200878 call Setup_NewWindow()
879 50
880 setl foldenable fdm=marker foldlevel=5
881
Bram Moolenaar1671f442020-03-10 07:48:13 +0100882 call assert_beeps('normal! zj')
883 call assert_beeps('normal! zk')
884
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200885 " Test for zF
886 " First fold
887 norm! 4zF
888 " check that folds have been created
889 call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53))
890
891 " Test for zd
892 51
893 norm! 2zF
894 call assert_equal(2, foldlevel('.'))
895 norm! kzd
896 call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53))
897 norm! j
898 call assert_equal(1, foldlevel('.'))
899
900 " Test for zD
901 " also deletes partially selected folds recursively
902 51
903 norm! zF
904 call assert_equal(2, foldlevel('.'))
905 norm! kV2jzD
906 call assert_equal(['50', '51', '52', '53'], getline(50,53))
907
908 " Test for zE
909 85
910 norm! 4zF
911 86
912 norm! 2zF
913 90
914 norm! 4zF
915 call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93))
916 norm! zE
917 call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93))
918
919 " Test for zn
920 50
921 set foldlevel=0
922 norm! 2zF
923 norm! zn
924 norm! k
925 call assert_equal('49', getline('.'))
926 norm! j
927 call assert_equal('50/*{{{*/', getline('.'))
928 norm! j
929 call assert_equal('51/*}}}*/', getline('.'))
930 norm! j
931 call assert_equal('52', getline('.'))
932 call assert_equal(0, &foldenable)
933
934 " Test for zN
935 49
936 norm! zN
937 call assert_equal('49', getline('.'))
938 norm! j
939 call assert_equal('50/*{{{*/', getline('.'))
940 norm! j
941 call assert_equal('52', getline('.'))
942 call assert_equal(1, &foldenable)
943
944 " Test for zi
945 norm! zi
946 call assert_equal(0, &foldenable)
947 norm! zi
948 call assert_equal(1, &foldenable)
949 norm! zi
950 call assert_equal(0, &foldenable)
951 norm! zi
952 call assert_equal(1, &foldenable)
953
954 " Test for za
955 50
956 norm! za
957 norm! k
958 call assert_equal('49', getline('.'))
959 norm! j
960 call assert_equal('50/*{{{*/', getline('.'))
961 norm! j
962 call assert_equal('51/*}}}*/', getline('.'))
963 norm! j
964 call assert_equal('52', getline('.'))
965 50
966 norm! za
967 norm! k
968 call assert_equal('49', getline('.'))
969 norm! j
970 call assert_equal('50/*{{{*/', getline('.'))
971 norm! j
972 call assert_equal('52', getline('.'))
973
974 49
975 norm! 5zF
976 norm! k
977 call assert_equal('48', getline('.'))
978 norm! j
979 call assert_equal('49/*{{{*/', getline('.'))
980 norm! j
981 call assert_equal('55', getline('.'))
982 49
983 norm! za
984 call assert_equal('49/*{{{*/', getline('.'))
985 norm! j
986 call assert_equal('50/*{{{*/', getline('.'))
987 norm! j
988 call assert_equal('52', getline('.'))
989 set nofoldenable
990 " close fold and set foldenable
991 norm! za
992 call assert_equal(1, &foldenable)
993
994 50
995 " have to use {count}za to open all folds and make the cursor visible
996 norm! 2za
997 norm! 2k
998 call assert_equal('48', getline('.'))
999 norm! j
1000 call assert_equal('49/*{{{*/', getline('.'))
1001 norm! j
1002 call assert_equal('50/*{{{*/', getline('.'))
1003 norm! j
1004 call assert_equal('51/*}}}*/', getline('.'))
1005 norm! j
1006 call assert_equal('52', getline('.'))
1007
1008 " Test for zA
1009 49
1010 set foldlevel=0
1011 50
1012 norm! zA
1013 norm! 2k
1014 call assert_equal('48', getline('.'))
1015 norm! j
1016 call assert_equal('49/*{{{*/', getline('.'))
1017 norm! j
1018 call assert_equal('50/*{{{*/', getline('.'))
1019 norm! j
1020 call assert_equal('51/*}}}*/', getline('.'))
1021 norm! j
1022 call assert_equal('52', getline('.'))
1023
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001024 " zA on a opened fold when foldenable is not set
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001025 50
1026 set nofoldenable
1027 norm! zA
1028 call assert_equal(1, &foldenable)
1029 norm! k
1030 call assert_equal('48', getline('.'))
1031 norm! j
1032 call assert_equal('49/*{{{*/', getline('.'))
1033 norm! j
1034 call assert_equal('55', getline('.'))
1035
1036 " Test for zc
1037 norm! zE
1038 50
1039 norm! 2zF
1040 49
1041 norm! 5zF
1042 set nofoldenable
1043 50
1044 " There most likely is a bug somewhere:
1045 " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ
1046 " TODO: Should this only close the inner most fold or both folds?
1047 norm! zc
1048 call assert_equal(1, &foldenable)
1049 norm! k
1050 call assert_equal('48', getline('.'))
1051 norm! j
1052 call assert_equal('49/*{{{*/', getline('.'))
1053 norm! j
1054 call assert_equal('55', getline('.'))
1055 set nofoldenable
1056 50
1057 norm! Vjzc
1058 norm! k
1059 call assert_equal('48', getline('.'))
1060 norm! j
1061 call assert_equal('49/*{{{*/', getline('.'))
1062 norm! j
1063 call assert_equal('55', getline('.'))
1064
1065 " Test for zC
1066 set nofoldenable
1067 50
1068 norm! zCk
1069 call assert_equal('48', getline('.'))
1070 norm! j
1071 call assert_equal('49/*{{{*/', getline('.'))
1072 norm! j
1073 call assert_equal('55', getline('.'))
1074
1075 " Test for zx
1076 " 1) close folds at line 49-54
1077 set nofoldenable
1078 48
1079 norm! zx
1080 call assert_equal(1, &foldenable)
1081 norm! j
1082 call assert_equal('49/*{{{*/', getline('.'))
1083 norm! j
1084 call assert_equal('55', getline('.'))
1085
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001086 " 2) do not close fold under cursor
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001087 51
1088 set nofoldenable
1089 norm! zx
1090 call assert_equal(1, &foldenable)
1091 norm! 3k
1092 call assert_equal('48', getline('.'))
1093 norm! j
1094 call assert_equal('49/*{{{*/', getline('.'))
1095 norm! j
1096 call assert_equal('50/*{{{*/', getline('.'))
1097 norm! j
1098 call assert_equal('51/*}}}*/', getline('.'))
1099 norm! j
1100 call assert_equal('52', getline('.'))
1101 norm! j
1102 call assert_equal('53', getline('.'))
1103 norm! j
1104 call assert_equal('54/*}}}*/', getline('.'))
1105 norm! j
1106 call assert_equal('55', getline('.'))
1107
1108 " 3) close one level of folds
1109 48
1110 set nofoldenable
1111 set foldlevel=1
1112 norm! zx
1113 call assert_equal(1, &foldenable)
1114 call assert_equal('48', getline('.'))
1115 norm! j
1116 call assert_equal('49/*{{{*/', getline('.'))
1117 norm! j
1118 call assert_equal('50/*{{{*/', getline('.'))
1119 norm! j
1120 call assert_equal('52', getline('.'))
1121 norm! j
1122 call assert_equal('53', getline('.'))
1123 norm! j
1124 call assert_equal('54/*}}}*/', getline('.'))
1125 norm! j
1126 call assert_equal('55', getline('.'))
1127
1128 " Test for zX
1129 " Close all folds
1130 set foldlevel=0 nofoldenable
1131 50
1132 norm! zX
1133 call assert_equal(1, &foldenable)
1134 norm! k
1135 call assert_equal('48', getline('.'))
1136 norm! j
1137 call assert_equal('49/*{{{*/', getline('.'))
1138 norm! j
1139 call assert_equal('55', getline('.'))
1140
1141 " Test for zm
1142 50
1143 set nofoldenable foldlevel=2
1144 norm! zm
1145 call assert_equal(1, &foldenable)
1146 call assert_equal(1, &foldlevel)
1147 norm! zm
1148 call assert_equal(0, &foldlevel)
1149 norm! zm
1150 call assert_equal(0, &foldlevel)
1151 norm! k
1152 call assert_equal('48', getline('.'))
1153 norm! j
1154 call assert_equal('49/*{{{*/', getline('.'))
1155 norm! j
1156 call assert_equal('55', getline('.'))
1157
1158 " Test for zM
1159 48
1160 set nofoldenable foldlevel=99
1161 norm! zM
1162 call assert_equal(1, &foldenable)
1163 call assert_equal(0, &foldlevel)
1164 call assert_equal('48', getline('.'))
1165 norm! j
1166 call assert_equal('49/*{{{*/', getline('.'))
1167 norm! j
1168 call assert_equal('55', getline('.'))
1169
1170 " Test for zr
1171 48
1172 set nofoldenable foldlevel=0
1173 norm! zr
1174 call assert_equal(0, &foldenable)
1175 call assert_equal(1, &foldlevel)
1176 set foldlevel=0 foldenable
1177 norm! zr
1178 call assert_equal(1, &foldenable)
1179 call assert_equal(1, &foldlevel)
1180 norm! zr
1181 call assert_equal(2, &foldlevel)
1182 call assert_equal('48', getline('.'))
1183 norm! j
1184 call assert_equal('49/*{{{*/', getline('.'))
1185 norm! j
1186 call assert_equal('50/*{{{*/', getline('.'))
1187 norm! j
1188 call assert_equal('51/*}}}*/', getline('.'))
1189 norm! j
1190 call assert_equal('52', getline('.'))
1191
1192 " Test for zR
1193 48
1194 set nofoldenable foldlevel=0
1195 norm! zR
1196 call assert_equal(0, &foldenable)
1197 call assert_equal(2, &foldlevel)
1198 set foldenable foldlevel=0
1199 norm! zR
1200 call assert_equal(1, &foldenable)
1201 call assert_equal(2, &foldlevel)
1202 call assert_equal('48', getline('.'))
1203 norm! j
1204 call assert_equal('49/*{{{*/', getline('.'))
1205 norm! j
1206 call assert_equal('50/*{{{*/', getline('.'))
1207 norm! j
1208 call assert_equal('51/*}}}*/', getline('.'))
1209 norm! j
1210 call assert_equal('52', getline('.'))
1211 call append(50, ['a /*{{{*/', 'b /*}}}*/'])
1212 48
1213 call assert_equal('48', getline('.'))
1214 norm! j
1215 call assert_equal('49/*{{{*/', getline('.'))
1216 norm! j
1217 call assert_equal('50/*{{{*/', getline('.'))
1218 norm! j
1219 call assert_equal('a /*{{{*/', getline('.'))
1220 norm! j
1221 call assert_equal('51/*}}}*/', getline('.'))
1222 norm! j
1223 call assert_equal('52', getline('.'))
1224 48
1225 norm! zR
1226 call assert_equal(1, &foldenable)
1227 call assert_equal(3, &foldlevel)
1228 call assert_equal('48', getline('.'))
1229 norm! j
1230 call assert_equal('49/*{{{*/', getline('.'))
1231 norm! j
1232 call assert_equal('50/*{{{*/', getline('.'))
1233 norm! j
1234 call assert_equal('a /*{{{*/', getline('.'))
1235 norm! j
1236 call assert_equal('b /*}}}*/', getline('.'))
1237 norm! j
1238 call assert_equal('51/*}}}*/', getline('.'))
1239 norm! j
1240 call assert_equal('52', getline('.'))
1241
1242 " clean up
1243 setl nofoldenable fdm=marker foldlevel=0
1244 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001245endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001246
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001247func Test_normal20_exmode()
Bram Moolenaar004a6782020-04-11 17:09:31 +02001248 " Reading from redirected file doesn't work on MS-Windows
1249 CheckNotMSWindows
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001250 call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript')
1251 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001252 call system(GetVimCommand() .. ' -e -s < Xscript Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001253 let a=readfile('Xfile2')
1254 call assert_equal(['1', 'foo', 'bar', '2'], a)
1255
1256 " clean up
1257 for file in ['Xfile', 'Xfile2', 'Xscript']
1258 call delete(file)
1259 endfor
1260 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001261endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001262
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001263func Test_normal21_nv_hat()
1264
1265 " Edit a fresh file and wipe the buffer list so that there is no alternate
1266 " file present. Next, check for the expected command failures.
1267 edit Xfoo | %bw
1268 call assert_fails(':buffer #', 'E86')
1269 call assert_fails(':execute "normal! \<C-^>"', 'E23')
1270
1271 " Test for the expected behavior when switching between two named buffers.
1272 edit Xfoo | edit Xbar
1273 call feedkeys("\<C-^>", 'tx')
1274 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1275 call feedkeys("\<C-^>", 'tx')
1276 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1277
1278 " Test for the expected behavior when only one buffer is named.
1279 enew | let l:nr = bufnr('%')
1280 call feedkeys("\<C-^>", 'tx')
1281 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1282 call feedkeys("\<C-^>", 'tx')
1283 call assert_equal('', bufname('%'))
1284 call assert_equal(l:nr, bufnr('%'))
1285
1286 " Test that no action is taken by "<C-^>" when an operator is pending.
1287 edit Xfoo
1288 call feedkeys("ci\<C-^>", 'tx')
1289 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1290
1291 %bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001292endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001293
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001294func Test_normal22_zet()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001295 " Test for ZZ
Bram Moolenaar0913a102016-09-03 19:11:59 +02001296 " let shell = &shell
1297 " let &shell = 'sh'
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001298 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001299 let args = ' -N -i NONE --noplugins -X --not-a-term'
1300 call system(GetVimCommand() .. args .. ' -c "%d" -c ":norm! ZZ" Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001301 let a = readfile('Xfile')
1302 call assert_equal([], a)
1303 " Test for ZQ
1304 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001305 call system(GetVimCommand() . args . ' -c "%d" -c ":norm! ZQ" Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001306 let a = readfile('Xfile')
1307 call assert_equal(['1', '2'], a)
1308
Bram Moolenaar1671f442020-03-10 07:48:13 +01001309 " Unsupported Z command
1310 call assert_beeps('normal! ZW')
1311
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001312 " clean up
1313 for file in ['Xfile']
1314 call delete(file)
1315 endfor
Bram Moolenaar0913a102016-09-03 19:11:59 +02001316 " let &shell = shell
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001317endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001318
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001319func Test_normal23_K()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001320 " Test for K command
1321 new
Bram Moolenaar426f3752016-11-04 21:22:37 +01001322 call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd'])
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001323 let k = &keywordprg
1324 set keywordprg=:help
1325 1
1326 norm! VK
1327 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1328 call assert_equal('help', &ft)
1329 call assert_match('\*version8.txt\*', getline('.'))
1330 helpclose
1331 norm! 0K
1332 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1333 call assert_equal('help', &ft)
Bram Moolenaarb1c91982018-05-17 17:04:55 +02001334 call assert_match('\*version8\.\d\*', getline('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001335 helpclose
1336
Bram Moolenaar426f3752016-11-04 21:22:37 +01001337 set keywordprg=:new
1338 set iskeyword+=%
1339 set iskeyword+=\|
1340 2
1341 norm! K
1342 call assert_equal('man', fnamemodify(bufname('%'), ':t'))
1343 bwipe!
1344 3
1345 norm! K
1346 call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t'))
1347 bwipe!
Bram Moolenaareb828d02016-11-05 19:54:01 +01001348 if !has('win32')
1349 4
1350 norm! K
1351 call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t'))
1352 bwipe!
1353 endif
Bram Moolenaar426f3752016-11-04 21:22:37 +01001354 set iskeyword-=%
1355 set iskeyword-=\|
1356
Bram Moolenaar0913a102016-09-03 19:11:59 +02001357 " Only expect "man" to work on Unix
1358 if !has("unix")
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001359 let &keywordprg = k
1360 bw!
1361 return
1362 endif
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001363
Bram Moolenaar9134f1e2019-11-29 20:26:13 +01001364 let not_gnu_man = has('mac') || has('bsd')
1365 if not_gnu_man
Bram Moolenaarc7d2a572019-11-28 21:16:06 +01001366 " In MacOS and BSD, the option for specifying a pager is different
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001367 set keywordprg=man\ -P\ cat
1368 else
1369 set keywordprg=man\ --pager=cat
1370 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001371 " Test for using man
1372 2
1373 let a = execute('unsilent norm! K')
Bram Moolenaar9134f1e2019-11-29 20:26:13 +01001374 if not_gnu_man
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001375 call assert_match("man -P cat 'man'", a)
1376 else
1377 call assert_match("man --pager=cat 'man'", a)
1378 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001379
Bram Moolenaar1671f442020-03-10 07:48:13 +01001380 " Error cases
1381 call setline(1, '#$#')
1382 call assert_fails('normal! ggK', 'E349:')
1383 call setline(1, '---')
1384 call assert_fails('normal! ggv2lK', 'E349:')
1385 call setline(1, ['abc', 'xyz'])
1386 call assert_fails("normal! gg2lv2h\<C-]>", 'E426:')
1387 call assert_beeps("normal! ggVjK")
1388
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001389 " clean up
1390 let &keywordprg = k
1391 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001392endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001393
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001394func Test_normal24_rot13()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001395 " Testing for g?? g?g?
1396 new
1397 call append(0, 'abcdefghijklmnopqrstuvwxyzäüö')
1398 1
1399 norm! g??
1400 call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.'))
1401 norm! g?g?
1402 call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.'))
1403
1404 " clean up
1405 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001406endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001407
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001408func Test_normal25_tag()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01001409 CheckFeature quickfix
1410
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001411 " Testing for CTRL-] g CTRL-] g]
1412 " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-]
1413 h
1414 " Test for CTRL-]
1415 call search('\<x\>$')
1416 exe "norm! \<c-]>"
1417 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1418 norm! yiW
1419 call assert_equal("*x*", @0)
1420 exe ":norm \<c-o>"
1421
1422 " Test for g_CTRL-]
1423 call search('\<v_u\>$')
1424 exe "norm! g\<c-]>"
1425 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1426 norm! yiW
1427 call assert_equal("*v_u*", @0)
1428 exe ":norm \<c-o>"
1429
1430 " Test for g]
1431 call search('\<i_<Esc>$')
1432 let a = execute(":norm! g]")
1433 call assert_match('i_<Esc>.*insert.txt', a)
1434
1435 if !empty(exepath('cscope')) && has('cscope')
1436 " setting cscopetag changes how g] works
1437 set cst
1438 exe "norm! g]"
1439 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1440 norm! yiW
1441 call assert_equal("*i_<Esc>*", @0)
1442 exe ":norm \<c-o>"
1443 " Test for CTRL-W g]
1444 exe "norm! \<C-W>g]"
1445 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1446 norm! yiW
1447 call assert_equal("*i_<Esc>*", @0)
1448 call assert_equal(3, winnr('$'))
1449 helpclose
1450 set nocst
1451 endif
1452
1453 " Test for CTRL-W g]
1454 let a = execute("norm! \<C-W>g]")
1455 call assert_match('i_<Esc>.*insert.txt', a)
1456
1457 " Test for CTRL-W CTRL-]
1458 exe "norm! \<C-W>\<C-]>"
1459 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1460 norm! yiW
1461 call assert_equal("*i_<Esc>*", @0)
1462 call assert_equal(3, winnr('$'))
1463 helpclose
1464
1465 " Test for CTRL-W g CTRL-]
1466 exe "norm! \<C-W>g\<C-]>"
1467 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1468 norm! yiW
1469 call assert_equal("*i_<Esc>*", @0)
1470 call assert_equal(3, winnr('$'))
1471 helpclose
1472
1473 " clean up
1474 helpclose
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001475endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001476
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001477func Test_normal26_put()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001478 " Test for ]p ]P [p and [P
1479 new
1480 call append(0, ['while read LINE', 'do', ' ((count++))', ' if [ $? -ne 0 ]; then', " echo 'Error writing file'", ' fi', 'done'])
1481 1
1482 /Error/y a
1483 2
1484 norm! "a]pj"a[p
1485 call assert_equal(['do', "echo 'Error writing file'", " echo 'Error writing file'", ' ((count++))'], getline(2,5))
1486 1
1487 /^\s\{4}/
1488 exe "norm! \"a]P3Eldt'"
1489 exe "norm! j\"a[P2Eldt'"
1490 call assert_equal([' if [ $? -ne 0 ]; then', " echo 'Error writing'", " echo 'Error'", " echo 'Error writing file'", ' fi'], getline(6,10))
1491
1492 " clean up
1493 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001494endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001495
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001496func Test_normal27_bracket()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001497 " Test for [' [` ]' ]`
1498 call Setup_NewWindow()
1499 1,21s/.\+/ & b/
1500 1
1501 norm! $ma
1502 5
1503 norm! $mb
1504 10
1505 norm! $mc
1506 15
1507 norm! $md
1508 20
1509 norm! $me
1510
1511 " Test for ['
1512 9
1513 norm! 2['
1514 call assert_equal(' 1 b', getline('.'))
1515 call assert_equal(1, line('.'))
1516 call assert_equal(3, col('.'))
1517
1518 " Test for ]'
1519 norm! ]'
1520 call assert_equal(' 5 b', getline('.'))
1521 call assert_equal(5, line('.'))
1522 call assert_equal(3, col('.'))
1523
1524 " No mark after line 21, cursor moves to first non blank on current line
1525 21
1526 norm! $]'
1527 call assert_equal(' 21 b', getline('.'))
1528 call assert_equal(21, line('.'))
1529 call assert_equal(3, col('.'))
1530
1531 " Test for [`
1532 norm! 2[`
1533 call assert_equal(' 15 b', getline('.'))
1534 call assert_equal(15, line('.'))
1535 call assert_equal(8, col('.'))
1536
1537 " Test for ]`
1538 norm! ]`
1539 call assert_equal(' 20 b', getline('.'))
1540 call assert_equal(20, line('.'))
1541 call assert_equal(8, col('.'))
1542
1543 " clean up
1544 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001545endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001546
Bram Moolenaar1671f442020-03-10 07:48:13 +01001547" Test for ( and ) sentence movements
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001548func Test_normal28_parenthesis()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001549 new
1550 call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
1551
1552 $
1553 norm! d(
1554 call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$'))
1555 norm! 2d(
1556 call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$'))
1557 1
1558 norm! 0d)
1559 call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$'))
1560
1561 call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. '])
1562 $
1563 norm! $d(
1564 call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$'))
1565
Bram Moolenaar224a5f12020-04-28 20:29:07 +02001566 " Move to the next sentence from a paragraph macro
1567 %d
1568 call setline(1, ['.LP', 'blue sky!. blue sky.', 'blue sky. blue sky.'])
1569 call cursor(1, 1)
1570 normal )
1571 call assert_equal([2, 1], [line('.'), col('.')])
1572 normal )
1573 call assert_equal([2, 12], [line('.'), col('.')])
1574 normal ((
1575 call assert_equal([1, 1], [line('.'), col('.')])
1576
Bram Moolenaar1671f442020-03-10 07:48:13 +01001577 " It is an error if a next sentence is not found
1578 %d
1579 call setline(1, '.SH')
1580 call assert_beeps('normal )')
1581
Bram Moolenaar224a5f12020-04-28 20:29:07 +02001582 " If only dot is present, don't treat that as a sentence
1583 call setline(1, '. This is a sentence.')
1584 normal $((
1585 call assert_equal(3, col('.'))
1586
Bram Moolenaar1671f442020-03-10 07:48:13 +01001587 " Jumping to a fold should open the fold
1588 call setline(1, ['', '', 'one', 'two', 'three'])
1589 set foldenable
1590 2,$fold
1591 call feedkeys(')', 'xt')
1592 call assert_equal(3, line('.'))
1593 call assert_equal(1, foldlevel('.'))
1594 call assert_equal(-1, foldclosed('.'))
1595 set foldenable&
1596
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001597 " clean up
1598 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001599endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001600
Bram Moolenaar1671f442020-03-10 07:48:13 +01001601" Test for { and } paragraph movements
1602func Test_normal29_brace()
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001603 let text =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001604 A paragraph begins after each empty line, and also at each of a set of
1605 paragraph macros, specified by the pairs of characters in the 'paragraphs'
1606 option. The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to
1607 the macros ".IP", ".LP", etc. (These are nroff macros, so the dot must be in
1608 the first column). A section boundary is also a paragraph boundary.
1609 Note that a blank line (only containing white space) is NOT a paragraph
1610 boundary.
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001611
1612
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001613 Also note that this does not include a '{' or '}' in the first column. When
1614 the '{' flag is in 'cpoptions' then '{' in the first column is used as a
1615 paragraph boundary |posix|.
1616 {
1617 This is no paragraph
1618 unless the '{' is set
1619 in 'cpoptions'
1620 }
1621 .IP
1622 The nroff macros IP separates a paragraph
1623 That means, it must be a '.'
1624 followed by IP
1625 .LPIt does not matter, if afterwards some
1626 more characters follow.
1627 .SHAlso section boundaries from the nroff
1628 macros terminate a paragraph. That means
1629 a character like this:
1630 .NH
1631 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001632 [DATA]
1633
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001634 new
1635 call append(0, text)
1636 1
1637 norm! 0d2}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001638
1639 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001640 .IP
1641 The nroff macros IP separates a paragraph
1642 That means, it must be a '.'
1643 followed by IP
1644 .LPIt does not matter, if afterwards some
1645 more characters follow.
1646 .SHAlso section boundaries from the nroff
1647 macros terminate a paragraph. That means
1648 a character like this:
1649 .NH
1650 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001651
1652 [DATA]
1653 call assert_equal(expected, getline(1, '$'))
1654
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001655 norm! 0d}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001656
1657 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001658 .LPIt does not matter, if afterwards some
1659 more characters follow.
1660 .SHAlso section boundaries from the nroff
1661 macros terminate a paragraph. That means
1662 a character like this:
1663 .NH
1664 End of text here
1665
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001666 [DATA]
1667 call assert_equal(expected, getline(1, '$'))
1668
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001669 $
1670 norm! d{
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001671
1672 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001673 .LPIt does not matter, if afterwards some
1674 more characters follow.
1675 .SHAlso section boundaries from the nroff
1676 macros terminate a paragraph. That means
1677 a character like this:
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001678
1679 [DATA]
1680 call assert_equal(expected, getline(1, '$'))
1681
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001682 norm! d{
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001683
1684 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001685 .LPIt does not matter, if afterwards some
1686 more characters follow.
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001687
1688 [DATA]
1689 call assert_equal(expected, getline(1, '$'))
1690
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001691 " Test with { in cpooptions
1692 %d
1693 call append(0, text)
1694 set cpo+={
1695 1
1696 norm! 0d2}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001697
1698 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001699 {
1700 This is no paragraph
1701 unless the '{' is set
1702 in 'cpoptions'
1703 }
1704 .IP
1705 The nroff macros IP separates a paragraph
1706 That means, it must be a '.'
1707 followed by IP
1708 .LPIt does not matter, if afterwards some
1709 more characters follow.
1710 .SHAlso section boundaries from the nroff
1711 macros terminate a paragraph. That means
1712 a character like this:
1713 .NH
1714 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001715
1716 [DATA]
1717 call assert_equal(expected, getline(1, '$'))
1718
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001719 $
1720 norm! d}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001721
1722 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001723 {
1724 This is no paragraph
1725 unless the '{' is set
1726 in 'cpoptions'
1727 }
1728 .IP
1729 The nroff macros IP separates a paragraph
1730 That means, it must be a '.'
1731 followed by IP
1732 .LPIt does not matter, if afterwards some
1733 more characters follow.
1734 .SHAlso section boundaries from the nroff
1735 macros terminate a paragraph. That means
1736 a character like this:
1737 .NH
1738 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001739
1740 [DATA]
1741 call assert_equal(expected, getline(1, '$'))
1742
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001743 norm! gg}
1744 norm! d5}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001745
1746 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001747 {
1748 This is no paragraph
1749 unless the '{' is set
1750 in 'cpoptions'
1751 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001752
1753 [DATA]
1754 call assert_equal(expected, getline(1, '$'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001755
Bram Moolenaar1671f442020-03-10 07:48:13 +01001756 " Jumping to a fold should open the fold
1757 %d
1758 call setline(1, ['', 'one', 'two', ''])
1759 set foldenable
1760 2,$fold
1761 call feedkeys('}', 'xt')
1762 call assert_equal(4, line('.'))
1763 call assert_equal(1, foldlevel('.'))
1764 call assert_equal(-1, foldclosed('.'))
1765 set foldenable&
1766
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001767 " clean up
1768 set cpo-={
1769 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001770endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001771
Bram Moolenaar1671f442020-03-10 07:48:13 +01001772" Test for ~ command
1773func Test_normal30_changecase()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001774 new
1775 call append(0, 'This is a simple test: äüöß')
1776 norm! 1ggVu
1777 call assert_equal('this is a simple test: äüöß', getline('.'))
1778 norm! VU
1779 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1780 norm! guu
1781 call assert_equal('this is a simple test: äüöss', getline('.'))
1782 norm! gUgU
1783 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1784 norm! gugu
1785 call assert_equal('this is a simple test: äüöss', getline('.'))
1786 norm! gUU
1787 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1788 norm! 010~
1789 call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.'))
1790 norm! V~
1791 call assert_equal('THIS IS A simple test: äüöss', getline('.'))
1792
Bram Moolenaar1671f442020-03-10 07:48:13 +01001793 " Test for changing case across lines using 'whichwrap'
1794 call setline(1, ['aaaaaa', 'aaaaaa'])
1795 normal! gg10~
1796 call assert_equal(['AAAAAA', 'aaaaaa'], getline(1, 2))
1797 set whichwrap+=~
1798 normal! gg10~
1799 call assert_equal(['aaaaaa', 'AAAAaa'], getline(1, 2))
1800 set whichwrap&
1801
1802 " clean up
1803 bw!
1804endfunc
1805
1806" Turkish ASCII turns to multi-byte. On some systems Turkish locale
1807" is available but toupper()/tolower() don't do the right thing.
1808func Test_normal_changecase_turkish()
1809 new
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001810 try
1811 lang tr_TR.UTF-8
1812 set casemap=
1813 let iupper = toupper('i')
1814 if iupper == "\u0130"
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02001815 call setline(1, 'iI')
1816 1normal gUU
1817 call assert_equal("\u0130I", getline(1))
1818 call assert_equal("\u0130I", toupper("iI"))
Bram Moolenaar3317d5e2017-04-08 19:12:06 +02001819
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02001820 call setline(1, 'iI')
1821 1normal guu
1822 call assert_equal("i\u0131", getline(1))
1823 call assert_equal("i\u0131", tolower("iI"))
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001824 elseif iupper == "I"
Bram Moolenaar1cc48202017-04-09 13:41:59 +02001825 call setline(1, 'iI')
1826 1normal gUU
1827 call assert_equal("II", getline(1))
1828 call assert_equal("II", toupper("iI"))
1829
1830 call setline(1, 'iI')
1831 1normal guu
1832 call assert_equal("ii", getline(1))
1833 call assert_equal("ii", tolower("iI"))
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001834 else
1835 call assert_true(false, "expected toupper('i') to be either 'I' or '\u0130'")
1836 endif
1837 set casemap&
1838 call setline(1, 'iI')
1839 1normal gUU
1840 call assert_equal("II", getline(1))
1841 call assert_equal("II", toupper("iI"))
Bram Moolenaar1cc48202017-04-09 13:41:59 +02001842
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001843 call setline(1, 'iI')
1844 1normal guu
1845 call assert_equal("ii", getline(1))
1846 call assert_equal("ii", tolower("iI"))
1847
1848 lang en_US.UTF-8
1849 catch /E197:/
1850 " can't use Turkish locale
1851 throw 'Skipped: Turkish locale not available'
1852 endtry
Bram Moolenaar1671f442020-03-10 07:48:13 +01001853 close!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001854endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001855
Bram Moolenaar1671f442020-03-10 07:48:13 +01001856" Test for r (replace) command
1857func Test_normal31_r_cmd()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001858 new
1859 call append(0, 'This is a simple test: abcd')
1860 exe "norm! 1gg$r\<cr>"
1861 call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$'))
1862 exe "norm! 1gg2wlr\<cr>"
1863 call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$'))
1864 exe "norm! 2gg0W5r\<cr>"
1865 call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$'))
1866 set autoindent
1867 call setline(2, ['simple test: abc', ''])
1868 exe "norm! 2gg0W5r\<cr>"
1869 call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$'))
1870 exe "norm! 1ggVr\<cr>"
1871 call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1)))
1872 call setline(1, 'This is a')
1873 exe "norm! 1gg05rf"
1874 call assert_equal('fffffis a', getline(1))
1875
Bram Moolenaar1671f442020-03-10 07:48:13 +01001876 " When replacing characters, copy characters from above and below lines
1877 " using CTRL-Y and CTRL-E.
1878 " Different code paths are used for utf-8 and latin1 encodings
1879 set showmatch
1880 for enc in ['latin1', 'utf-8']
1881 enew!
1882 let &encoding = enc
1883 call setline(1, [' {a}', 'xxxxxxxxxx', ' [b]'])
1884 exe "norm! 2gg5r\<C-Y>l5r\<C-E>"
1885 call assert_equal(' {a}x [b]x', getline(2))
1886 endfor
1887 set showmatch&
1888
1889 " r command should fail in operator pending mode
1890 call assert_beeps('normal! cr')
1891
Bram Moolenaar004a6782020-04-11 17:09:31 +02001892 " replace a tab character in visual mode
1893 %d
1894 call setline(1, ["a\tb", "c\td", "e\tf"])
1895 normal gglvjjrx
1896 call assert_equal(['axx', 'xxx', 'xxf'], getline(1, '$'))
1897
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001898 " clean up
1899 set noautoindent
1900 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001901endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001902
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001903" Test for g*, g#
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001904func Test_normal32_g_cmd1()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001905 new
1906 call append(0, ['abc.x_foo', 'x_foobar.abc'])
1907 1
1908 norm! $g*
1909 call assert_equal('x_foo', @/)
1910 call assert_equal('x_foobar.abc', getline('.'))
1911 norm! $g#
1912 call assert_equal('abc', @/)
1913 call assert_equal('abc.x_foo', getline('.'))
1914
1915 " clean up
1916 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001917endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001918
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001919" Test for g`, g;, g,, g&, gv, gk, gj, gJ, g0, g^, g_, gm, g$, gM, g CTRL-G,
1920" gi and gI commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01001921func Test_normal33_g_cmd2()
Bram Moolenaar004a6782020-04-11 17:09:31 +02001922 CheckFeature jumplist
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001923 call Setup_NewWindow()
1924 " Test for g`
1925 clearjumps
1926 norm! ma10j
1927 let a=execute(':jumps')
1928 " empty jumplist
1929 call assert_equal('>', a[-1:])
1930 norm! g`a
1931 call assert_equal('>', a[-1:])
1932 call assert_equal(1, line('.'))
1933 call assert_equal('1', getline('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001934 call cursor(10, 1)
1935 norm! g'a
1936 call assert_equal('>', a[-1:])
1937 call assert_equal(1, line('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001938
1939 " Test for g; and g,
1940 norm! g;
1941 " there is only one change in the changelist
1942 " currently, when we setup the window
1943 call assert_equal(2, line('.'))
1944 call assert_fails(':norm! g;', 'E662')
1945 call assert_fails(':norm! g,', 'E663')
1946 let &ul=&ul
1947 call append('$', ['a', 'b', 'c', 'd'])
1948 let &ul=&ul
1949 call append('$', ['Z', 'Y', 'X', 'W'])
1950 let a = execute(':changes')
1951 call assert_match('2\s\+0\s\+2', a)
1952 call assert_match('101\s\+0\s\+a', a)
1953 call assert_match('105\s\+0\s\+Z', a)
1954 norm! 3g;
1955 call assert_equal(2, line('.'))
1956 norm! 2g,
1957 call assert_equal(105, line('.'))
1958
1959 " Test for g& - global substitute
1960 %d
1961 call setline(1, range(1,10))
1962 call append('$', ['a', 'b', 'c', 'd'])
1963 $s/\w/&&/g
1964 exe "norm! /[1-8]\<cr>"
1965 norm! g&
1966 call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$'))
1967
Bram Moolenaar1671f442020-03-10 07:48:13 +01001968 " Jumping to a fold using gg should open the fold
1969 set foldenable
1970 set foldopen+=jump
1971 5,8fold
1972 call feedkeys('6gg', 'xt')
1973 call assert_equal(1, foldlevel('.'))
1974 call assert_equal(-1, foldclosed('.'))
1975 set foldopen-=jump
1976 set foldenable&
1977
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001978 " Test for gv
1979 %d
1980 call append('$', repeat(['abcdefgh'], 8))
1981 exe "norm! 2gg02l\<c-v>2j2ly"
1982 call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1))
1983 " in visual mode, gv swaps current and last selected region
1984 exe "norm! G0\<c-v>4k4lgvd"
1985 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$'))
1986 exe "norm! G0\<c-v>4k4ly"
1987 exe "norm! gvood"
1988 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001989 " gv cannot be used in operator pending mode
1990 call assert_beeps('normal! cgv')
1991 " gv should beep without a previously selected visual area
1992 new
1993 call assert_beeps('normal! gv')
1994 close
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001995
1996 " Test for gk/gj
1997 %d
1998 15vsp
1999 set wrap listchars= sbr=
2000 let lineA='abcdefghijklmnopqrstuvwxyz'
2001 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
Bram Moolenaar8b530c12019-10-28 02:13:05 +01002002 let lineC='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002003 $put =lineA
2004 $put =lineB
2005
2006 norm! 3gg0dgk
2007 call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$'))
2008 set nu
2009 norm! 3gg0gjdgj
2010 call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
2011
2012 " Test for gJ
2013 norm! 2gggJ
2014 call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
2015 call assert_equal(16, col('.'))
2016 " shouldn't do anything
2017 norm! 10gJ
2018 call assert_equal(1, col('.'))
2019
2020 " Test for g0 g^ gm g$
2021 exe "norm! 2gg0gji "
2022 call assert_equal(['', 'abcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
2023 norm! g0yl
2024 call assert_equal(12, col('.'))
2025 call assert_equal(' ', getreg(0))
2026 norm! g$yl
2027 call assert_equal(22, col('.'))
2028 call assert_equal('3', getreg(0))
2029 norm! gmyl
2030 call assert_equal(17, col('.'))
2031 call assert_equal('n', getreg(0))
2032 norm! g^yl
2033 call assert_equal(15, col('.'))
2034 call assert_equal('l', getreg(0))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002035 call assert_beeps('normal 5g$')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002036
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002037 " Test for g_
2038 call assert_beeps('normal! 100g_')
2039 call setline(2, [' foo ', ' foobar '])
2040 normal! 2ggg_
2041 call assert_equal(5, col('.'))
2042 normal! 2g_
2043 call assert_equal(8, col('.'))
2044
2045 norm! 2ggdG
Bram Moolenaar8b530c12019-10-28 02:13:05 +01002046 $put =lineC
2047
2048 " Test for gM
2049 norm! gMyl
2050 call assert_equal(73, col('.'))
2051 call assert_equal('0', getreg(0))
2052 " Test for 20gM
2053 norm! 20gMyl
2054 call assert_equal(29, col('.'))
2055 call assert_equal('S', getreg(0))
2056 " Test for 60gM
2057 norm! 60gMyl
2058 call assert_equal(87, col('.'))
2059 call assert_equal('E', getreg(0))
2060
2061 " Test for g Ctrl-G
2062 set ff=unix
2063 let a=execute(":norm! g\<c-g>")
2064 call assert_match('Col 87 of 144; Line 2 of 2; Word 1 of 1; Byte 88 of 146', a)
2065
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002066 " Test for gI
2067 norm! gIfoo
Bram Moolenaar8b530c12019-10-28 02:13:05 +01002068 call assert_equal(['', 'foo0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'], getline(1,'$'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002069
2070 " Test for gi
2071 wincmd c
2072 %d
2073 set tw=0
2074 call setline(1, ['foobar', 'new line'])
2075 norm! A next word
2076 $put ='third line'
2077 norm! gi another word
2078 call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002079 call setline(1, 'foobar')
2080 normal! Ggifirst line
2081 call assert_equal('foobarfirst line', getline(1))
2082 " Test gi in 'virtualedit' mode with cursor after the end of the line
2083 set virtualedit=all
2084 call setline(1, 'foo')
2085 exe "normal! Abar\<Right>\<Right>\<Right>\<Right>"
2086 call setline(1, 'foo')
2087 normal! Ggifirst line
2088 call assert_equal('foo first line', getline(1))
2089 set virtualedit&
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002090
Bram Moolenaar1671f442020-03-10 07:48:13 +01002091 " Test for aboring a g command using CTRL-\ CTRL-G
2092 exe "normal! g\<C-\>\<C-G>"
2093 call assert_equal('foo first line', getline('.'))
2094
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002095 " clean up
2096 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002097endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002098
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002099" Test for g CTRL-G
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002100func Test_g_ctrl_g()
Bram Moolenaar05295832018-08-24 22:07:58 +02002101 new
2102
2103 let a = execute(":norm! g\<c-g>")
2104 call assert_equal("\n--No lines in buffer--", a)
2105
Bram Moolenaar1671f442020-03-10 07:48:13 +01002106 " Test for CTRL-G (same as :file)
2107 let a = execute(":norm! \<c-g>")
2108 call assert_equal("\n\n\"[No Name]\" --No lines in buffer--", a)
2109
Bram Moolenaar05295832018-08-24 22:07:58 +02002110 call setline(1, ['first line', 'second line'])
2111
2112 " Test g CTRL-g with dos, mac and unix file type.
2113 norm! gojll
2114 set ff=dos
2115 let a = execute(":norm! g\<c-g>")
2116 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 15 of 25", a)
2117
2118 set ff=mac
2119 let a = execute(":norm! g\<c-g>")
2120 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
2121
2122 set ff=unix
2123 let a = execute(":norm! g\<c-g>")
2124 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
2125
2126 " Test g CTRL-g in visual mode (v)
2127 let a = execute(":norm! gojllvlg\<c-g>")
2128 call assert_equal("\nSelected 1 of 2 Lines; 1 of 4 Words; 2 of 23 Bytes", a)
2129
2130 " Test g CTRL-g in visual mode (CTRL-V) with end col > start col
2131 let a = execute(":norm! \<Esc>gojll\<C-V>kllg\<c-g>")
2132 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
2133
2134 " Test g_CTRL-g in visual mode (CTRL-V) with end col < start col
2135 let a = execute(":norm! \<Esc>goll\<C-V>jhhg\<c-g>")
2136 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
2137
2138 " Test g CTRL-g in visual mode (CTRL-V) with end_vcol being MAXCOL
2139 let a = execute(":norm! \<Esc>gojll\<C-V>k$g\<c-g>")
2140 call assert_equal("\nSelected 2 of 2 Lines; 4 of 4 Words; 17 of 23 Bytes", a)
2141
2142 " There should be one byte less with noeol
2143 set bin noeol
2144 let a = execute(":norm! \<Esc>gog\<c-g>")
2145 call assert_equal("\nCol 1 of 10; Line 1 of 2; Word 1 of 4; Char 1 of 23; Byte 1 of 22", a)
2146 set bin & eol&
2147
Bram Moolenaar30276f22019-01-24 17:59:39 +01002148 call setline(1, ['Français', '日本語'])
Bram Moolenaar05295832018-08-24 22:07:58 +02002149
Bram Moolenaar30276f22019-01-24 17:59:39 +01002150 let a = execute(":norm! \<Esc>gojlg\<c-g>")
2151 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)
Bram Moolenaar05295832018-08-24 22:07:58 +02002152
Bram Moolenaar30276f22019-01-24 17:59:39 +01002153 let a = execute(":norm! \<Esc>gojvlg\<c-g>")
2154 call assert_equal("\nSelected 1 of 2 Lines; 1 of 2 Words; 2 of 13 Chars; 6 of 20 Bytes", a)
Bram Moolenaar05295832018-08-24 22:07:58 +02002155
Bram Moolenaar30276f22019-01-24 17:59:39 +01002156 let a = execute(":norm! \<Esc>goll\<c-v>jlg\<c-g>")
2157 call assert_equal("\nSelected 4 Cols; 2 of 2 Lines; 2 of 2 Words; 6 of 13 Chars; 11 of 20 Bytes", a)
Bram Moolenaar05295832018-08-24 22:07:58 +02002158
Bram Moolenaar30276f22019-01-24 17:59:39 +01002159 set fenc=utf8 bomb
2160 let a = execute(":norm! \<Esc>gojlg\<c-g>")
2161 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)
Bram Moolenaar05295832018-08-24 22:07:58 +02002162
Bram Moolenaar30276f22019-01-24 17:59:39 +01002163 set fenc=utf16 bomb
2164 let a = execute(":norm! g\<c-g>")
2165 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)
Bram Moolenaar05295832018-08-24 22:07:58 +02002166
Bram Moolenaar30276f22019-01-24 17:59:39 +01002167 set fenc=utf32 bomb
2168 let a = execute(":norm! g\<c-g>")
2169 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)
Bram Moolenaar05295832018-08-24 22:07:58 +02002170
Bram Moolenaar30276f22019-01-24 17:59:39 +01002171 set fenc& bomb&
Bram Moolenaar05295832018-08-24 22:07:58 +02002172
2173 set ff&
2174 bwipe!
2175endfunc
2176
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002177" Test for g8
Bram Moolenaar1671f442020-03-10 07:48:13 +01002178func Test_normal34_g_cmd3()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002179 new
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002180 let a=execute(':norm! 1G0g8')
2181 call assert_equal("\nNUL", a)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002182
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002183 call setline(1, 'abcdefghijklmnopqrstuvwxyzäüö')
2184 let a=execute(':norm! 1G$g8')
2185 call assert_equal("\nc3 b6 ", a)
2186
2187 call setline(1, "a\u0302")
2188 let a=execute(':norm! 1G0g8')
2189 call assert_equal("\n61 + cc 82 ", a)
2190
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002191 " clean up
2192 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002193endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002194
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002195" Test 8g8 which finds invalid utf8 at or after the cursor.
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002196func Test_normal_8g8()
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002197 new
2198
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002199 " With invalid byte.
2200 call setline(1, "___\xff___")
2201 norm! 1G08g8g
2202 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2203
2204 " With invalid byte before the cursor.
2205 call setline(1, "___\xff___")
2206 norm! 1G$h8g8g
2207 call assert_equal([0, 1, 6, 0, 9], getcurpos())
2208
2209 " With truncated sequence.
2210 call setline(1, "___\xE2\x82___")
2211 norm! 1G08g8g
2212 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2213
2214 " With overlong sequence.
2215 call setline(1, "___\xF0\x82\x82\xAC___")
2216 norm! 1G08g8g
2217 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2218
2219 " With valid utf8.
2220 call setline(1, "café")
2221 norm! 1G08g8
2222 call assert_equal([0, 1, 1, 0, 1], getcurpos())
2223
2224 bw!
2225endfunc
2226
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002227" Test for g<
Bram Moolenaar1671f442020-03-10 07:48:13 +01002228func Test_normal35_g_cmd4()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002229 " Cannot capture its output,
2230 " probably a bug, therefore, test disabled:
Bram Moolenaar31845092016-09-05 22:58:31 +02002231 throw "Skipped: output of g< can't be tested currently"
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002232 echo "a\nb\nc\nd"
2233 let b=execute(':norm! g<')
2234 call assert_true(!empty(b), 'failed `execute(g<)`')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002235endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002236
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002237" Test for gp gP go
Bram Moolenaar1671f442020-03-10 07:48:13 +01002238func Test_normal36_g_cmd5()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002239 new
2240 call append(0, 'abcdefghijklmnopqrstuvwxyz')
Bram Moolenaar0913a102016-09-03 19:11:59 +02002241 set ff=unix
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002242 " Test for gp gP
2243 call append(1, range(1,10))
2244 1
2245 norm! 1yy
2246 3
2247 norm! gp
2248 call assert_equal([0, 5, 1, 0, 1], getcurpos())
2249 $
2250 norm! gP
2251 call assert_equal([0, 14, 1, 0, 1], getcurpos())
2252
2253 " Test for go
2254 norm! 26go
2255 call assert_equal([0, 1, 26, 0, 26], getcurpos())
2256 norm! 27go
2257 call assert_equal([0, 1, 26, 0, 26], getcurpos())
2258 norm! 28go
2259 call assert_equal([0, 2, 1, 0, 1], getcurpos())
2260 set ff=dos
2261 norm! 29go
2262 call assert_equal([0, 2, 1, 0, 1], getcurpos())
2263 set ff=unix
2264 norm! gg0
2265 norm! 101go
2266 call assert_equal([0, 13, 26, 0, 26], getcurpos())
2267 norm! 103go
2268 call assert_equal([0, 14, 1, 0, 1], getcurpos())
2269 " count > buffer content
2270 norm! 120go
2271 call assert_equal([0, 14, 1, 0, 2147483647], getcurpos())
2272 " clean up
2273 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002274endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002275
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002276" Test for gt and gT
Bram Moolenaar1671f442020-03-10 07:48:13 +01002277func Test_normal37_g_cmd6()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002278 tabnew 1.txt
2279 tabnew 2.txt
2280 tabnew 3.txt
2281 norm! 1gt
2282 call assert_equal(1, tabpagenr())
2283 norm! 3gt
2284 call assert_equal(3, tabpagenr())
2285 norm! 1gT
2286 " count gT goes not to the absolute tabpagenumber
2287 " but, but goes to the count previous tabpagenumber
2288 call assert_equal(2, tabpagenr())
2289 " wrap around
2290 norm! 3gT
2291 call assert_equal(3, tabpagenr())
2292 " gt does not wrap around
2293 norm! 5gt
2294 call assert_equal(3, tabpagenr())
2295
2296 for i in range(3)
2297 tabclose
2298 endfor
2299 " clean up
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +01002300 call assert_fails(':tabclose', 'E784:')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002301endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002302
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002303" Test for <Home> and <C-Home> key
Bram Moolenaar1671f442020-03-10 07:48:13 +01002304func Test_normal38_nvhome()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002305 new
2306 call setline(1, range(10))
2307 $
2308 setl et sw=2
2309 norm! V10>$
2310 " count is ignored
2311 exe "norm! 10\<home>"
2312 call assert_equal(1, col('.'))
2313 exe "norm! \<home>"
2314 call assert_equal([0, 10, 1, 0, 1], getcurpos())
2315 exe "norm! 5\<c-home>"
2316 call assert_equal([0, 5, 1, 0, 1], getcurpos())
2317 exe "norm! \<c-home>"
2318 call assert_equal([0, 1, 1, 0, 1], getcurpos())
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002319 exe "norm! G\<c-kHome>"
2320 call assert_equal([0, 1, 1, 0, 1], getcurpos())
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002321
2322 " clean up
2323 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002324endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002325
Bram Moolenaar1671f442020-03-10 07:48:13 +01002326" Test for <End> and <C-End> keys
2327func Test_normal_nvend()
2328 new
2329 call setline(1, map(range(1, 10), '"line" .. v:val'))
2330 exe "normal! \<End>"
2331 call assert_equal(5, col('.'))
2332 exe "normal! 4\<End>"
2333 call assert_equal([4, 5], [line('.'), col('.')])
2334 exe "normal! \<C-End>"
2335 call assert_equal([10, 6], [line('.'), col('.')])
2336 close!
2337endfunc
2338
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002339" Test for cw cW ce
Bram Moolenaar1671f442020-03-10 07:48:13 +01002340func Test_normal39_cw()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002341 " Test for cw and cW on whitespace
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002342 new
2343 set tw=0
2344 call append(0, 'here are some words')
2345 norm! 1gg0elcwZZZ
2346 call assert_equal('hereZZZare some words', getline('.'))
2347 norm! 1gg0elcWYYY
2348 call assert_equal('hereZZZareYYYsome words', getline('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002349 norm! 2gg0cwfoo
2350 call assert_equal('foo', getline('.'))
2351
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002352 call setline(1, 'one; two')
2353 call cursor(1, 1)
2354 call feedkeys('cwvim', 'xt')
2355 call assert_equal('vim; two', getline(1))
2356 call feedkeys('0cWone', 'xt')
2357 call assert_equal('one two', getline(1))
2358 "When cursor is at the end of a word 'ce' will change until the end of the
2359 "next word, but 'cw' will change only one character
2360 call setline(1, 'one two')
2361 call feedkeys('0ecwce', 'xt')
2362 call assert_equal('once two', getline(1))
2363 call setline(1, 'one two')
2364 call feedkeys('0ecely', 'xt')
2365 call assert_equal('only', getline(1))
2366
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002367 " clean up
2368 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002369endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002370
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002371" Test for CTRL-\ commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01002372func Test_normal40_ctrl_bsl()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002373 new
2374 call append(0, 'here are some words')
2375 exe "norm! 1gg0a\<C-\>\<C-N>"
2376 call assert_equal('n', mode())
2377 call assert_equal(1, col('.'))
2378 call assert_equal('', visualmode())
2379 exe "norm! 1gg0viw\<C-\>\<C-N>"
2380 call assert_equal('n', mode())
2381 call assert_equal(4, col('.'))
2382 exe "norm! 1gg0a\<C-\>\<C-G>"
2383 call assert_equal('n', mode())
2384 call assert_equal(1, col('.'))
2385 "imap <buffer> , <c-\><c-n>
2386 set im
2387 exe ":norm! \<c-\>\<c-n>dw"
2388 set noim
2389 call assert_equal('are some words', getline(1))
2390 call assert_false(&insertmode)
Bram Moolenaar1671f442020-03-10 07:48:13 +01002391 call assert_beeps("normal! \<C-\>\<C-A>", 'xt')
2392
2393 " Using CTRL-\ CTRL-N in cmd window should close the window
2394 call feedkeys("q:\<C-\>\<C-N>", 'xt')
2395 call assert_equal('', getcmdwintype())
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002396
2397 " clean up
2398 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002399endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002400
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002401" Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>= in insert mode
Bram Moolenaar1671f442020-03-10 07:48:13 +01002402func Test_normal41_insert_reg()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002403 new
2404 set sts=2 sw=2 ts=8 tw=0
2405 call append(0, ["aaa\tbbb\tccc", '', '', ''])
2406 let a=getline(1)
2407 norm! 2gg0
2408 exe "norm! a\<c-r>=a\<cr>"
2409 norm! 3gg0
2410 exe "norm! a\<c-r>\<c-r>=a\<cr>"
2411 norm! 4gg0
2412 exe "norm! a\<c-r>\<c-o>=a\<cr>"
2413 call assert_equal(['aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', ''], getline(1, '$'))
2414
2415 " clean up
2416 set sts=0 sw=8 ts=8
Bram Moolenaar31845092016-09-05 22:58:31 +02002417 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002418endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002419
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002420" Test for Ctrl-D and Ctrl-U
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002421func Test_normal42_halfpage()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002422 call Setup_NewWindow()
2423 call assert_equal(5, &scroll)
2424 exe "norm! \<c-d>"
2425 call assert_equal('6', getline('.'))
2426 exe "norm! 2\<c-d>"
2427 call assert_equal('8', getline('.'))
2428 call assert_equal(2, &scroll)
2429 set scroll=5
2430 exe "norm! \<c-u>"
2431 call assert_equal('3', getline('.'))
2432 1
2433 set scrolloff=5
2434 exe "norm! \<c-d>"
2435 call assert_equal('10', getline('.'))
2436 exe "norm! \<c-u>"
2437 call assert_equal('5', getline('.'))
2438 1
2439 set scrolloff=99
2440 exe "norm! \<c-d>"
2441 call assert_equal('10', getline('.'))
2442 set scrolloff=0
2443 100
2444 exe "norm! $\<c-u>"
2445 call assert_equal('95', getline('.'))
2446 call assert_equal([0, 95, 1, 0, 1], getcurpos())
2447 100
2448 set nostartofline
2449 exe "norm! $\<c-u>"
2450 call assert_equal('95', getline('.'))
2451 call assert_equal([0, 95, 2, 0, 2147483647], getcurpos())
2452 " cleanup
2453 set startofline
2454 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002455endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002456
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002457func Test_normal45_drop()
Bram Moolenaar29495952018-02-12 22:49:00 +01002458 if !has('dnd')
Bram Moolenaarb48e96f2018-02-13 12:26:14 +01002459 " The ~ register does not exist
2460 call assert_beeps('norm! "~')
Bram Moolenaar29495952018-02-12 22:49:00 +01002461 return
2462 endif
2463
2464 " basic test for drag-n-drop
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002465 " unfortunately, without a gui, we can't really test much here,
2466 " so simply test that ~p fails (which uses the drop register)
2467 new
2468 call assert_fails(':norm! "~p', 'E353')
2469 call assert_equal([], getreg('~', 1, 1))
2470 " the ~ register is read only
2471 call assert_fails(':let @~="1"', 'E354')
2472 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002473endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002474
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002475func Test_normal46_ignore()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002476 new
2477 " How to test this?
2478 " let's just for now test, that the buffer
2479 " does not change
2480 call feedkeys("\<c-s>", 't')
2481 call assert_equal([''], getline(1,'$'))
2482
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002483 " no valid commands
2484 exe "norm! \<char-0x100>"
2485 call assert_equal([''], getline(1,'$'))
2486
2487 exe "norm! ä"
2488 call assert_equal([''], getline(1,'$'))
2489
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002490 " clean up
2491 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002492endfunc
Bram Moolenaarc4a908e2016-09-08 23:35:30 +02002493
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002494func Test_normal47_visual_buf_wipe()
Bram Moolenaarc4a908e2016-09-08 23:35:30 +02002495 " This was causing a crash or ml_get error.
2496 enew!
2497 call setline(1,'xxx')
2498 normal $
2499 new
2500 call setline(1, range(1,2))
2501 2
2502 exe "norm \<C-V>$"
2503 bw!
2504 norm yp
2505 set nomodified
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002506endfunc
2507
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002508func Test_normal47_autocmd()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002509 " disabled, does not seem to be possible currently
2510 throw "Skipped: not possible to test cursorhold autocmd while waiting for input in normal_cmd"
2511 new
2512 call append(0, repeat('-',20))
2513 au CursorHold * call feedkeys('2l', '')
2514 1
2515 set updatetime=20
2516 " should delete 12 chars (d12l)
2517 call feedkeys('d1', '!')
2518 call assert_equal('--------', getline(1))
2519
2520 " clean up
2521 au! CursorHold
2522 set updatetime=4000
2523 bw!
2524endfunc
2525
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002526func Test_normal48_wincmd()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002527 new
2528 exe "norm! \<c-w>c"
2529 call assert_equal(1, winnr('$'))
2530 call assert_fails(":norm! \<c-w>c", "E444")
2531endfunc
2532
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002533func Test_normal49_counts()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002534 new
2535 call setline(1, 'one two three four five six seven eight nine ten')
2536 1
2537 norm! 3d2w
2538 call assert_equal('seven eight nine ten', getline(1))
2539 bw!
2540endfunc
2541
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002542func Test_normal50_commandline()
Bram Moolenaar004a6782020-04-11 17:09:31 +02002543 CheckFeature timers
2544 CheckFeature cmdline_hist
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002545 func! DoTimerWork(id)
2546 call assert_equal('[Command Line]', bufname(''))
2547 " should fail, with E11, but does fail with E23?
2548 "call feedkeys("\<c-^>", 'tm')
2549
2550 " should also fail with E11
2551 call assert_fails(":wincmd p", 'E11')
2552 " return from commandline window
2553 call feedkeys("\<cr>")
2554 endfunc
2555
2556 let oldlang=v:lang
2557 lang C
2558 set updatetime=20
2559 call timer_start(100, 'DoTimerWork')
2560 try
2561 " throws E23, for whatever reason...
2562 call feedkeys('q:', 'x!')
2563 catch /E23/
2564 " no-op
2565 endtry
2566 " clean up
2567 set updatetime=4000
2568 exe "lang" oldlang
2569 bw!
2570endfunc
2571
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002572func Test_normal51_FileChangedRO()
Bram Moolenaar004a6782020-04-11 17:09:31 +02002573 CheckFeature autocmd
Bram Moolenaare5f2a072017-02-01 22:31:49 +01002574 " Don't sleep after the warning message.
2575 call test_settime(1)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002576 call writefile(['foo'], 'Xreadonly.log')
2577 new Xreadonly.log
2578 setl ro
2579 au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix')
2580 call assert_fails(":norm! Af", 'E788')
2581 call assert_equal(['foo'], getline(1,'$'))
2582 call assert_equal('Xreadonly.log', bufname(''))
2583
2584 " cleanup
Bram Moolenaare5f2a072017-02-01 22:31:49 +01002585 call test_settime(0)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002586 bw!
2587 call delete("Xreadonly.log")
2588endfunc
2589
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002590func Test_normal52_rl()
Bram Moolenaar004a6782020-04-11 17:09:31 +02002591 CheckFeature rightleft
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002592 new
2593 call setline(1, 'abcde fghij klmnopq')
2594 norm! 1gg$
2595 set rl
2596 call assert_equal(19, col('.'))
2597 call feedkeys('l', 'tx')
2598 call assert_equal(18, col('.'))
2599 call feedkeys('h', 'tx')
2600 call assert_equal(19, col('.'))
2601 call feedkeys("\<right>", 'tx')
2602 call assert_equal(18, col('.'))
Bram Moolenaar1671f442020-03-10 07:48:13 +01002603 call feedkeys("\<left>", 'tx')
2604 call assert_equal(19, col('.'))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002605 call feedkeys("\<s-right>", 'tx')
2606 call assert_equal(13, col('.'))
2607 call feedkeys("\<c-right>", 'tx')
2608 call assert_equal(7, col('.'))
2609 call feedkeys("\<c-left>", 'tx')
2610 call assert_equal(13, col('.'))
2611 call feedkeys("\<s-left>", 'tx')
2612 call assert_equal(19, col('.'))
2613 call feedkeys("<<", 'tx')
2614 call assert_equal(' abcde fghij klmnopq',getline(1))
2615 call feedkeys(">>", 'tx')
2616 call assert_equal('abcde fghij klmnopq',getline(1))
2617
2618 " cleanup
2619 set norl
2620 bw!
2621endfunc
2622
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002623func Test_normal54_Ctrl_bsl()
2624 new
2625 call setline(1, 'abcdefghijklmn')
2626 exe "norm! df\<c-\>\<c-n>"
2627 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2628 exe "norm! df\<c-\>\<c-g>"
2629 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2630 exe "norm! df\<c-\>m"
2631 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
Bram Moolenaar30276f22019-01-24 17:59:39 +01002632
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002633 call setline(2, 'abcdefghijklmnāf')
2634 norm! 2gg0
2635 exe "norm! df\<Char-0x101>"
2636 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
2637 norm! 1gg0
2638 exe "norm! df\<esc>"
2639 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002640
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002641 " clean up
2642 bw!
2643endfunc
2644
2645func Test_normal_large_count()
2646 " This may fail with 32bit long, how do we detect that?
2647 new
2648 normal o
2649 normal 6666666666dL
2650 bwipe!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002651endfunc
Bram Moolenaarbf3d5802017-03-29 19:48:11 +02002652
2653func Test_delete_until_paragraph()
Bram Moolenaarbf3d5802017-03-29 19:48:11 +02002654 new
2655 normal grádv}
2656 call assert_equal('á', getline(1))
2657 normal grád}
2658 call assert_equal('', getline(1))
2659 bwipe!
2660endfunc
Bram Moolenaarfb094e12017-11-05 20:59:28 +01002661
2662" Test for the gr (virtual replace) command
2663" Test for the bug fixed by 7.4.387
2664func Test_gr_command()
2665 enew!
2666 let save_cpo = &cpo
2667 call append(0, ['First line', 'Second line', 'Third line'])
2668 exe "normal i\<C-G>u"
2669 call cursor(2, 1)
2670 set cpo-=X
2671 normal 4gro
2672 call assert_equal('oooond line', getline(2))
2673 undo
2674 set cpo+=X
2675 normal 4gro
2676 call assert_equal('ooooecond line', getline(2))
2677 let &cpo = save_cpo
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002678 normal! ggvegrx
2679 call assert_equal('xxxxx line', getline(1))
2680 exe "normal! gggr\<C-V>122"
2681 call assert_equal('zxxxx line', getline(1))
2682 set virtualedit=all
2683 normal! 15|grl
2684 call assert_equal('zxxxx line l', getline(1))
2685 set virtualedit&
2686 set nomodifiable
2687 call assert_fails('normal! grx', 'E21:')
2688 call assert_fails('normal! gRx', 'E21:')
2689 set modifiable&
Bram Moolenaarfb094e12017-11-05 20:59:28 +01002690 enew!
2691endfunc
2692
2693" When splitting a window the changelist position is wrong.
2694" Test the changelist position after splitting a window.
2695" Test for the bug fixed by 7.4.386
2696func Test_changelist()
2697 let save_ul = &ul
2698 enew!
2699 call append('$', ['1', '2'])
2700 exe "normal i\<C-G>u"
2701 exe "normal Gkylpa\<C-G>u"
2702 set ul=100
2703 exe "normal Gylpa\<C-G>u"
2704 set ul=100
2705 normal gg
2706 vsplit
2707 normal g;
2708 call assert_equal([3, 2], [line('.'), col('.')])
2709 normal g;
2710 call assert_equal([2, 2], [line('.'), col('.')])
2711 call assert_fails('normal g;', 'E662:')
Bram Moolenaar1671f442020-03-10 07:48:13 +01002712 new
2713 call assert_fails('normal g;', 'E664:')
Bram Moolenaarfb094e12017-11-05 20:59:28 +01002714 %bwipe!
2715 let &ul = save_ul
2716endfunc
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002717
2718func Test_nv_hat_count()
2719 %bwipeout!
2720 let l:nr = bufnr('%') + 1
2721 call assert_fails(':execute "normal! ' . l:nr . '\<C-^>"', 'E92')
2722
2723 edit Xfoo
2724 let l:foo_nr = bufnr('Xfoo')
2725
2726 edit Xbar
2727 let l:bar_nr = bufnr('Xbar')
2728
2729 " Make sure we are not just using the alternate file.
2730 edit Xbaz
2731
2732 call feedkeys(l:foo_nr . "\<C-^>", 'tx')
2733 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
2734
2735 call feedkeys(l:bar_nr . "\<C-^>", 'tx')
2736 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
2737
2738 %bwipeout!
2739endfunc
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002740
2741func Test_message_when_using_ctrl_c()
Bram Moolenaar553e5a52019-03-25 23:16:34 +01002742 " Make sure no buffers are changed.
2743 %bwipe!
2744
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002745 exe "normal \<C-C>"
2746 call assert_match("Type :qa and press <Enter> to exit Vim", Screenline(&lines))
Bram Moolenaar553e5a52019-03-25 23:16:34 +01002747
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002748 new
2749 cal setline(1, 'hi!')
2750 exe "normal \<C-C>"
2751 call assert_match("Type :qa! and press <Enter> to abandon all changes and exit Vim", Screenline(&lines))
Bram Moolenaar553e5a52019-03-25 23:16:34 +01002752
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002753 bwipe!
2754endfunc
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02002755
2756" Test for '[m', ']m', '[M' and ']M'
2757" Jumping to beginning and end of methods in Java-like languages
2758func Test_java_motion()
2759 new
Bram Moolenaar1671f442020-03-10 07:48:13 +01002760 call assert_beeps('normal! [m')
2761 call assert_beeps('normal! ]m')
2762 call assert_beeps('normal! [M')
2763 call assert_beeps('normal! ]M')
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02002764 a
2765Piece of Java
2766{
2767 tt m1 {
2768 t1;
2769 } e1
2770
2771 tt m2 {
2772 t2;
2773 } e2
2774
2775 tt m3 {
2776 if (x)
2777 {
2778 t3;
2779 }
2780 } e3
2781}
2782.
2783
2784 normal gg
2785
2786 normal 2]maA
2787 call assert_equal("\ttt m1 {A", getline('.'))
2788 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
2789
2790 normal j]maB
2791 call assert_equal("\ttt m2 {B", getline('.'))
2792 call assert_equal([7, 9, 16], [line('.'), col('.'), virtcol('.')])
2793
2794 normal ]maC
2795 call assert_equal("\ttt m3 {C", getline('.'))
2796 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
2797
2798 normal [maD
2799 call assert_equal("\ttt m3 {DC", getline('.'))
2800 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
2801
2802 normal k2[maE
2803 call assert_equal("\ttt m1 {EA", getline('.'))
2804 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
2805
2806 normal 3[maF
2807 call assert_equal("{F", getline('.'))
2808 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
2809
2810 normal ]MaG
2811 call assert_equal("\t}G e1", getline('.'))
2812 call assert_equal([5, 3, 10], [line('.'), col('.'), virtcol('.')])
2813
2814 normal j2]MaH
2815 call assert_equal("\t}H e3", getline('.'))
2816 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
2817
2818 normal ]M]M
2819 normal aI
2820 call assert_equal("}I", getline('.'))
2821 call assert_equal([17, 2, 2], [line('.'), col('.'), virtcol('.')])
2822
2823 normal 2[MaJ
2824 call assert_equal("\t}JH e3", getline('.'))
2825 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
2826
2827 normal k[MaK
2828 call assert_equal("\t}K e2", getline('.'))
2829 call assert_equal([9, 3, 10], [line('.'), col('.'), virtcol('.')])
2830
2831 normal 3[MaL
2832 call assert_equal("{LF", getline('.'))
2833 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
2834
2835 close!
2836endfunc
Bram Moolenaard5c82342019-07-27 18:44:57 +02002837
Bram Moolenaar004a6782020-04-11 17:09:31 +02002838" Tests for g cmds
Bram Moolenaar1671f442020-03-10 07:48:13 +01002839func Test_normal_gdollar_cmd()
Bram Moolenaar004a6782020-04-11 17:09:31 +02002840 CheckFeature jumplist
Bram Moolenaard5c82342019-07-27 18:44:57 +02002841 call Setup_NewWindow()
2842 " Make long lines that will wrap
2843 %s/$/\=repeat(' foobar', 10)/
2844 20vsp
2845 set wrap
2846 " Test for g$ with count
2847 norm! gg
2848 norm! 0vg$y
2849 call assert_equal(20, col("'>"))
2850 call assert_equal('1 foobar foobar foob', getreg(0))
2851 norm! gg
2852 norm! 0v4g$y
2853 call assert_equal(72, col("'>"))
2854 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.."\n", getreg(0))
2855 norm! gg
2856 norm! 0v6g$y
2857 call assert_equal(40, col("'>"))
2858 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2859 \ '2 foobar foobar foobar foobar foobar foo', getreg(0))
2860 set nowrap
2861 " clean up
2862 norm! gg
2863 norm! 0vg$y
2864 call assert_equal(20, col("'>"))
2865 call assert_equal('1 foobar foobar foob', getreg(0))
2866 norm! gg
2867 norm! 0v4g$y
2868 call assert_equal(20, col("'>"))
2869 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2870 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2871 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2872 \ '4 foobar foobar foob', getreg(0))
2873 norm! gg
2874 norm! 0v6g$y
2875 call assert_equal(20, col("'>"))
2876 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2877 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2878 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2879 \ '4 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2880 \ '5 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2881 \ '6 foobar foobar foob', getreg(0))
2882 " Move to last line, also down movement is not possible, should still move
2883 " the cursor to the last visible char
2884 norm! G
2885 norm! 0v6g$y
2886 call assert_equal(20, col("'>"))
2887 call assert_equal('100 foobar foobar fo', getreg(0))
2888 bw!
2889endfunc
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02002890
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002891func Test_normal_gk_gj()
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02002892 " needs 80 column new window
2893 new
2894 vert 80new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002895 call assert_beeps('normal gk')
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02002896 put =[repeat('x',90)..' {{{1', 'x {{{1']
2897 norm! gk
2898 " In a 80 column wide terminal the window will be only 78 char
2899 " (because Vim will leave space for the other window),
2900 " but if the terminal is larger, it will be 80 chars, so verify the
2901 " cursor column correctly.
2902 call assert_equal(winwidth(0)+1, col('.'))
2903 call assert_equal(winwidth(0)+1, virtcol('.'))
2904 norm! j
2905 call assert_equal(6, col('.'))
2906 call assert_equal(6, virtcol('.'))
2907 norm! gk
2908 call assert_equal(95, col('.'))
2909 call assert_equal(95, virtcol('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002910 %bw!
Bram Moolenaarceba3dd2019-10-12 16:12:54 +02002911
2912 " needs 80 column new window
2913 new
2914 vert 80new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002915 call assert_beeps('normal gj')
Bram Moolenaarceba3dd2019-10-12 16:12:54 +02002916 set number
2917 set numberwidth=10
2918 set cpoptions+=n
2919 put =[repeat('0',90), repeat('1',90)]
2920 norm! 075l
2921 call assert_equal(76, col('.'))
2922 norm! gk
2923 call assert_equal(1, col('.'))
2924 norm! gk
2925 call assert_equal(76, col('.'))
2926 norm! gk
2927 call assert_equal(1, col('.'))
2928 norm! gj
2929 call assert_equal(76, col('.'))
2930 norm! gj
2931 call assert_equal(1, col('.'))
2932 norm! gj
2933 call assert_equal(76, col('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002934 " When 'nowrap' is set, gk and gj behave like k and j
2935 set nowrap
2936 normal! gk
2937 call assert_equal([2, 76], [line('.'), col('.')])
2938 normal! gj
2939 call assert_equal([3, 76], [line('.'), col('.')])
2940 %bw!
2941 set cpoptions& number& numberwidth& wrap&
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02002942endfunc
Bram Moolenaarf0cee192020-02-16 13:33:56 +01002943
Bram Moolenaar818fc9a2020-02-21 17:54:45 +01002944" Test for using : to run a multi-line Ex command in operator pending mode
2945func Test_normal_yank_with_excmd()
2946 new
2947 call setline(1, ['foo', 'bar', 'baz'])
2948 let @a = ''
2949 call feedkeys("\"ay:if v:true\<CR>normal l\<CR>endif\<CR>", 'xt')
2950 call assert_equal('f', @a)
2951 close!
2952endfunc
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002953
2954" Test for supplying a count to a normal-mode command across a cursorhold call
2955func Test_normal_cursorhold_with_count()
2956 func s:cHold()
2957 let g:cHold_Called += 1
2958 endfunc
2959 new
2960 augroup normalcHoldTest
2961 au!
2962 au CursorHold <buffer> call s:cHold()
2963 augroup END
2964 let g:cHold_Called = 0
2965 call feedkeys("3\<CursorHold>2ix", 'xt')
2966 call assert_equal(1, g:cHold_Called)
2967 call assert_equal(repeat('x', 32), getline(1))
2968 augroup normalcHoldTest
2969 au!
2970 augroup END
2971 au! normalcHoldTest
2972 close!
2973 delfunc s:cHold
2974endfunc
2975
2976" Test for using a count and a command with CTRL-W
2977func Test_wincmd_with_count()
2978 call feedkeys("\<C-W>12n", 'xt')
2979 call assert_equal(12, winheight(0))
2980endfunc
2981
2982" Test for 'b', 'B' 'ge' and 'gE' commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01002983func Test_horiz_motion()
2984 new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002985 normal! gg
2986 call assert_beeps('normal! b')
2987 call assert_beeps('normal! B')
2988 call assert_beeps('normal! gE')
2989 call assert_beeps('normal! ge')
Bram Moolenaar1671f442020-03-10 07:48:13 +01002990 " <S-Backspace> moves one word left and <C-Backspace> moves one WORD left
2991 call setline(1, 'one ,two ,three')
2992 exe "normal! $\<S-BS>"
2993 call assert_equal(11, col('.'))
2994 exe "normal! $\<C-BS>"
2995 call assert_equal(10, col('.'))
2996 close!
2997endfunc
2998
2999" Test for using a : command in operator pending mode
3000func Test_normal_colon_op()
3001 new
3002 call setline(1, ['one', 'two'])
3003 call assert_beeps("normal! Gc:d\<CR>")
3004 close!
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003005endfunc
3006
Bram Moolenaar004a6782020-04-11 17:09:31 +02003007" Test for d and D commands
3008func Test_normal_delete_cmd()
3009 new
3010 " D in an empty line
3011 call setline(1, '')
3012 normal D
3013 call assert_equal('', getline(1))
3014 " D in an empty line in virtualedit mode
3015 set virtualedit=all
3016 normal D
3017 call assert_equal('', getline(1))
3018 set virtualedit&
3019 " delete to a readonly register
3020 call setline(1, ['abcd'])
3021 call assert_beeps('normal ":d2l')
3022 close!
3023endfunc
3024
Bram Moolenaar224a5f12020-04-28 20:29:07 +02003025" Test for 'w' and 'b' commands
3026func Test_normal_word_move()
3027 new
3028 call setline(1, ['foo bar a', '', 'foo bar b'])
3029 " copy a single character word at the end of a line
3030 normal 1G$yw
3031 call assert_equal('a', @")
3032 " copy a single character word at the end of a file
3033 normal G$yw
3034 call assert_equal('b', @")
3035 " check for a word movement handling an empty line properly
3036 normal 1G$vwy
3037 call assert_equal("a\n\n", @")
3038
3039 " copy using 'b' command
3040 %d
3041 " non-empty blank line at the start of file
3042 call setline(1, [' ', 'foo bar'])
3043 normal 2Gyb
3044 call assert_equal(" \n", @")
3045 " try to copy backwards from the start of the file
3046 call setline(1, ['one two', 'foo bar'])
3047 call assert_beeps('normal ggyb')
3048 " 'b' command should stop at an empty line
3049 call setline(1, ['one two', '', 'foo bar'])
3050 normal 3Gyb
3051 call assert_equal("\n", @")
3052 normal 3Gy2b
3053 call assert_equal("two\n", @")
3054 " 'b' command should not stop at a non-empty blank line
3055 call setline(1, ['one two', ' ', 'foo bar'])
3056 normal 3Gyb
3057 call assert_equal("two\n ", @")
3058
3059 close!
3060endfunc
3061
Bram Moolenaarbdd2c292020-06-22 21:34:30 +02003062" Test for 'scrolloff' with a long line that doesn't fit in the screen
3063func Test_normal_scroloff()
3064 10new
3065 80vnew
3066 call setline(1, repeat('a', 1000))
3067 set scrolloff=10
3068 normal gg10gj
3069 call assert_equal(8, winline())
3070 normal 10gj
3071 call assert_equal(10, winline())
3072 normal 10gk
3073 call assert_equal(3, winline())
3074 set scrolloff&
3075 close!
3076endfunc
3077
3078" Test for vertical scrolling with CTRL-F and CTRL-B with a long line
3079func Test_normal_vert_scroll_longline()
3080 10new
3081 80vnew
3082 call setline(1, range(1, 10))
3083 call append(5, repeat('a', 1000))
3084 exe "normal gg\<C-F>"
3085 call assert_equal(6, line('.'))
3086 exe "normal \<C-F>\<C-F>"
3087 call assert_equal(11, line('.'))
3088 call assert_equal(1, winline())
3089 exe "normal \<C-B>"
3090 call assert_equal(10, line('.'))
3091 call assert_equal(3, winline())
3092 exe "normal \<C-B>\<C-B>"
3093 call assert_equal(5, line('.'))
3094 call assert_equal(5, winline())
3095 close!
3096endfunc
3097
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003098" vim: shiftwidth=2 sts=2 expandtab