blob: b64b4e4074bb1c6f99de42dd83e7ed2e1c7ed599 [file] [log] [blame]
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001" Test for various Normal mode commands
2
Bram Moolenaarc3c766e2017-03-08 22:55:19 +01003set belloff=all
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02004func! Setup_NewWindow()
5 10new
6 call setline(1, range(1,100))
7endfunc
8
9func! MyFormatExpr()
10 " Adds '->$' at lines having numbers followed by trailing whitespace
11 for ln in range(v:lnum, v:lnum+v:count-1)
12 let line = getline(ln)
13 if getline(ln) =~# '\d\s\+$'
14 call setline(ln, substitute(line, '\s\+$', '', '') . '->$')
15 endif
16 endfor
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020017endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020018
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020019func! CountSpaces(type, ...)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020020 " for testing operatorfunc
21 " will count the number of spaces
22 " and return the result in g:a
23 let sel_save = &selection
24 let &selection = "inclusive"
25 let reg_save = @@
26
27 if a:0 " Invoked from Visual mode, use gv command.
28 silent exe "normal! gvy"
29 elseif a:type == 'line'
30 silent exe "normal! '[V']y"
31 else
32 silent exe "normal! `[v`]y"
33 endif
34 let g:a=strlen(substitute(@@, '[^ ]', '', 'g'))
35 let &selection = sel_save
36 let @@ = reg_save
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020037endfunc
38
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +010039func! OpfuncDummy(type, ...)
40 " for testing operatorfunc
41 let g:opt=&linebreak
42
43 if a:0 " Invoked from Visual mode, use gv command.
44 silent exe "normal! gvy"
45 elseif a:type == 'line'
46 silent exe "normal! '[V']y"
47 else
48 silent exe "normal! `[v`]y"
49 endif
50 " Create a new dummy window
51 new
52 let g:bufnr=bufnr('%')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020053endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020054
55fun! Test_normal00_optrans()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020056 new
57 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
58 1
59 exe "norm! Sfoobar\<esc>"
60 call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$'))
61 2
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020062 exe "norm! $vbsone"
63 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 +020064 norm! VS Second line here
65 call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$'))
66 %d
67 call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line'])
68 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
69
70 1
71 norm! 2D
72 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,'$'))
73 set cpo+=#
74 norm! 4D
75 call assert_equal(['', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
76
77 " clean up
78 set cpo-=#
79 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020080endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020081
82func! Test_normal01_keymodel()
83 call Setup_NewWindow()
84 " Test 1: depending on 'keymodel' <s-down> does something different
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020085 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020086 call feedkeys("V\<S-Up>y", 'tx')
87 call assert_equal(['47', '48', '49', '50'], getline("'<", "'>"))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020088 set keymodel=startsel
89 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020090 call feedkeys("V\<S-Up>y", 'tx')
91 call assert_equal(['49', '50'], getline("'<", "'>"))
92 " Start visual mode when keymodel = startsel
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020093 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020094 call feedkeys("\<S-Up>y", 'tx')
95 call assert_equal(['49', '5'], getreg(0, 0, 1))
96 " Do not start visual mode when keymodel=
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020097 set keymodel=
98 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020099 call feedkeys("\<S-Up>y$", 'tx')
100 call assert_equal(['42'], getreg(0, 0, 1))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200101 " Stop visual mode when keymodel=stopsel
102 set keymodel=stopsel
103 50
104 call feedkeys("Vkk\<Up>yy", 'tx')
105 call assert_equal(['47'], getreg(0, 0, 1))
106
107 set keymodel=
108 50
109 call feedkeys("Vkk\<Up>yy", 'tx')
110 call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200111
112 " clean up
113 bw!
114endfunc
115
116func! Test_normal02_selectmode()
117 " some basic select mode tests
118 call Setup_NewWindow()
119 50
120 norm! gHy
121 call assert_equal('y51', getline('.'))
122 call setline(1, range(1,100))
123 50
124 exe ":norm! V9jo\<c-g>y"
125 call assert_equal('y60', getline('.'))
126 " clean up
127 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200128endfunc
129
130func! Test_normal02_selectmode2()
131 " some basic select mode tests
132 call Setup_NewWindow()
133 50
134 call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx')
135 call assert_equal('c51', getline('.'))
136 " clean up
137 bw!
138endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200139
140func! Test_normal03_join()
141 " basic join test
142 call Setup_NewWindow()
143 50
144 norm! VJ
145 call assert_equal('50 51', getline('.'))
146 $
147 norm! J
148 call assert_equal('100', getline('.'))
149 $
150 norm! V9-gJ
151 call assert_equal('919293949596979899100', getline('.'))
152 call setline(1, range(1,100))
153 $
154 :j 10
155 call assert_equal('100', getline('.'))
156 " clean up
157 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200158endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200159
160func! Test_normal04_filter()
161 " basic filter test
162 " only test on non windows platform
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100163 if has('win32')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200164 return
165 endif
166 call Setup_NewWindow()
167 1
168 call feedkeys("!!sed -e 's/^/| /'\n", 'tx')
169 call assert_equal('| 1', getline('.'))
170 90
171 :sil :!echo one
172 call feedkeys('.', 'tx')
173 call assert_equal('| 90', getline('.'))
174 95
175 set cpo+=!
176 " 2 <CR>, 1: for executing the command,
177 " 2: clear hit-enter-prompt
178 call feedkeys("!!\n", 'tx')
179 call feedkeys(":!echo one\n\n", 'tx')
180 call feedkeys(".", 'tx')
181 call assert_equal('one', getline('.'))
182 set cpo-=!
183 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200184endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200185
186func! Test_normal05_formatexpr()
187 " basic formatexpr test
188 call Setup_NewWindow()
189 %d_
190 call setline(1, ['here: 1 ', '2', 'here: 3 ', '4', 'not here: '])
191 1
192 set formatexpr=MyFormatExpr()
193 norm! gqG
194 call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here: '], getline(1,'$'))
195 set formatexpr=
196 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200197endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200198
Bram Moolenaard77f9d52016-09-04 15:13:39 +0200199func Test_normal05_formatexpr_newbuf()
200 " Edit another buffer in the 'formatexpr' function
201 new
202 func! Format()
203 edit another
204 endfunc
205 set formatexpr=Format()
206 norm gqG
207 bw!
208 set formatexpr=
209endfunc
210
211func Test_normal05_formatexpr_setopt()
212 " Change the 'formatexpr' value in the function
213 new
214 func! Format()
215 set formatexpr=
216 endfunc
217 set formatexpr=Format()
218 norm gqG
219 bw!
220 set formatexpr=
221endfunc
222
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200223func! Test_normal06_formatprg()
224 " basic test for formatprg
225 " only test on non windows platform
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100226 if has('win32')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200227 return
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200228 endif
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100229
230 " uses sed to number non-empty lines
231 call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/ /', '}'''], 'Xsed_format.sh')
232 call system('chmod +x ./Xsed_format.sh')
233 let text = ['a', '', 'c', '', ' ', 'd', 'e']
234 let expected = ['1 a', '', '3 c', '', '5 ', '6 d', '7 e']
235
236 10new
237 call setline(1, text)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200238 set formatprg=./Xsed_format.sh
239 norm! gggqG
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100240 call assert_equal(expected, getline(1, '$'))
241 bw!
242
243 10new
244 call setline(1, text)
245 set formatprg=donothing
246 setlocal formatprg=./Xsed_format.sh
247 norm! gggqG
248 call assert_equal(expected, getline(1, '$'))
249 bw!
250
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200251 " clean up
252 set formatprg=
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100253 setlocal formatprg=
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200254 call delete('Xsed_format.sh')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200255endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200256
257func! Test_normal07_internalfmt()
258 " basic test for internal formmatter to textwidth of 12
259 let list=range(1,11)
260 call map(list, 'v:val." "')
261 10new
262 call setline(1, list)
263 set tw=12
264 norm! gggqG
265 call assert_equal(['1 2 3', '4 5 6', '7 8 9', '10 11 '], getline(1, '$'))
266 " clean up
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100267 set tw=0
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200268 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200269endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200270
271func! Test_normal08_fold()
272 " basic tests for foldopen/folddelete
273 if !has("folding")
274 return
275 endif
276 call Setup_NewWindow()
277 50
278 setl foldenable fdm=marker
279 " First fold
280 norm! V4jzf
281 " check that folds have been created
282 call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54))
283 " Second fold
284 46
285 norm! V10jzf
286 " check that folds have been created
287 call assert_equal('46/*{{{*/', getline(46))
288 call assert_equal('60/*}}}*/', getline(60))
289 norm! k
290 call assert_equal('45', getline('.'))
291 norm! j
292 call assert_equal('46/*{{{*/', getline('.'))
293 norm! j
294 call assert_equal('61', getline('.'))
295 norm! k
296 " open a fold
297 norm! Vzo
298 norm! k
299 call assert_equal('45', getline('.'))
300 norm! j
301 call assert_equal('46/*{{{*/', getline('.'))
302 norm! j
303 call assert_equal('47', getline('.'))
304 norm! k
305 norm! zcVzO
306 call assert_equal('46/*{{{*/', getline('.'))
307 norm! j
308 call assert_equal('47', getline('.'))
309 norm! j
310 call assert_equal('48', getline('.'))
311 norm! j
312 call assert_equal('49', getline('.'))
313 norm! j
314 call assert_equal('50/*{{{*/', getline('.'))
315 norm! j
316 call assert_equal('51', getline('.'))
317 " delete folds
318 :46
319 " collapse fold
320 norm! V14jzC
321 " delete all folds recursively
322 norm! VzD
323 call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60))
324
325 " clean up
326 setl nofoldenable fdm=marker
327 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200328endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200329
330func! Test_normal09_operatorfunc()
331 " Test operatorfunc
332 call Setup_NewWindow()
333 " Add some spaces for counting
334 50,60s/$/ /
335 unlet! g:a
336 let g:a=0
337 nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@
338 vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
339 50
340 norm V2j,,
341 call assert_equal(6, g:a)
342 norm V,,
343 call assert_equal(2, g:a)
344 norm ,,l
345 call assert_equal(0, g:a)
346 50
347 exe "norm 0\<c-v>10j2l,,"
348 call assert_equal(11, g:a)
349 50
350 norm V10j,,
351 call assert_equal(22, g:a)
352
353 " clean up
354 unmap <buffer> ,,
355 set opfunc=
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100356 unlet! g:a
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200357 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200358endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200359
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100360func! Test_normal09a_operatorfunc()
361 " Test operatorfunc
362 call Setup_NewWindow()
363 " Add some spaces for counting
364 50,60s/$/ /
365 unlet! g:opt
366 set linebreak
367 nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@
368 50
369 norm ,,j
370 exe "bd!" g:bufnr
371 call assert_true(&linebreak)
372 call assert_equal(g:opt, &linebreak)
373 set nolinebreak
374 norm ,,j
375 exe "bd!" g:bufnr
376 call assert_false(&linebreak)
377 call assert_equal(g:opt, &linebreak)
378
379 " clean up
380 unmap <buffer> ,,
381 set opfunc=
382 bw!
383 unlet! g:opt
384endfunc
385
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200386func! Test_normal10_expand()
387 " Test for expand()
388 10new
389 call setline(1, ['1', 'ifooar,,cbar'])
390 2
391 norm! $
Bram Moolenaar65f08472017-09-10 18:16:20 +0200392 call assert_equal('cbar', expand('<cword>'))
393 call assert_equal('ifooar,,cbar', expand('<cWORD>'))
394
395 call setline(1, ['prx = list[idx];'])
396 1
397 let expected = ['', 'prx', 'prx', 'prx',
398 \ 'list', 'list', 'list', 'list', 'list', 'list', 'list',
399 \ 'idx', 'idx', 'idx', 'idx',
400 \ 'list[idx]',
401 \ '];',
402 \ ]
403 for i in range(1, 16)
404 exe 'norm ' . i . '|'
405 call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i)
406 endfor
407
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200408 " clean up
409 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200410endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200411
412func! Test_normal11_showcmd()
413 " test for 'showcmd'
414 10new
415 exe "norm! ofoobar\<esc>"
416 call assert_equal(2, line('$'))
417 set showcmd
418 exe "norm! ofoobar2\<esc>"
419 call assert_equal(3, line('$'))
420 exe "norm! VAfoobar3\<esc>"
421 call assert_equal(3, line('$'))
422 exe "norm! 0d3\<del>2l"
423 call assert_equal('obar2foobar3', getline('.'))
424 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200425endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200426
427func! Test_normal12_nv_error()
428 " Test for nv_error
429 10new
430 call setline(1, range(1,5))
431 " should not do anything, just beep
432 exe "norm! <c-k>"
433 call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$'))
434 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200435endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200436
437func! Test_normal13_help()
438 " Test for F1
439 call assert_equal(1, winnr())
440 call feedkeys("\<f1>", 'txi')
441 call assert_match('help\.txt', bufname('%'))
442 call assert_equal(2, winnr('$'))
443 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200444endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200445
446func! Test_normal14_page()
447 " basic test for Ctrl-F and Ctrl-B
448 call Setup_NewWindow()
449 exe "norm! \<c-f>"
450 call assert_equal('9', getline('.'))
451 exe "norm! 2\<c-f>"
452 call assert_equal('25', getline('.'))
453 exe "norm! 2\<c-b>"
454 call assert_equal('18', getline('.'))
455 1
456 set scrolloff=5
457 exe "norm! 2\<c-f>"
458 call assert_equal('21', getline('.'))
459 exe "norm! \<c-b>"
460 call assert_equal('13', getline('.'))
461 1
462 set scrolloff=99
463 exe "norm! \<c-f>"
464 call assert_equal('13', getline('.'))
465 set scrolloff=0
466 100
467 exe "norm! $\<c-b>"
468 call assert_equal('92', getline('.'))
469 call assert_equal([0, 92, 1, 0, 1], getcurpos())
470 100
471 set nostartofline
472 exe "norm! $\<c-b>"
473 call assert_equal('92', getline('.'))
474 call assert_equal([0, 92, 2, 0, 2147483647], getcurpos())
475 " cleanup
476 set startofline
477 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200478endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200479
Bram Moolenaarbc54f3f2016-09-04 14:34:28 +0200480func! Test_normal14_page_eol()
481 10new
482 norm oxxxxxxx
483 exe "norm 2\<c-f>"
484 " check with valgrind that cursor is put back in column 1
485 exe "norm 2\<c-b>"
486 bw!
487endfunc
488
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200489func! Test_normal15_z_scroll_vert()
490 " basic test for z commands that scroll the window
491 call Setup_NewWindow()
492 100
493 norm! >>
494 " Test for z<cr>
495 exe "norm! z\<cr>"
496 call assert_equal(' 100', getline('.'))
497 call assert_equal(100, winsaveview()['topline'])
498 call assert_equal([0, 100, 2, 0, 9], getcurpos())
499
500 " Test for zt
501 21
502 norm! >>0zt
503 call assert_equal(' 21', getline('.'))
504 call assert_equal(21, winsaveview()['topline'])
505 call assert_equal([0, 21, 1, 0, 8], getcurpos())
506
507 " Test for zb
508 30
509 norm! >>$ztzb
510 call assert_equal(' 30', getline('.'))
511 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
512 call assert_equal([0, 30, 3, 0, 2147483647], getcurpos())
513
514 " Test for z-
515 1
516 30
517 norm! 0z-
518 call assert_equal(' 30', getline('.'))
519 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
520 call assert_equal([0, 30, 2, 0, 9], getcurpos())
521
522 " Test for z{height}<cr>
523 call assert_equal(10, winheight(0))
524 exe "norm! z12\<cr>"
525 call assert_equal(12, winheight(0))
526 exe "norm! z10\<cr>"
527 call assert_equal(10, winheight(0))
528
529 " Test for z.
530 1
531 21
532 norm! 0z.
533 call assert_equal(' 21', getline('.'))
534 call assert_equal(17, winsaveview()['topline'])
535 call assert_equal([0, 21, 2, 0, 9], getcurpos())
536
537 " Test for zz
538 1
539 21
540 norm! 0zz
541 call assert_equal(' 21', getline('.'))
542 call assert_equal(17, winsaveview()['topline'])
543 call assert_equal([0, 21, 1, 0, 8], getcurpos())
544
545 " Test for z+
546 11
547 norm! zt
548 norm! z+
549 call assert_equal(' 21', getline('.'))
550 call assert_equal(21, winsaveview()['topline'])
551 call assert_equal([0, 21, 2, 0, 9], getcurpos())
552
553 " Test for [count]z+
554 1
555 norm! 21z+
556 call assert_equal(' 21', getline('.'))
557 call assert_equal(21, winsaveview()['topline'])
558 call assert_equal([0, 21, 2, 0, 9], getcurpos())
559
560 " Test for z^
561 norm! 22z+0
562 norm! z^
563 call assert_equal(' 21', getline('.'))
564 call assert_equal(12, winsaveview()['topline'])
565 call assert_equal([0, 21, 2, 0, 9], getcurpos())
566
567 " Test for [count]z^
568 1
569 norm! 30z^
570 call assert_equal(' 21', getline('.'))
571 call assert_equal(12, winsaveview()['topline'])
572 call assert_equal([0, 21, 2, 0, 9], getcurpos())
573
574 " cleanup
575 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200576endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200577
578func! Test_normal16_z_scroll_hor()
579 " basic test for z commands that scroll the window
580 10new
581 15vsp
582 set nowrap listchars=
583 let lineA='abcdefghijklmnopqrstuvwxyz'
584 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
585 $put =lineA
586 $put =lineB
587 1d
588
589 " Test for zl
590 1
591 norm! 5zl
592 call assert_equal(lineA, getline('.'))
593 call assert_equal(6, col('.'))
594 call assert_equal(5, winsaveview()['leftcol'])
595 norm! yl
596 call assert_equal('f', @0)
597
598 " Test for zh
599 norm! 2zh
600 call assert_equal(lineA, getline('.'))
601 call assert_equal(6, col('.'))
602 norm! yl
603 call assert_equal('f', @0)
604 call assert_equal(3, winsaveview()['leftcol'])
605
606 " Test for zL
607 norm! zL
608 call assert_equal(11, col('.'))
609 norm! yl
610 call assert_equal('k', @0)
611 call assert_equal(10, winsaveview()['leftcol'])
612 norm! 2zL
613 call assert_equal(25, col('.'))
614 norm! yl
615 call assert_equal('y', @0)
616 call assert_equal(24, winsaveview()['leftcol'])
617
618 " Test for zH
619 norm! 2zH
620 call assert_equal(25, col('.'))
621 call assert_equal(10, winsaveview()['leftcol'])
622 norm! yl
623 call assert_equal('y', @0)
624
625 " Test for zs
626 norm! $zs
627 call assert_equal(26, col('.'))
628 call assert_equal(25, winsaveview()['leftcol'])
629 norm! yl
630 call assert_equal('z', @0)
631
632 " Test for ze
633 norm! ze
634 call assert_equal(26, col('.'))
635 call assert_equal(11, winsaveview()['leftcol'])
636 norm! yl
637 call assert_equal('z', @0)
638
639 " cleanup
640 set wrap listchars=eol:$
641 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200642endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200643
644func! Test_normal17_z_scroll_hor2()
645 " basic test for z commands that scroll the window
646 " using 'sidescrolloff' setting
647 10new
648 20vsp
649 set nowrap listchars= sidescrolloff=5
650 let lineA='abcdefghijklmnopqrstuvwxyz'
651 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
652 $put =lineA
653 $put =lineB
654 1d
655
656 " Test for zl
657 1
658 norm! 5zl
659 call assert_equal(lineA, getline('.'))
660 call assert_equal(11, col('.'))
661 call assert_equal(5, winsaveview()['leftcol'])
662 norm! yl
663 call assert_equal('k', @0)
664
665 " Test for zh
666 norm! 2zh
667 call assert_equal(lineA, getline('.'))
668 call assert_equal(11, col('.'))
669 norm! yl
670 call assert_equal('k', @0)
671 call assert_equal(3, winsaveview()['leftcol'])
672
673 " Test for zL
674 norm! 0zL
675 call assert_equal(16, col('.'))
676 norm! yl
677 call assert_equal('p', @0)
678 call assert_equal(10, winsaveview()['leftcol'])
679 norm! 2zL
680 call assert_equal(26, col('.'))
681 norm! yl
682 call assert_equal('z', @0)
683 call assert_equal(15, winsaveview()['leftcol'])
684
685 " Test for zH
686 norm! 2zH
687 call assert_equal(15, col('.'))
688 call assert_equal(0, winsaveview()['leftcol'])
689 norm! yl
690 call assert_equal('o', @0)
691
692 " Test for zs
693 norm! $zs
694 call assert_equal(26, col('.'))
695 call assert_equal(20, winsaveview()['leftcol'])
696 norm! yl
697 call assert_equal('z', @0)
698
699 " Test for ze
700 norm! ze
701 call assert_equal(26, col('.'))
702 call assert_equal(11, winsaveview()['leftcol'])
703 norm! yl
704 call assert_equal('z', @0)
705
706 " cleanup
707 set wrap listchars=eol:$ sidescrolloff=0
708 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200709endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200710
711func! Test_normal18_z_fold()
712 " basic tests for foldopen/folddelete
713 if !has("folding")
714 return
715 endif
716 call Setup_NewWindow()
717 50
718 setl foldenable fdm=marker foldlevel=5
719
720 " Test for zF
721 " First fold
722 norm! 4zF
723 " check that folds have been created
724 call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53))
725
726 " Test for zd
727 51
728 norm! 2zF
729 call assert_equal(2, foldlevel('.'))
730 norm! kzd
731 call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53))
732 norm! j
733 call assert_equal(1, foldlevel('.'))
734
735 " Test for zD
736 " also deletes partially selected folds recursively
737 51
738 norm! zF
739 call assert_equal(2, foldlevel('.'))
740 norm! kV2jzD
741 call assert_equal(['50', '51', '52', '53'], getline(50,53))
742
743 " Test for zE
744 85
745 norm! 4zF
746 86
747 norm! 2zF
748 90
749 norm! 4zF
750 call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93))
751 norm! zE
752 call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93))
753
754 " Test for zn
755 50
756 set foldlevel=0
757 norm! 2zF
758 norm! zn
759 norm! k
760 call assert_equal('49', getline('.'))
761 norm! j
762 call assert_equal('50/*{{{*/', getline('.'))
763 norm! j
764 call assert_equal('51/*}}}*/', getline('.'))
765 norm! j
766 call assert_equal('52', getline('.'))
767 call assert_equal(0, &foldenable)
768
769 " Test for zN
770 49
771 norm! zN
772 call assert_equal('49', getline('.'))
773 norm! j
774 call assert_equal('50/*{{{*/', getline('.'))
775 norm! j
776 call assert_equal('52', getline('.'))
777 call assert_equal(1, &foldenable)
778
779 " Test for zi
780 norm! zi
781 call assert_equal(0, &foldenable)
782 norm! zi
783 call assert_equal(1, &foldenable)
784 norm! zi
785 call assert_equal(0, &foldenable)
786 norm! zi
787 call assert_equal(1, &foldenable)
788
789 " Test for za
790 50
791 norm! za
792 norm! k
793 call assert_equal('49', getline('.'))
794 norm! j
795 call assert_equal('50/*{{{*/', getline('.'))
796 norm! j
797 call assert_equal('51/*}}}*/', getline('.'))
798 norm! j
799 call assert_equal('52', getline('.'))
800 50
801 norm! za
802 norm! k
803 call assert_equal('49', getline('.'))
804 norm! j
805 call assert_equal('50/*{{{*/', getline('.'))
806 norm! j
807 call assert_equal('52', getline('.'))
808
809 49
810 norm! 5zF
811 norm! k
812 call assert_equal('48', getline('.'))
813 norm! j
814 call assert_equal('49/*{{{*/', getline('.'))
815 norm! j
816 call assert_equal('55', getline('.'))
817 49
818 norm! za
819 call assert_equal('49/*{{{*/', getline('.'))
820 norm! j
821 call assert_equal('50/*{{{*/', getline('.'))
822 norm! j
823 call assert_equal('52', getline('.'))
824 set nofoldenable
825 " close fold and set foldenable
826 norm! za
827 call assert_equal(1, &foldenable)
828
829 50
830 " have to use {count}za to open all folds and make the cursor visible
831 norm! 2za
832 norm! 2k
833 call assert_equal('48', getline('.'))
834 norm! j
835 call assert_equal('49/*{{{*/', getline('.'))
836 norm! j
837 call assert_equal('50/*{{{*/', getline('.'))
838 norm! j
839 call assert_equal('51/*}}}*/', getline('.'))
840 norm! j
841 call assert_equal('52', getline('.'))
842
843 " Test for zA
844 49
845 set foldlevel=0
846 50
847 norm! zA
848 norm! 2k
849 call assert_equal('48', getline('.'))
850 norm! j
851 call assert_equal('49/*{{{*/', getline('.'))
852 norm! j
853 call assert_equal('50/*{{{*/', getline('.'))
854 norm! j
855 call assert_equal('51/*}}}*/', getline('.'))
856 norm! j
857 call assert_equal('52', getline('.'))
858
Bram Moolenaar395b6ba2017-04-07 20:09:51 +0200859 " zA on a opened fold when foldenable is not set
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200860 50
861 set nofoldenable
862 norm! zA
863 call assert_equal(1, &foldenable)
864 norm! k
865 call assert_equal('48', getline('.'))
866 norm! j
867 call assert_equal('49/*{{{*/', getline('.'))
868 norm! j
869 call assert_equal('55', getline('.'))
870
871 " Test for zc
872 norm! zE
873 50
874 norm! 2zF
875 49
876 norm! 5zF
877 set nofoldenable
878 50
879 " There most likely is a bug somewhere:
880 " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ
881 " TODO: Should this only close the inner most fold or both folds?
882 norm! zc
883 call assert_equal(1, &foldenable)
884 norm! k
885 call assert_equal('48', getline('.'))
886 norm! j
887 call assert_equal('49/*{{{*/', getline('.'))
888 norm! j
889 call assert_equal('55', getline('.'))
890 set nofoldenable
891 50
892 norm! Vjzc
893 norm! k
894 call assert_equal('48', getline('.'))
895 norm! j
896 call assert_equal('49/*{{{*/', getline('.'))
897 norm! j
898 call assert_equal('55', getline('.'))
899
900 " Test for zC
901 set nofoldenable
902 50
903 norm! zCk
904 call assert_equal('48', getline('.'))
905 norm! j
906 call assert_equal('49/*{{{*/', getline('.'))
907 norm! j
908 call assert_equal('55', getline('.'))
909
910 " Test for zx
911 " 1) close folds at line 49-54
912 set nofoldenable
913 48
914 norm! zx
915 call assert_equal(1, &foldenable)
916 norm! j
917 call assert_equal('49/*{{{*/', getline('.'))
918 norm! j
919 call assert_equal('55', getline('.'))
920
Bram Moolenaar395b6ba2017-04-07 20:09:51 +0200921 " 2) do not close fold under cursor
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200922 51
923 set nofoldenable
924 norm! zx
925 call assert_equal(1, &foldenable)
926 norm! 3k
927 call assert_equal('48', getline('.'))
928 norm! j
929 call assert_equal('49/*{{{*/', getline('.'))
930 norm! j
931 call assert_equal('50/*{{{*/', getline('.'))
932 norm! j
933 call assert_equal('51/*}}}*/', getline('.'))
934 norm! j
935 call assert_equal('52', getline('.'))
936 norm! j
937 call assert_equal('53', getline('.'))
938 norm! j
939 call assert_equal('54/*}}}*/', getline('.'))
940 norm! j
941 call assert_equal('55', getline('.'))
942
943 " 3) close one level of folds
944 48
945 set nofoldenable
946 set foldlevel=1
947 norm! zx
948 call assert_equal(1, &foldenable)
949 call assert_equal('48', getline('.'))
950 norm! j
951 call assert_equal('49/*{{{*/', getline('.'))
952 norm! j
953 call assert_equal('50/*{{{*/', getline('.'))
954 norm! j
955 call assert_equal('52', getline('.'))
956 norm! j
957 call assert_equal('53', getline('.'))
958 norm! j
959 call assert_equal('54/*}}}*/', getline('.'))
960 norm! j
961 call assert_equal('55', getline('.'))
962
963 " Test for zX
964 " Close all folds
965 set foldlevel=0 nofoldenable
966 50
967 norm! zX
968 call assert_equal(1, &foldenable)
969 norm! k
970 call assert_equal('48', getline('.'))
971 norm! j
972 call assert_equal('49/*{{{*/', getline('.'))
973 norm! j
974 call assert_equal('55', getline('.'))
975
976 " Test for zm
977 50
978 set nofoldenable foldlevel=2
979 norm! zm
980 call assert_equal(1, &foldenable)
981 call assert_equal(1, &foldlevel)
982 norm! zm
983 call assert_equal(0, &foldlevel)
984 norm! zm
985 call assert_equal(0, &foldlevel)
986 norm! k
987 call assert_equal('48', getline('.'))
988 norm! j
989 call assert_equal('49/*{{{*/', getline('.'))
990 norm! j
991 call assert_equal('55', getline('.'))
992
993 " Test for zM
994 48
995 set nofoldenable foldlevel=99
996 norm! zM
997 call assert_equal(1, &foldenable)
998 call assert_equal(0, &foldlevel)
999 call assert_equal('48', getline('.'))
1000 norm! j
1001 call assert_equal('49/*{{{*/', getline('.'))
1002 norm! j
1003 call assert_equal('55', getline('.'))
1004
1005 " Test for zr
1006 48
1007 set nofoldenable foldlevel=0
1008 norm! zr
1009 call assert_equal(0, &foldenable)
1010 call assert_equal(1, &foldlevel)
1011 set foldlevel=0 foldenable
1012 norm! zr
1013 call assert_equal(1, &foldenable)
1014 call assert_equal(1, &foldlevel)
1015 norm! zr
1016 call assert_equal(2, &foldlevel)
1017 call assert_equal('48', getline('.'))
1018 norm! j
1019 call assert_equal('49/*{{{*/', getline('.'))
1020 norm! j
1021 call assert_equal('50/*{{{*/', getline('.'))
1022 norm! j
1023 call assert_equal('51/*}}}*/', getline('.'))
1024 norm! j
1025 call assert_equal('52', getline('.'))
1026
1027 " Test for zR
1028 48
1029 set nofoldenable foldlevel=0
1030 norm! zR
1031 call assert_equal(0, &foldenable)
1032 call assert_equal(2, &foldlevel)
1033 set foldenable foldlevel=0
1034 norm! zR
1035 call assert_equal(1, &foldenable)
1036 call assert_equal(2, &foldlevel)
1037 call assert_equal('48', getline('.'))
1038 norm! j
1039 call assert_equal('49/*{{{*/', getline('.'))
1040 norm! j
1041 call assert_equal('50/*{{{*/', getline('.'))
1042 norm! j
1043 call assert_equal('51/*}}}*/', getline('.'))
1044 norm! j
1045 call assert_equal('52', getline('.'))
1046 call append(50, ['a /*{{{*/', 'b /*}}}*/'])
1047 48
1048 call assert_equal('48', getline('.'))
1049 norm! j
1050 call assert_equal('49/*{{{*/', getline('.'))
1051 norm! j
1052 call assert_equal('50/*{{{*/', getline('.'))
1053 norm! j
1054 call assert_equal('a /*{{{*/', getline('.'))
1055 norm! j
1056 call assert_equal('51/*}}}*/', getline('.'))
1057 norm! j
1058 call assert_equal('52', getline('.'))
1059 48
1060 norm! zR
1061 call assert_equal(1, &foldenable)
1062 call assert_equal(3, &foldlevel)
1063 call assert_equal('48', getline('.'))
1064 norm! j
1065 call assert_equal('49/*{{{*/', getline('.'))
1066 norm! j
1067 call assert_equal('50/*{{{*/', getline('.'))
1068 norm! j
1069 call assert_equal('a /*{{{*/', getline('.'))
1070 norm! j
1071 call assert_equal('b /*}}}*/', getline('.'))
1072 norm! j
1073 call assert_equal('51/*}}}*/', getline('.'))
1074 norm! j
1075 call assert_equal('52', getline('.'))
1076
1077 " clean up
1078 setl nofoldenable fdm=marker foldlevel=0
1079 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001080endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001081
1082func! Test_normal19_z_spell()
1083 if !has("spell") || !has('syntax')
1084 return
1085 endif
1086 new
1087 call append(0, ['1 good', '2 goood', '3 goood'])
1088 set spell spellfile=./Xspellfile.add spelllang=en
1089 let oldlang=v:lang
1090 lang C
1091
1092 " Test for zg
1093 1
1094 norm! ]s
1095 call assert_equal('2 goood', getline('.'))
1096 norm! zg
1097 1
1098 let a=execute('unsilent :norm! ]s')
1099 call assert_equal('1 good', getline('.'))
1100 call assert_equal('search hit BOTTOM, continuing at TOP', a[1:])
1101 let cnt=readfile('./Xspellfile.add')
1102 call assert_equal('goood', cnt[0])
1103
1104 " Test for zw
1105 2
1106 norm! $zw
1107 1
1108 norm! ]s
1109 call assert_equal('2 goood', getline('.'))
1110 let cnt=readfile('./Xspellfile.add')
1111 call assert_equal('#oood', cnt[0])
1112 call assert_equal('goood/!', cnt[1])
1113
1114 " Test for zg in visual mode
1115 let a=execute('unsilent :norm! V$zg')
1116 call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
1117 1
1118 norm! ]s
1119 call assert_equal('3 goood', getline('.'))
1120 let cnt=readfile('./Xspellfile.add')
1121 call assert_equal('2 goood', cnt[2])
1122 " Remove "2 good" from spellfile
1123 2
1124 let a=execute('unsilent norm! V$zw')
1125 call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
1126 let cnt=readfile('./Xspellfile.add')
1127 call assert_equal('2 goood/!', cnt[3])
1128
1129 " Test for zG
1130 let a=execute('unsilent norm! V$zG')
1131 call assert_match("Word '2 goood' added to .*", a)
1132 let fname=matchstr(a, 'to\s\+\zs\f\+$')
1133 let cnt=readfile(fname)
1134 call assert_equal('2 goood', cnt[0])
1135
1136 " Test for zW
1137 let a=execute('unsilent norm! V$zW')
1138 call assert_match("Word '2 goood' added to .*", a)
1139 let cnt=readfile(fname)
1140 call assert_equal('# goood', cnt[0])
1141 call assert_equal('2 goood/!', cnt[1])
1142
1143 " Test for zuW
1144 let a=execute('unsilent norm! V$zuW')
1145 call assert_match("Word '2 goood' removed from .*", a)
1146 let cnt=readfile(fname)
1147 call assert_equal('# goood', cnt[0])
1148 call assert_equal('# goood/!', cnt[1])
1149
1150 " Test for zuG
1151 let a=execute('unsilent norm! $zG')
1152 call assert_match("Word 'goood' added to .*", a)
1153 let cnt=readfile(fname)
1154 call assert_equal('# goood', cnt[0])
1155 call assert_equal('# goood/!', cnt[1])
1156 call assert_equal('goood', cnt[2])
1157 let a=execute('unsilent norm! $zuG')
1158 let cnt=readfile(fname)
1159 call assert_match("Word 'goood' removed from .*", a)
1160 call assert_equal('# goood', cnt[0])
1161 call assert_equal('# goood/!', cnt[1])
1162 call assert_equal('#oood', cnt[2])
1163 " word not found in wordlist
1164 let a=execute('unsilent norm! V$zuG')
1165 let cnt=readfile(fname)
1166 call assert_match("", a)
1167 call assert_equal('# goood', cnt[0])
1168 call assert_equal('# goood/!', cnt[1])
1169 call assert_equal('#oood', cnt[2])
1170
1171 " Test for zug
1172 call delete('./Xspellfile.add')
1173 2
1174 let a=execute('unsilent norm! $zg')
1175 let cnt=readfile('./Xspellfile.add')
1176 call assert_equal('goood', cnt[0])
1177 let a=execute('unsilent norm! $zug')
1178 call assert_match("Word 'goood' removed from \./Xspellfile.add", a)
1179 let cnt=readfile('./Xspellfile.add')
1180 call assert_equal('#oood', cnt[0])
1181 " word not in wordlist
1182 let a=execute('unsilent norm! V$zug')
1183 call assert_match('', a)
1184 let cnt=readfile('./Xspellfile.add')
1185 call assert_equal('#oood', cnt[0])
1186
1187 " Test for zuw
1188 call delete('./Xspellfile.add')
1189 2
1190 let a=execute('unsilent norm! Vzw')
1191 let cnt=readfile('./Xspellfile.add')
1192 call assert_equal('2 goood/!', cnt[0])
1193 let a=execute('unsilent norm! Vzuw')
1194 call assert_match("Word '2 goood' removed from \./Xspellfile.add", a)
1195 let cnt=readfile('./Xspellfile.add')
1196 call assert_equal('# goood/!', cnt[0])
1197 " word not in wordlist
1198 let a=execute('unsilent norm! $zug')
1199 call assert_match('', a)
1200 let cnt=readfile('./Xspellfile.add')
1201 call assert_equal('# goood/!', cnt[0])
1202
1203 " add second entry to spellfile setting
1204 set spellfile=./Xspellfile.add,./Xspellfile2.add
1205 call delete('./Xspellfile.add')
1206 2
1207 let a=execute('unsilent norm! $2zg')
1208 let cnt=readfile('./Xspellfile2.add')
1209 call assert_match("Word 'goood' added to ./Xspellfile2.add", a)
1210 call assert_equal('goood', cnt[0])
1211
1212 " clean up
1213 exe "lang" oldlang
1214 call delete("./Xspellfile.add")
1215 call delete("./Xspellfile2.add")
Bram Moolenaardf0db162016-09-06 20:37:41 +02001216 call delete("./Xspellfile.add.spl")
1217 call delete("./Xspellfile2.add.spl")
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001218
1219 " zux -> no-op
1220 2
1221 norm! $zux
1222 call assert_equal([], glob('Xspellfile.add',0,1))
1223 call assert_equal([], glob('Xspellfile2.add',0,1))
1224
1225 set spellfile=
1226 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001227endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001228
1229func! Test_normal20_exmode()
Bram Moolenaar0913a102016-09-03 19:11:59 +02001230 if !has("unix")
1231 " Reading from redirected file doesn't work on MS-Windows
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001232 return
1233 endif
1234 call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript')
1235 call writefile(['1', '2'], 'Xfile')
1236 call system(v:progpath .' -e -s < Xscript Xfile')
1237 let a=readfile('Xfile2')
1238 call assert_equal(['1', 'foo', 'bar', '2'], a)
1239
1240 " clean up
1241 for file in ['Xfile', 'Xfile2', 'Xscript']
1242 call delete(file)
1243 endfor
1244 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001245endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001246
1247func! Test_normal21_nv_hat()
1248 set hidden
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001249 new
1250 " to many buffers opened already, will not work
1251 "call assert_fails(":b#", 'E23')
1252 "call assert_equal('', @#)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001253 e Xfoobar
1254 e Xfile2
1255 call feedkeys("\<c-^>", 't')
1256 call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t'))
1257 call feedkeys("f\<c-^>", 't')
1258 call assert_equal("Xfile2", fnamemodify(bufname('%'), ':t'))
1259 " clean up
1260 set nohidden
1261 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001262endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001263
1264func! Test_normal22_zet()
1265 " Test for ZZ
Bram Moolenaar0913a102016-09-03 19:11:59 +02001266 " let shell = &shell
1267 " let &shell = 'sh'
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001268 call writefile(['1', '2'], 'Xfile')
1269 let args = ' -u NONE -N -U NONE -i NONE --noplugins -X --not-a-term'
1270 call system(v:progpath . args . ' -c "%d" -c ":norm! ZZ" Xfile')
1271 let a = readfile('Xfile')
1272 call assert_equal([], a)
1273 " Test for ZQ
1274 call writefile(['1', '2'], 'Xfile')
1275 call system(v:progpath . args . ' -c "%d" -c ":norm! ZQ" Xfile')
1276 let a = readfile('Xfile')
1277 call assert_equal(['1', '2'], a)
1278
1279 " clean up
1280 for file in ['Xfile']
1281 call delete(file)
1282 endfor
Bram Moolenaar0913a102016-09-03 19:11:59 +02001283 " let &shell = shell
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001284endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001285
1286func! Test_normal23_K()
1287 " Test for K command
1288 new
Bram Moolenaar426f3752016-11-04 21:22:37 +01001289 call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd'])
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001290 let k = &keywordprg
1291 set keywordprg=:help
1292 1
1293 norm! VK
1294 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1295 call assert_equal('help', &ft)
1296 call assert_match('\*version8.txt\*', getline('.'))
1297 helpclose
1298 norm! 0K
1299 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1300 call assert_equal('help', &ft)
1301 call assert_match('\*version8\.0\*', getline('.'))
1302 helpclose
1303
Bram Moolenaar426f3752016-11-04 21:22:37 +01001304 set keywordprg=:new
1305 set iskeyword+=%
1306 set iskeyword+=\|
1307 2
1308 norm! K
1309 call assert_equal('man', fnamemodify(bufname('%'), ':t'))
1310 bwipe!
1311 3
1312 norm! K
1313 call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t'))
1314 bwipe!
Bram Moolenaareb828d02016-11-05 19:54:01 +01001315 if !has('win32')
1316 4
1317 norm! K
1318 call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t'))
1319 bwipe!
1320 endif
Bram Moolenaar426f3752016-11-04 21:22:37 +01001321 set iskeyword-=%
1322 set iskeyword-=\|
1323
Bram Moolenaar0913a102016-09-03 19:11:59 +02001324 " Only expect "man" to work on Unix
1325 if !has("unix")
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001326 let &keywordprg = k
1327 bw!
1328 return
1329 endif
1330 set keywordprg=man\ --pager=cat
1331 " Test for using man
1332 2
1333 let a = execute('unsilent norm! K')
1334 call assert_match("man --pager=cat 'man'", a)
1335
1336 " clean up
1337 let &keywordprg = k
1338 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001339endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001340
1341func! Test_normal24_rot13()
1342 " This test uses multi byte characters
1343 if !has("multi_byte")
1344 return
1345 endif
1346 " Testing for g?? g?g?
1347 new
1348 call append(0, 'abcdefghijklmnopqrstuvwxyzäüö')
1349 1
1350 norm! g??
1351 call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.'))
1352 norm! g?g?
1353 call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.'))
1354
1355 " clean up
1356 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001357endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001358
1359func! Test_normal25_tag()
1360 " Testing for CTRL-] g CTRL-] g]
1361 " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-]
1362 h
1363 " Test for CTRL-]
1364 call search('\<x\>$')
1365 exe "norm! \<c-]>"
1366 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1367 norm! yiW
1368 call assert_equal("*x*", @0)
1369 exe ":norm \<c-o>"
1370
1371 " Test for g_CTRL-]
1372 call search('\<v_u\>$')
1373 exe "norm! g\<c-]>"
1374 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1375 norm! yiW
1376 call assert_equal("*v_u*", @0)
1377 exe ":norm \<c-o>"
1378
1379 " Test for g]
1380 call search('\<i_<Esc>$')
1381 let a = execute(":norm! g]")
1382 call assert_match('i_<Esc>.*insert.txt', a)
1383
1384 if !empty(exepath('cscope')) && has('cscope')
1385 " setting cscopetag changes how g] works
1386 set cst
1387 exe "norm! g]"
1388 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1389 norm! yiW
1390 call assert_equal("*i_<Esc>*", @0)
1391 exe ":norm \<c-o>"
1392 " Test for CTRL-W g]
1393 exe "norm! \<C-W>g]"
1394 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1395 norm! yiW
1396 call assert_equal("*i_<Esc>*", @0)
1397 call assert_equal(3, winnr('$'))
1398 helpclose
1399 set nocst
1400 endif
1401
1402 " Test for CTRL-W g]
1403 let a = execute("norm! \<C-W>g]")
1404 call assert_match('i_<Esc>.*insert.txt', a)
1405
1406 " Test for CTRL-W CTRL-]
1407 exe "norm! \<C-W>\<C-]>"
1408 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1409 norm! yiW
1410 call assert_equal("*i_<Esc>*", @0)
1411 call assert_equal(3, winnr('$'))
1412 helpclose
1413
1414 " Test for CTRL-W g CTRL-]
1415 exe "norm! \<C-W>g\<C-]>"
1416 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1417 norm! yiW
1418 call assert_equal("*i_<Esc>*", @0)
1419 call assert_equal(3, winnr('$'))
1420 helpclose
1421
1422 " clean up
1423 helpclose
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001424endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001425
1426func! Test_normal26_put()
1427 " Test for ]p ]P [p and [P
1428 new
1429 call append(0, ['while read LINE', 'do', ' ((count++))', ' if [ $? -ne 0 ]; then', " echo 'Error writing file'", ' fi', 'done'])
1430 1
1431 /Error/y a
1432 2
1433 norm! "a]pj"a[p
1434 call assert_equal(['do', "echo 'Error writing file'", " echo 'Error writing file'", ' ((count++))'], getline(2,5))
1435 1
1436 /^\s\{4}/
1437 exe "norm! \"a]P3Eldt'"
1438 exe "norm! j\"a[P2Eldt'"
1439 call assert_equal([' if [ $? -ne 0 ]; then', " echo 'Error writing'", " echo 'Error'", " echo 'Error writing file'", ' fi'], getline(6,10))
1440
1441 " clean up
1442 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001443endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001444
1445func! Test_normal27_bracket()
1446 " Test for [' [` ]' ]`
1447 call Setup_NewWindow()
1448 1,21s/.\+/ & b/
1449 1
1450 norm! $ma
1451 5
1452 norm! $mb
1453 10
1454 norm! $mc
1455 15
1456 norm! $md
1457 20
1458 norm! $me
1459
1460 " Test for ['
1461 9
1462 norm! 2['
1463 call assert_equal(' 1 b', getline('.'))
1464 call assert_equal(1, line('.'))
1465 call assert_equal(3, col('.'))
1466
1467 " Test for ]'
1468 norm! ]'
1469 call assert_equal(' 5 b', getline('.'))
1470 call assert_equal(5, line('.'))
1471 call assert_equal(3, col('.'))
1472
1473 " No mark after line 21, cursor moves to first non blank on current line
1474 21
1475 norm! $]'
1476 call assert_equal(' 21 b', getline('.'))
1477 call assert_equal(21, line('.'))
1478 call assert_equal(3, col('.'))
1479
1480 " Test for [`
1481 norm! 2[`
1482 call assert_equal(' 15 b', getline('.'))
1483 call assert_equal(15, line('.'))
1484 call assert_equal(8, col('.'))
1485
1486 " Test for ]`
1487 norm! ]`
1488 call assert_equal(' 20 b', getline('.'))
1489 call assert_equal(20, line('.'))
1490 call assert_equal(8, col('.'))
1491
1492 " clean up
1493 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001494endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001495
1496func! Test_normal28_parenthesis()
1497 " basic testing for ( and )
1498 new
1499 call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
1500
1501 $
1502 norm! d(
1503 call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$'))
1504 norm! 2d(
1505 call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$'))
1506 1
1507 norm! 0d)
1508 call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$'))
1509
1510 call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. '])
1511 $
1512 norm! $d(
1513 call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$'))
1514
1515 " clean up
1516 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001517endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001518
1519fun! Test_normal29_brace()
1520 " basic test for { and } movements
1521 let text= ['A paragraph begins after each empty line, and also at each of a set of',
1522 \ 'paragraph macros, specified by the pairs of characters in the ''paragraphs''',
1523 \ 'option. The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to',
1524 \ 'the macros ".IP", ".LP", etc. (These are nroff macros, so the dot must be in',
1525 \ 'the first column). A section boundary is also a paragraph boundary.',
1526 \ 'Note that a blank line (only containing white space) is NOT a paragraph',
1527 \ 'boundary.',
1528 \ '',
1529 \ '',
1530 \ 'Also note that this does not include a ''{'' or ''}'' in the first column. When',
1531 \ 'the ''{'' flag is in ''cpoptions'' then ''{'' in the first column is used as a',
1532 \ 'paragraph boundary |posix|.',
1533 \ '{',
1534 \ 'This is no paragaraph',
1535 \ 'unless the ''{'' is set',
1536 \ 'in ''cpoptions''',
1537 \ '}',
1538 \ '.IP',
1539 \ 'The nroff macros IP seperates a paragraph',
1540 \ 'That means, it must be a ''.''',
1541 \ 'followed by IP',
1542 \ '.LPIt does not matter, if afterwards some',
1543 \ 'more characters follow.',
1544 \ '.SHAlso section boundaries from the nroff',
1545 \ 'macros terminate a paragraph. That means',
1546 \ 'a character like this:',
1547 \ '.NH',
1548 \ 'End of text here']
1549 new
1550 call append(0, text)
1551 1
1552 norm! 0d2}
1553 call assert_equal(['.IP',
1554 \ 'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''', 'followed by IP',
1555 \ '.LPIt does not matter, if afterwards some', 'more characters follow.', '.SHAlso section boundaries from the nroff',
1556 \ 'macros terminate a paragraph. That means', 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
1557 norm! 0d}
1558 call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.',
1559 \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
1560 \ 'a character like this:', '.NH', 'End of text here', ''], getline(1, '$'))
1561 $
1562 norm! d{
1563 call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.',
1564 \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means', 'a character like this:', ''], getline(1, '$'))
1565 norm! d{
1566 call assert_equal(['.LPIt does not matter, if afterwards some', 'more characters follow.', ''], getline(1,'$'))
1567 " Test with { in cpooptions
1568 %d
1569 call append(0, text)
1570 set cpo+={
1571 1
1572 norm! 0d2}
1573 call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}',
1574 \ '.IP', 'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''',
1575 \ 'followed by IP', '.LPIt does not matter, if afterwards some', 'more characters follow.',
1576 \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
1577 \ 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
1578 $
1579 norm! d}
1580 call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}',
1581 \ '.IP', 'The nroff macros IP seperates a paragraph', 'That means, it must be a ''.''',
1582 \ 'followed by IP', '.LPIt does not matter, if afterwards some', 'more characters follow.',
1583 \ '.SHAlso section boundaries from the nroff', 'macros terminate a paragraph. That means',
1584 \ 'a character like this:', '.NH', 'End of text here', ''], getline(1,'$'))
1585 norm! gg}
1586 norm! d5}
1587 call assert_equal(['{', 'This is no paragaraph', 'unless the ''{'' is set', 'in ''cpoptions''', '}', ''], getline(1,'$'))
1588
1589 " clean up
1590 set cpo-={
1591 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001592endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001593
1594fun! Test_normal30_changecase()
1595 " This test uses multi byte characters
1596 if !has("multi_byte")
1597 return
1598 endif
1599 new
1600 call append(0, 'This is a simple test: äüöß')
1601 norm! 1ggVu
1602 call assert_equal('this is a simple test: äüöß', getline('.'))
1603 norm! VU
1604 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1605 norm! guu
1606 call assert_equal('this is a simple test: äüöss', getline('.'))
1607 norm! gUgU
1608 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1609 norm! gugu
1610 call assert_equal('this is a simple test: äüöss', getline('.'))
1611 norm! gUU
1612 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1613 norm! 010~
1614 call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.'))
1615 norm! V~
1616 call assert_equal('THIS IS A simple test: äüöss', getline('.'))
1617
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02001618 " Turkish ASCII turns to multi-byte. On Mac the Turkish locale is available
1619 " but toupper()/tolower() don't do the right thing.
Bram Moolenaard2381a22017-04-09 14:58:15 +02001620 if !has('mac') && !has('osx')
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02001621 try
1622 lang tr_TR.UTF-8
1623 set casemap=
1624 call setline(1, 'iI')
1625 1normal gUU
1626 call assert_equal("\u0130I", getline(1))
1627 call assert_equal("\u0130I", toupper("iI"))
Bram Moolenaar3317d5e2017-04-08 19:12:06 +02001628
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02001629 call setline(1, 'iI')
1630 1normal guu
1631 call assert_equal("i\u0131", getline(1))
1632 call assert_equal("i\u0131", tolower("iI"))
Bram Moolenaar3317d5e2017-04-08 19:12:06 +02001633
Bram Moolenaar1cc48202017-04-09 13:41:59 +02001634 set casemap&
1635 call setline(1, 'iI')
1636 1normal gUU
1637 call assert_equal("II", getline(1))
1638 call assert_equal("II", toupper("iI"))
1639
1640 call setline(1, 'iI')
1641 1normal guu
1642 call assert_equal("ii", getline(1))
1643 call assert_equal("ii", tolower("iI"))
1644
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02001645 lang en_US.UTF-8
1646 catch /E197:/
1647 " can't use Turkish locale
1648 throw 'Skipped: Turkish locale not available'
1649 endtry
1650 endif
Bram Moolenaar3317d5e2017-04-08 19:12:06 +02001651
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001652 " clean up
1653 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001654endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001655
1656fun! Test_normal31_r_cmd()
1657 " Test for r command
1658 new
1659 call append(0, 'This is a simple test: abcd')
1660 exe "norm! 1gg$r\<cr>"
1661 call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$'))
1662 exe "norm! 1gg2wlr\<cr>"
1663 call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$'))
1664 exe "norm! 2gg0W5r\<cr>"
1665 call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$'))
1666 set autoindent
1667 call setline(2, ['simple test: abc', ''])
1668 exe "norm! 2gg0W5r\<cr>"
1669 call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$'))
1670 exe "norm! 1ggVr\<cr>"
1671 call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1)))
1672 call setline(1, 'This is a')
1673 exe "norm! 1gg05rf"
1674 call assert_equal('fffffis a', getline(1))
1675
1676 " clean up
1677 set noautoindent
1678 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001679endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001680
1681func! Test_normal32_g_cmd1()
1682 " Test for g*, g#
1683 new
1684 call append(0, ['abc.x_foo', 'x_foobar.abc'])
1685 1
1686 norm! $g*
1687 call assert_equal('x_foo', @/)
1688 call assert_equal('x_foobar.abc', getline('.'))
1689 norm! $g#
1690 call assert_equal('abc', @/)
1691 call assert_equal('abc.x_foo', getline('.'))
1692
1693 " clean up
1694 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001695endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001696
1697fun! Test_normal33_g_cmd2()
1698 if !has("jumplist")
1699 return
1700 endif
1701 " Tests for g cmds
1702 call Setup_NewWindow()
1703 " Test for g`
1704 clearjumps
1705 norm! ma10j
1706 let a=execute(':jumps')
1707 " empty jumplist
1708 call assert_equal('>', a[-1:])
1709 norm! g`a
1710 call assert_equal('>', a[-1:])
1711 call assert_equal(1, line('.'))
1712 call assert_equal('1', getline('.'))
1713
1714 " Test for g; and g,
1715 norm! g;
1716 " there is only one change in the changelist
1717 " currently, when we setup the window
1718 call assert_equal(2, line('.'))
1719 call assert_fails(':norm! g;', 'E662')
1720 call assert_fails(':norm! g,', 'E663')
1721 let &ul=&ul
1722 call append('$', ['a', 'b', 'c', 'd'])
1723 let &ul=&ul
1724 call append('$', ['Z', 'Y', 'X', 'W'])
1725 let a = execute(':changes')
1726 call assert_match('2\s\+0\s\+2', a)
1727 call assert_match('101\s\+0\s\+a', a)
1728 call assert_match('105\s\+0\s\+Z', a)
1729 norm! 3g;
1730 call assert_equal(2, line('.'))
1731 norm! 2g,
1732 call assert_equal(105, line('.'))
1733
1734 " Test for g& - global substitute
1735 %d
1736 call setline(1, range(1,10))
1737 call append('$', ['a', 'b', 'c', 'd'])
1738 $s/\w/&&/g
1739 exe "norm! /[1-8]\<cr>"
1740 norm! g&
1741 call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$'))
1742
1743 " Test for gv
1744 %d
1745 call append('$', repeat(['abcdefgh'], 8))
1746 exe "norm! 2gg02l\<c-v>2j2ly"
1747 call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1))
1748 " in visual mode, gv swaps current and last selected region
1749 exe "norm! G0\<c-v>4k4lgvd"
1750 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$'))
1751 exe "norm! G0\<c-v>4k4ly"
1752 exe "norm! gvood"
1753 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$'))
1754
1755 " Test for gk/gj
1756 %d
1757 15vsp
1758 set wrap listchars= sbr=
1759 let lineA='abcdefghijklmnopqrstuvwxyz'
1760 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
1761 $put =lineA
1762 $put =lineB
1763
1764 norm! 3gg0dgk
1765 call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$'))
1766 set nu
1767 norm! 3gg0gjdgj
1768 call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1769
1770 " Test for gJ
1771 norm! 2gggJ
1772 call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1773 call assert_equal(16, col('.'))
1774 " shouldn't do anything
1775 norm! 10gJ
1776 call assert_equal(1, col('.'))
1777
1778 " Test for g0 g^ gm g$
1779 exe "norm! 2gg0gji "
1780 call assert_equal(['', 'abcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1781 norm! g0yl
1782 call assert_equal(12, col('.'))
1783 call assert_equal(' ', getreg(0))
1784 norm! g$yl
1785 call assert_equal(22, col('.'))
1786 call assert_equal('3', getreg(0))
1787 norm! gmyl
1788 call assert_equal(17, col('.'))
1789 call assert_equal('n', getreg(0))
1790 norm! g^yl
1791 call assert_equal(15, col('.'))
1792 call assert_equal('l', getreg(0))
1793
1794 " Test for g Ctrl-G
Bram Moolenaar0913a102016-09-03 19:11:59 +02001795 set ff=unix
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001796 let a=execute(":norm! g\<c-g>")
1797 call assert_match('Col 15 of 43; Line 2 of 2; Word 2 of 2; Byte 16 of 45', a)
1798
1799 " Test for gI
1800 norm! gIfoo
1801 call assert_equal(['', 'fooabcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1802
1803 " Test for gi
1804 wincmd c
1805 %d
1806 set tw=0
1807 call setline(1, ['foobar', 'new line'])
1808 norm! A next word
1809 $put ='third line'
1810 norm! gi another word
1811 call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$'))
1812
1813 " clean up
1814 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001815endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001816
1817fun! Test_normal34_g_cmd3()
1818 if !has("multi_byte")
1819 return
1820 endif
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001821
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001822 " Test for g8
1823 new
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001824 let a=execute(':norm! 1G0g8')
1825 call assert_equal("\nNUL", a)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001826
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001827 call setline(1, 'abcdefghijklmnopqrstuvwxyzäüö')
1828 let a=execute(':norm! 1G$g8')
1829 call assert_equal("\nc3 b6 ", a)
1830
1831 call setline(1, "a\u0302")
1832 let a=execute(':norm! 1G0g8')
1833 call assert_equal("\n61 + cc 82 ", a)
1834
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001835 " clean up
1836 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001837endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001838
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001839func Test_normal_8g8()
1840 if !has("multi_byte")
1841 return
1842 endif
1843 new
1844
1845 " Test 8g8 which finds invalid utf8 at or after the cursor.
1846
1847 " With invalid byte.
1848 call setline(1, "___\xff___")
1849 norm! 1G08g8g
1850 call assert_equal([0, 1, 4, 0, 1], getcurpos())
1851
1852 " With invalid byte before the cursor.
1853 call setline(1, "___\xff___")
1854 norm! 1G$h8g8g
1855 call assert_equal([0, 1, 6, 0, 9], getcurpos())
1856
1857 " With truncated sequence.
1858 call setline(1, "___\xE2\x82___")
1859 norm! 1G08g8g
1860 call assert_equal([0, 1, 4, 0, 1], getcurpos())
1861
1862 " With overlong sequence.
1863 call setline(1, "___\xF0\x82\x82\xAC___")
1864 norm! 1G08g8g
1865 call assert_equal([0, 1, 4, 0, 1], getcurpos())
1866
1867 " With valid utf8.
1868 call setline(1, "café")
1869 norm! 1G08g8
1870 call assert_equal([0, 1, 1, 0, 1], getcurpos())
1871
1872 bw!
1873endfunc
1874
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001875fun! Test_normal35_g_cmd4()
1876 " Test for g<
1877 " Cannot capture its output,
1878 " probably a bug, therefore, test disabled:
Bram Moolenaar31845092016-09-05 22:58:31 +02001879 throw "Skipped: output of g< can't be tested currently"
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001880 echo "a\nb\nc\nd"
1881 let b=execute(':norm! g<')
1882 call assert_true(!empty(b), 'failed `execute(g<)`')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001883endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001884
1885fun! Test_normal36_g_cmd5()
1886 new
1887 call append(0, 'abcdefghijklmnopqrstuvwxyz')
Bram Moolenaar0913a102016-09-03 19:11:59 +02001888 set ff=unix
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001889 " Test for gp gP
1890 call append(1, range(1,10))
1891 1
1892 norm! 1yy
1893 3
1894 norm! gp
1895 call assert_equal([0, 5, 1, 0, 1], getcurpos())
1896 $
1897 norm! gP
1898 call assert_equal([0, 14, 1, 0, 1], getcurpos())
1899
1900 " Test for go
1901 norm! 26go
1902 call assert_equal([0, 1, 26, 0, 26], getcurpos())
1903 norm! 27go
1904 call assert_equal([0, 1, 26, 0, 26], getcurpos())
1905 norm! 28go
1906 call assert_equal([0, 2, 1, 0, 1], getcurpos())
1907 set ff=dos
1908 norm! 29go
1909 call assert_equal([0, 2, 1, 0, 1], getcurpos())
1910 set ff=unix
1911 norm! gg0
1912 norm! 101go
1913 call assert_equal([0, 13, 26, 0, 26], getcurpos())
1914 norm! 103go
1915 call assert_equal([0, 14, 1, 0, 1], getcurpos())
1916 " count > buffer content
1917 norm! 120go
1918 call assert_equal([0, 14, 1, 0, 2147483647], getcurpos())
1919 " clean up
1920 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001921endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001922
1923fun! Test_normal37_g_cmd6()
1924 " basic test for gt and gT
1925 tabnew 1.txt
1926 tabnew 2.txt
1927 tabnew 3.txt
1928 norm! 1gt
1929 call assert_equal(1, tabpagenr())
1930 norm! 3gt
1931 call assert_equal(3, tabpagenr())
1932 norm! 1gT
1933 " count gT goes not to the absolute tabpagenumber
1934 " but, but goes to the count previous tabpagenumber
1935 call assert_equal(2, tabpagenr())
1936 " wrap around
1937 norm! 3gT
1938 call assert_equal(3, tabpagenr())
1939 " gt does not wrap around
1940 norm! 5gt
1941 call assert_equal(3, tabpagenr())
1942
1943 for i in range(3)
1944 tabclose
1945 endfor
1946 " clean up
1947 call assert_fails(':tabclose', 'E784')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001948endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001949
1950fun! Test_normal38_nvhome()
1951 " Test for <Home> and <C-Home> key
1952 new
1953 call setline(1, range(10))
1954 $
1955 setl et sw=2
1956 norm! V10>$
1957 " count is ignored
1958 exe "norm! 10\<home>"
1959 call assert_equal(1, col('.'))
1960 exe "norm! \<home>"
1961 call assert_equal([0, 10, 1, 0, 1], getcurpos())
1962 exe "norm! 5\<c-home>"
1963 call assert_equal([0, 5, 1, 0, 1], getcurpos())
1964 exe "norm! \<c-home>"
1965 call assert_equal([0, 1, 1, 0, 1], getcurpos())
1966
1967 " clean up
1968 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001969endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001970
1971fun! Test_normal39_cw()
1972 " Test for cw and cW on whitespace
1973 " and cpo+=w setting
1974 new
1975 set tw=0
1976 call append(0, 'here are some words')
1977 norm! 1gg0elcwZZZ
1978 call assert_equal('hereZZZare some words', getline('.'))
1979 norm! 1gg0elcWYYY
1980 call assert_equal('hereZZZareYYYsome words', getline('.'))
1981 set cpo+=w
1982 call setline(1, 'here are some words')
1983 norm! 1gg0elcwZZZ
1984 call assert_equal('hereZZZ are some words', getline('.'))
1985 norm! 1gg2elcWYYY
1986 call assert_equal('hereZZZ areYYY some words', getline('.'))
1987 set cpo-=w
1988 norm! 2gg0cwfoo
1989 call assert_equal('foo', getline('.'))
1990
1991 " clean up
1992 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001993endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001994
1995fun! Test_normal40_ctrl_bsl()
1996 " Basic test for CTRL-\ commands
1997 new
1998 call append(0, 'here are some words')
1999 exe "norm! 1gg0a\<C-\>\<C-N>"
2000 call assert_equal('n', mode())
2001 call assert_equal(1, col('.'))
2002 call assert_equal('', visualmode())
2003 exe "norm! 1gg0viw\<C-\>\<C-N>"
2004 call assert_equal('n', mode())
2005 call assert_equal(4, col('.'))
2006 exe "norm! 1gg0a\<C-\>\<C-G>"
2007 call assert_equal('n', mode())
2008 call assert_equal(1, col('.'))
2009 "imap <buffer> , <c-\><c-n>
2010 set im
2011 exe ":norm! \<c-\>\<c-n>dw"
2012 set noim
2013 call assert_equal('are some words', getline(1))
2014 call assert_false(&insertmode)
2015
2016 " clean up
2017 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002018endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002019
2020fun! Test_normal41_insert_reg()
2021 " Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>=
2022 " in insert mode
2023 new
2024 set sts=2 sw=2 ts=8 tw=0
2025 call append(0, ["aaa\tbbb\tccc", '', '', ''])
2026 let a=getline(1)
2027 norm! 2gg0
2028 exe "norm! a\<c-r>=a\<cr>"
2029 norm! 3gg0
2030 exe "norm! a\<c-r>\<c-r>=a\<cr>"
2031 norm! 4gg0
2032 exe "norm! a\<c-r>\<c-o>=a\<cr>"
2033 call assert_equal(['aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', ''], getline(1, '$'))
2034
2035 " clean up
2036 set sts=0 sw=8 ts=8
Bram Moolenaar31845092016-09-05 22:58:31 +02002037 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002038endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002039
2040func! Test_normal42_halfpage()
2041 " basic test for Ctrl-D and Ctrl-U
2042 call Setup_NewWindow()
2043 call assert_equal(5, &scroll)
2044 exe "norm! \<c-d>"
2045 call assert_equal('6', getline('.'))
2046 exe "norm! 2\<c-d>"
2047 call assert_equal('8', getline('.'))
2048 call assert_equal(2, &scroll)
2049 set scroll=5
2050 exe "norm! \<c-u>"
2051 call assert_equal('3', getline('.'))
2052 1
2053 set scrolloff=5
2054 exe "norm! \<c-d>"
2055 call assert_equal('10', getline('.'))
2056 exe "norm! \<c-u>"
2057 call assert_equal('5', getline('.'))
2058 1
2059 set scrolloff=99
2060 exe "norm! \<c-d>"
2061 call assert_equal('10', getline('.'))
2062 set scrolloff=0
2063 100
2064 exe "norm! $\<c-u>"
2065 call assert_equal('95', getline('.'))
2066 call assert_equal([0, 95, 1, 0, 1], getcurpos())
2067 100
2068 set nostartofline
2069 exe "norm! $\<c-u>"
2070 call assert_equal('95', getline('.'))
2071 call assert_equal([0, 95, 2, 0, 2147483647], getcurpos())
2072 " cleanup
2073 set startofline
2074 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002075endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002076
2077fun! Test_normal43_textobject1()
2078 " basic tests for text object aw
2079 new
2080 call append(0, ['foobar,eins,foobar', 'foo,zwei,foo '])
2081 " diw
2082 norm! 1gg0diw
2083 call assert_equal([',eins,foobar', 'foo,zwei,foo ', ''], getline(1,'$'))
2084 " daw
2085 norm! 2ggEdaw
2086 call assert_equal([',eins,foobar', 'foo,zwei,', ''], getline(1, '$'))
2087 %d
2088 call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo "])
2089 " diW
2090 norm! 2ggwd2iW
2091 call assert_equal(['foo eins foobar', 'foo foo ', ''], getline(1,'$'))
2092 " daW
2093 norm! 1ggd2aW
2094 call assert_equal(['foobar', 'foo foo ', ''], getline(1,'$'))
2095
2096 %d
2097 call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo "])
2098 " aw in visual line mode switches to characterwise mode
2099 norm! 2gg$Vawd
2100 call assert_equal(['foo eins foobar', 'foo zwei foo'], getline(1,'$'))
2101 norm! 1gg$Viwd
2102 call assert_equal(['foo eins ', 'foo zwei foo'], getline(1,'$'))
2103
2104 " clean up
2105 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002106endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002107
2108func! Test_normal44_textobjects2()
2109 " basic testing for is and as text objects
2110 new
2111 call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
2112 " Test for dis - does not remove trailing whitespace
2113 norm! 1gg0dis
2114 call assert_equal([' With some sentences!', '', 'Even with a question? And one more. And no sentence here', ''], getline(1,'$'))
2115 " Test for das - removes leading whitespace
2116 norm! 3ggf?ldas
2117 call assert_equal([' With some sentences!', '', 'Even with a question? And no sentence here', ''], getline(1,'$'))
2118 " when used in visual mode, is made characterwise
2119 norm! 3gg$Visy
2120 call assert_equal('v', visualmode())
2121 " reset visualmode()
2122 norm! 3ggVy
2123 norm! 3gg$Vasy
2124 call assert_equal('v', visualmode())
2125 " basic testing for textobjects a< and at
2126 %d
2127 call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>',' </div>', ' '])
2128 " a<
2129 norm! 1gg0da<
2130 call assert_equal([' ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2131 norm! 1pj
2132 call assert_equal([' <div>', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2133 " at
2134 norm! d2at
2135 call assert_equal([' '], getline(1,'$'))
2136 %d
2137 call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>',' </div>', ' '])
2138 " i<
2139 norm! 1gg0di<
2140 call assert_equal(['<> ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2141 norm! 1Pj
2142 call assert_equal(['<div> ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2143 norm! d2it
2144 call assert_equal(['<div></div>',' '], getline(1,'$'))
2145 " basic testing for a[ and i[ text object
2146 %d
2147 call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
2148 norm! 3gg0di[
2149 call assert_equal([' ', '[', ']'], getline(1,'$'))
2150 call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
2151 norm! 3gg0ftd2a[
2152 call assert_equal([' '], getline(1,'$'))
2153 %d
2154 " Test for i" when cursor is in front of a quoted object
2155 call append(0, 'foo "bar"')
2156 norm! 1gg0di"
2157 call assert_equal(['foo ""', ''], getline(1,'$'))
2158
2159 " clean up
2160 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002161endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002162
2163func! Test_normal45_drop()
2164 if !has("dnd")
2165 return
2166 endif
2167 " basic test for :drop command
2168 " unfortunately, without a gui, we can't really test much here,
2169 " so simply test that ~p fails (which uses the drop register)
2170 new
2171 call assert_fails(':norm! "~p', 'E353')
2172 call assert_equal([], getreg('~', 1, 1))
2173 " the ~ register is read only
2174 call assert_fails(':let @~="1"', 'E354')
2175 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002176endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002177
2178func! Test_normal46_ignore()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002179 " This test uses multi byte characters
2180 if !has("multi_byte")
2181 return
2182 endif
2183
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002184 new
2185 " How to test this?
2186 " let's just for now test, that the buffer
2187 " does not change
2188 call feedkeys("\<c-s>", 't')
2189 call assert_equal([''], getline(1,'$'))
2190
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002191 " no valid commands
2192 exe "norm! \<char-0x100>"
2193 call assert_equal([''], getline(1,'$'))
2194
2195 exe "norm! ä"
2196 call assert_equal([''], getline(1,'$'))
2197
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002198 " clean up
2199 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002200endfunc
Bram Moolenaarc4a908e2016-09-08 23:35:30 +02002201
2202func! Test_normal47_visual_buf_wipe()
2203 " This was causing a crash or ml_get error.
2204 enew!
2205 call setline(1,'xxx')
2206 normal $
2207 new
2208 call setline(1, range(1,2))
2209 2
2210 exe "norm \<C-V>$"
2211 bw!
2212 norm yp
2213 set nomodified
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002214endfunc
2215
2216func! Test_normal47_autocmd()
2217 " disabled, does not seem to be possible currently
2218 throw "Skipped: not possible to test cursorhold autocmd while waiting for input in normal_cmd"
2219 new
2220 call append(0, repeat('-',20))
2221 au CursorHold * call feedkeys('2l', '')
2222 1
2223 set updatetime=20
2224 " should delete 12 chars (d12l)
2225 call feedkeys('d1', '!')
2226 call assert_equal('--------', getline(1))
2227
2228 " clean up
2229 au! CursorHold
2230 set updatetime=4000
2231 bw!
2232endfunc
2233
2234func! Test_normal48_wincmd()
2235 new
2236 exe "norm! \<c-w>c"
2237 call assert_equal(1, winnr('$'))
2238 call assert_fails(":norm! \<c-w>c", "E444")
2239endfunc
2240
2241func! Test_normal49_counts()
2242 new
2243 call setline(1, 'one two three four five six seven eight nine ten')
2244 1
2245 norm! 3d2w
2246 call assert_equal('seven eight nine ten', getline(1))
2247 bw!
2248endfunc
2249
2250func! Test_normal50_commandline()
Bram Moolenaar4033c552017-09-16 20:54:51 +02002251 if !has("timers") || !has("cmdline_hist")
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002252 return
2253 endif
2254 func! DoTimerWork(id)
2255 call assert_equal('[Command Line]', bufname(''))
2256 " should fail, with E11, but does fail with E23?
2257 "call feedkeys("\<c-^>", 'tm')
2258
2259 " should also fail with E11
2260 call assert_fails(":wincmd p", 'E11')
2261 " return from commandline window
2262 call feedkeys("\<cr>")
2263 endfunc
2264
2265 let oldlang=v:lang
2266 lang C
2267 set updatetime=20
2268 call timer_start(100, 'DoTimerWork')
2269 try
2270 " throws E23, for whatever reason...
2271 call feedkeys('q:', 'x!')
2272 catch /E23/
2273 " no-op
2274 endtry
2275 " clean up
2276 set updatetime=4000
2277 exe "lang" oldlang
2278 bw!
2279endfunc
2280
2281func! Test_normal51_FileChangedRO()
2282 if !has("autocmd")
2283 return
2284 endif
Bram Moolenaare5f2a072017-02-01 22:31:49 +01002285 " Don't sleep after the warning message.
2286 call test_settime(1)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002287 call writefile(['foo'], 'Xreadonly.log')
2288 new Xreadonly.log
2289 setl ro
2290 au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix')
2291 call assert_fails(":norm! Af", 'E788')
2292 call assert_equal(['foo'], getline(1,'$'))
2293 call assert_equal('Xreadonly.log', bufname(''))
2294
2295 " cleanup
Bram Moolenaare5f2a072017-02-01 22:31:49 +01002296 call test_settime(0)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002297 bw!
2298 call delete("Xreadonly.log")
2299endfunc
2300
2301func! Test_normal52_rl()
2302 if !has("rightleft")
2303 return
2304 endif
2305 new
2306 call setline(1, 'abcde fghij klmnopq')
2307 norm! 1gg$
2308 set rl
2309 call assert_equal(19, col('.'))
2310 call feedkeys('l', 'tx')
2311 call assert_equal(18, col('.'))
2312 call feedkeys('h', 'tx')
2313 call assert_equal(19, col('.'))
2314 call feedkeys("\<right>", 'tx')
2315 call assert_equal(18, col('.'))
2316 call feedkeys("\<s-right>", 'tx')
2317 call assert_equal(13, col('.'))
2318 call feedkeys("\<c-right>", 'tx')
2319 call assert_equal(7, col('.'))
2320 call feedkeys("\<c-left>", 'tx')
2321 call assert_equal(13, col('.'))
2322 call feedkeys("\<s-left>", 'tx')
2323 call assert_equal(19, col('.'))
2324 call feedkeys("<<", 'tx')
2325 call assert_equal(' abcde fghij klmnopq',getline(1))
2326 call feedkeys(">>", 'tx')
2327 call assert_equal('abcde fghij klmnopq',getline(1))
2328
2329 " cleanup
2330 set norl
2331 bw!
2332endfunc
2333
2334func! Test_normal53_digraph()
2335 if !has('digraphs')
2336 return
2337 endif
2338 new
2339 call setline(1, 'abcdefgh|')
2340 exe "norm! 1gg0f\<c-k>!!"
2341 call assert_equal(9, col('.'))
2342 set cpo+=D
2343 exe "norm! 1gg0f\<c-k>!!"
2344 call assert_equal(1, col('.'))
2345
2346 set cpo-=D
2347 bw!
2348endfunc
2349
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002350func Test_normal54_Ctrl_bsl()
2351 new
2352 call setline(1, 'abcdefghijklmn')
2353 exe "norm! df\<c-\>\<c-n>"
2354 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2355 exe "norm! df\<c-\>\<c-g>"
2356 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2357 exe "norm! df\<c-\>m"
2358 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002359 if !has("multi_byte")
2360 return
2361 endif
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002362 call setline(2, 'abcdefghijklmnāf')
2363 norm! 2gg0
2364 exe "norm! df\<Char-0x101>"
2365 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
2366 norm! 1gg0
2367 exe "norm! df\<esc>"
2368 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002369
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002370 " clean up
2371 bw!
2372endfunc
2373
2374func Test_normal_large_count()
2375 " This may fail with 32bit long, how do we detect that?
2376 new
2377 normal o
2378 normal 6666666666dL
2379 bwipe!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002380endfunc
Bram Moolenaarbf3d5802017-03-29 19:48:11 +02002381
2382func Test_delete_until_paragraph()
2383 if !has('multi_byte')
2384 return
2385 endif
2386 new
2387 normal grádv}
2388 call assert_equal('á', getline(1))
2389 normal grád}
2390 call assert_equal('', getline(1))
2391 bwipe!
2392endfunc