blob: c6df1834a2f6ebf6fcc7f3667bf9012b0e11997d [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
4
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01005func Setup_NewWindow()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02006 10new
7 call setline(1, range(1,100))
8endfunc
9
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010010func MyFormatExpr()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020011 " Adds '->$' at lines having numbers followed by trailing whitespace
12 for ln in range(v:lnum, v:lnum+v:count-1)
13 let line = getline(ln)
14 if getline(ln) =~# '\d\s\+$'
15 call setline(ln, substitute(line, '\s\+$', '', '') . '->$')
16 endif
17 endfor
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020018endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020019
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010020func CountSpaces(type, ...)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020021 " for testing operatorfunc
22 " will count the number of spaces
23 " and return the result in g:a
24 let sel_save = &selection
25 let &selection = "inclusive"
26 let reg_save = @@
27
28 if a:0 " Invoked from Visual mode, use gv command.
29 silent exe "normal! gvy"
30 elseif a:type == 'line'
31 silent exe "normal! '[V']y"
32 else
33 silent exe "normal! `[v`]y"
34 endif
35 let g:a=strlen(substitute(@@, '[^ ]', '', 'g'))
36 let &selection = sel_save
37 let @@ = reg_save
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020038endfunc
39
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010040func OpfuncDummy(type, ...)
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +010041 " for testing operatorfunc
42 let g:opt=&linebreak
43
44 if a:0 " Invoked from Visual mode, use gv command.
45 silent exe "normal! gvy"
46 elseif a:type == 'line'
47 silent exe "normal! '[V']y"
48 else
49 silent exe "normal! `[v`]y"
50 endif
51 " Create a new dummy window
52 new
53 let g:bufnr=bufnr('%')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020054endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020055
56fun! Test_normal00_optrans()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020057 new
58 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
59 1
60 exe "norm! Sfoobar\<esc>"
61 call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$'))
62 2
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020063 exe "norm! $vbsone"
64 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 +020065 norm! VS Second line here
66 call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$'))
67 %d
68 call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line'])
69 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
70
71 1
72 norm! 2D
73 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,'$'))
74 set cpo+=#
75 norm! 4D
76 call assert_equal(['', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
77
78 " clean up
79 set cpo-=#
80 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020081endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020082
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010083func Test_normal01_keymodel()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020084 call Setup_NewWindow()
85 " Test 1: depending on 'keymodel' <s-down> does something different
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020086 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020087 call feedkeys("V\<S-Up>y", 'tx')
88 call assert_equal(['47', '48', '49', '50'], getline("'<", "'>"))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020089 set keymodel=startsel
90 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020091 call feedkeys("V\<S-Up>y", 'tx')
92 call assert_equal(['49', '50'], getline("'<", "'>"))
93 " Start visual mode when keymodel = startsel
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020094 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020095 call feedkeys("\<S-Up>y", 'tx')
96 call assert_equal(['49', '5'], getreg(0, 0, 1))
97 " Do not start visual mode when keymodel=
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020098 set keymodel=
99 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200100 call feedkeys("\<S-Up>y$", 'tx')
101 call assert_equal(['42'], getreg(0, 0, 1))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200102 " Stop visual mode when keymodel=stopsel
103 set keymodel=stopsel
104 50
105 call feedkeys("Vkk\<Up>yy", 'tx')
106 call assert_equal(['47'], getreg(0, 0, 1))
107
108 set keymodel=
109 50
110 call feedkeys("Vkk\<Up>yy", 'tx')
111 call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200112
113 " clean up
114 bw!
115endfunc
116
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100117func Test_normal02_selectmode()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200118 " some basic select mode tests
119 call Setup_NewWindow()
120 50
121 norm! gHy
122 call assert_equal('y51', getline('.'))
123 call setline(1, range(1,100))
124 50
125 exe ":norm! V9jo\<c-g>y"
126 call assert_equal('y60', getline('.'))
127 " clean up
128 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200129endfunc
130
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100131func Test_normal02_selectmode2()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200132 " some basic select mode tests
133 call Setup_NewWindow()
134 50
135 call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx')
136 call assert_equal('c51', getline('.'))
137 " clean up
138 bw!
139endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200140
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100141func Test_normal03_join()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200142 " basic join test
143 call Setup_NewWindow()
144 50
145 norm! VJ
146 call assert_equal('50 51', getline('.'))
147 $
148 norm! J
149 call assert_equal('100', getline('.'))
150 $
151 norm! V9-gJ
152 call assert_equal('919293949596979899100', getline('.'))
153 call setline(1, range(1,100))
154 $
155 :j 10
156 call assert_equal('100', getline('.'))
157 " clean up
158 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200159endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200160
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100161func Test_normal04_filter()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200162 " basic filter test
163 " only test on non windows platform
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100164 if has('win32')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200165 return
166 endif
167 call Setup_NewWindow()
168 1
169 call feedkeys("!!sed -e 's/^/| /'\n", 'tx')
170 call assert_equal('| 1', getline('.'))
171 90
172 :sil :!echo one
173 call feedkeys('.', 'tx')
174 call assert_equal('| 90', getline('.'))
175 95
176 set cpo+=!
177 " 2 <CR>, 1: for executing the command,
178 " 2: clear hit-enter-prompt
179 call feedkeys("!!\n", 'tx')
180 call feedkeys(":!echo one\n\n", 'tx')
181 call feedkeys(".", 'tx')
182 call assert_equal('one', getline('.'))
183 set cpo-=!
184 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200185endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200186
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100187func Test_normal05_formatexpr()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200188 " basic formatexpr test
189 call Setup_NewWindow()
190 %d_
191 call setline(1, ['here: 1 ', '2', 'here: 3 ', '4', 'not here: '])
192 1
193 set formatexpr=MyFormatExpr()
194 norm! gqG
195 call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here: '], getline(1,'$'))
196 set formatexpr=
197 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200198endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200199
Bram Moolenaard77f9d52016-09-04 15:13:39 +0200200func Test_normal05_formatexpr_newbuf()
201 " Edit another buffer in the 'formatexpr' function
202 new
203 func! Format()
204 edit another
205 endfunc
206 set formatexpr=Format()
207 norm gqG
208 bw!
209 set formatexpr=
210endfunc
211
212func Test_normal05_formatexpr_setopt()
213 " Change the 'formatexpr' value in the function
214 new
215 func! Format()
216 set formatexpr=
217 endfunc
218 set formatexpr=Format()
219 norm gqG
220 bw!
221 set formatexpr=
222endfunc
223
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100224func Test_normal06_formatprg()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200225 " basic test for formatprg
226 " only test on non windows platform
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100227 if has('win32')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200228 return
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200229 endif
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100230
231 " uses sed to number non-empty lines
232 call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/ /', '}'''], 'Xsed_format.sh')
233 call system('chmod +x ./Xsed_format.sh')
234 let text = ['a', '', 'c', '', ' ', 'd', 'e']
235 let expected = ['1 a', '', '3 c', '', '5 ', '6 d', '7 e']
236
237 10new
238 call setline(1, text)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200239 set formatprg=./Xsed_format.sh
240 norm! gggqG
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100241 call assert_equal(expected, getline(1, '$'))
242 bw!
243
244 10new
245 call setline(1, text)
246 set formatprg=donothing
247 setlocal formatprg=./Xsed_format.sh
248 norm! gggqG
249 call assert_equal(expected, getline(1, '$'))
250 bw!
251
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200252 " clean up
253 set formatprg=
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100254 setlocal formatprg=
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200255 call delete('Xsed_format.sh')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200256endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200257
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100258func Test_normal07_internalfmt()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200259 " basic test for internal formmatter to textwidth of 12
260 let list=range(1,11)
261 call map(list, 'v:val." "')
262 10new
263 call setline(1, list)
264 set tw=12
265 norm! gggqG
266 call assert_equal(['1 2 3', '4 5 6', '7 8 9', '10 11 '], getline(1, '$'))
267 " clean up
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100268 set tw=0
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200269 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200270endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200271
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100272func Test_normal08_fold()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200273 " basic tests for foldopen/folddelete
274 if !has("folding")
275 return
276 endif
277 call Setup_NewWindow()
278 50
279 setl foldenable fdm=marker
280 " First fold
281 norm! V4jzf
282 " check that folds have been created
283 call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54))
284 " Second fold
285 46
286 norm! V10jzf
287 " check that folds have been created
288 call assert_equal('46/*{{{*/', getline(46))
289 call assert_equal('60/*}}}*/', getline(60))
290 norm! k
291 call assert_equal('45', getline('.'))
292 norm! j
293 call assert_equal('46/*{{{*/', getline('.'))
294 norm! j
295 call assert_equal('61', getline('.'))
296 norm! k
297 " open a fold
298 norm! Vzo
299 norm! k
300 call assert_equal('45', getline('.'))
301 norm! j
302 call assert_equal('46/*{{{*/', getline('.'))
303 norm! j
304 call assert_equal('47', getline('.'))
305 norm! k
306 norm! zcVzO
307 call assert_equal('46/*{{{*/', getline('.'))
308 norm! j
309 call assert_equal('47', getline('.'))
310 norm! j
311 call assert_equal('48', getline('.'))
312 norm! j
313 call assert_equal('49', getline('.'))
314 norm! j
315 call assert_equal('50/*{{{*/', getline('.'))
316 norm! j
317 call assert_equal('51', getline('.'))
318 " delete folds
319 :46
320 " collapse fold
321 norm! V14jzC
322 " delete all folds recursively
323 norm! VzD
324 call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60))
325
326 " clean up
327 setl nofoldenable fdm=marker
328 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200329endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200330
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100331func Test_normal09_operatorfunc()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200332 " Test operatorfunc
333 call Setup_NewWindow()
334 " Add some spaces for counting
335 50,60s/$/ /
336 unlet! g:a
337 let g:a=0
338 nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@
339 vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
340 50
341 norm V2j,,
342 call assert_equal(6, g:a)
343 norm V,,
344 call assert_equal(2, g:a)
345 norm ,,l
346 call assert_equal(0, g:a)
347 50
348 exe "norm 0\<c-v>10j2l,,"
349 call assert_equal(11, g:a)
350 50
351 norm V10j,,
352 call assert_equal(22, g:a)
353
354 " clean up
355 unmap <buffer> ,,
356 set opfunc=
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100357 unlet! g:a
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200358 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200359endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200360
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100361func Test_normal09a_operatorfunc()
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100362 " Test operatorfunc
363 call Setup_NewWindow()
364 " Add some spaces for counting
365 50,60s/$/ /
366 unlet! g:opt
367 set linebreak
368 nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@
369 50
370 norm ,,j
371 exe "bd!" g:bufnr
372 call assert_true(&linebreak)
373 call assert_equal(g:opt, &linebreak)
374 set nolinebreak
375 norm ,,j
376 exe "bd!" g:bufnr
377 call assert_false(&linebreak)
378 call assert_equal(g:opt, &linebreak)
379
380 " clean up
381 unmap <buffer> ,,
382 set opfunc=
383 bw!
384 unlet! g:opt
385endfunc
386
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100387func Test_normal10_expand()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200388 " Test for expand()
389 10new
390 call setline(1, ['1', 'ifooar,,cbar'])
391 2
392 norm! $
Bram Moolenaar65f08472017-09-10 18:16:20 +0200393 call assert_equal('cbar', expand('<cword>'))
394 call assert_equal('ifooar,,cbar', expand('<cWORD>'))
395
396 call setline(1, ['prx = list[idx];'])
397 1
398 let expected = ['', 'prx', 'prx', 'prx',
399 \ 'list', 'list', 'list', 'list', 'list', 'list', 'list',
400 \ 'idx', 'idx', 'idx', 'idx',
401 \ 'list[idx]',
402 \ '];',
403 \ ]
404 for i in range(1, 16)
405 exe 'norm ' . i . '|'
406 call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i)
407 endfor
408
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100409 if executable('echo')
410 " Test expand(`...`) i.e. backticks command expansion.
411 " MS-Windows has a trailing space.
412 call assert_match('^abcde *$', expand('`echo abcde`'))
413 endif
414
415 " Test expand(`=...`) i.e. backticks expression expansion
416 call assert_equal('5', expand('`=2+3`'))
417
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200418 " clean up
419 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200420endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200421
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100422func Test_normal11_showcmd()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200423 " test for 'showcmd'
424 10new
425 exe "norm! ofoobar\<esc>"
426 call assert_equal(2, line('$'))
427 set showcmd
428 exe "norm! ofoobar2\<esc>"
429 call assert_equal(3, line('$'))
430 exe "norm! VAfoobar3\<esc>"
431 call assert_equal(3, line('$'))
432 exe "norm! 0d3\<del>2l"
433 call assert_equal('obar2foobar3', getline('.'))
434 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200435endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200436
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100437func Test_normal12_nv_error()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200438 " Test for nv_error
439 10new
440 call setline(1, range(1,5))
441 " should not do anything, just beep
442 exe "norm! <c-k>"
443 call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$'))
444 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200445endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200446
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100447func Test_normal13_help()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200448 " Test for F1
449 call assert_equal(1, winnr())
450 call feedkeys("\<f1>", 'txi')
451 call assert_match('help\.txt', bufname('%'))
452 call assert_equal(2, winnr('$'))
453 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200454endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200455
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100456func Test_normal14_page()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200457 " basic test for Ctrl-F and Ctrl-B
458 call Setup_NewWindow()
459 exe "norm! \<c-f>"
460 call assert_equal('9', getline('.'))
461 exe "norm! 2\<c-f>"
462 call assert_equal('25', getline('.'))
463 exe "norm! 2\<c-b>"
464 call assert_equal('18', getline('.'))
465 1
466 set scrolloff=5
467 exe "norm! 2\<c-f>"
468 call assert_equal('21', getline('.'))
469 exe "norm! \<c-b>"
470 call assert_equal('13', getline('.'))
471 1
472 set scrolloff=99
473 exe "norm! \<c-f>"
474 call assert_equal('13', getline('.'))
475 set scrolloff=0
476 100
477 exe "norm! $\<c-b>"
478 call assert_equal('92', getline('.'))
479 call assert_equal([0, 92, 1, 0, 1], getcurpos())
480 100
481 set nostartofline
482 exe "norm! $\<c-b>"
483 call assert_equal('92', getline('.'))
484 call assert_equal([0, 92, 2, 0, 2147483647], getcurpos())
485 " cleanup
486 set startofline
487 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200488endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200489
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100490func Test_normal14_page_eol()
Bram Moolenaarbc54f3f2016-09-04 14:34:28 +0200491 10new
492 norm oxxxxxxx
493 exe "norm 2\<c-f>"
494 " check with valgrind that cursor is put back in column 1
495 exe "norm 2\<c-b>"
496 bw!
497endfunc
498
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100499func Test_normal15_z_scroll_vert()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200500 " basic test for z commands that scroll the window
501 call Setup_NewWindow()
502 100
503 norm! >>
504 " Test for z<cr>
505 exe "norm! z\<cr>"
506 call assert_equal(' 100', getline('.'))
507 call assert_equal(100, winsaveview()['topline'])
508 call assert_equal([0, 100, 2, 0, 9], getcurpos())
509
510 " Test for zt
511 21
512 norm! >>0zt
513 call assert_equal(' 21', getline('.'))
514 call assert_equal(21, winsaveview()['topline'])
515 call assert_equal([0, 21, 1, 0, 8], getcurpos())
516
517 " Test for zb
518 30
519 norm! >>$ztzb
520 call assert_equal(' 30', getline('.'))
521 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
522 call assert_equal([0, 30, 3, 0, 2147483647], getcurpos())
523
524 " Test for z-
525 1
526 30
527 norm! 0z-
528 call assert_equal(' 30', getline('.'))
529 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
530 call assert_equal([0, 30, 2, 0, 9], getcurpos())
531
532 " Test for z{height}<cr>
533 call assert_equal(10, winheight(0))
534 exe "norm! z12\<cr>"
535 call assert_equal(12, winheight(0))
536 exe "norm! z10\<cr>"
537 call assert_equal(10, winheight(0))
538
539 " Test for z.
540 1
541 21
542 norm! 0z.
543 call assert_equal(' 21', getline('.'))
544 call assert_equal(17, winsaveview()['topline'])
545 call assert_equal([0, 21, 2, 0, 9], getcurpos())
546
547 " Test for zz
548 1
549 21
550 norm! 0zz
551 call assert_equal(' 21', getline('.'))
552 call assert_equal(17, winsaveview()['topline'])
553 call assert_equal([0, 21, 1, 0, 8], getcurpos())
554
555 " Test for z+
556 11
557 norm! zt
558 norm! z+
559 call assert_equal(' 21', getline('.'))
560 call assert_equal(21, winsaveview()['topline'])
561 call assert_equal([0, 21, 2, 0, 9], getcurpos())
562
563 " Test for [count]z+
564 1
565 norm! 21z+
566 call assert_equal(' 21', getline('.'))
567 call assert_equal(21, winsaveview()['topline'])
568 call assert_equal([0, 21, 2, 0, 9], getcurpos())
569
570 " Test for z^
571 norm! 22z+0
572 norm! z^
573 call assert_equal(' 21', getline('.'))
574 call assert_equal(12, winsaveview()['topline'])
575 call assert_equal([0, 21, 2, 0, 9], getcurpos())
576
577 " Test for [count]z^
578 1
579 norm! 30z^
580 call assert_equal(' 21', getline('.'))
581 call assert_equal(12, winsaveview()['topline'])
582 call assert_equal([0, 21, 2, 0, 9], getcurpos())
583
584 " cleanup
585 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200586endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200587
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100588func Test_normal16_z_scroll_hor()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200589 " basic test for z commands that scroll the window
590 10new
591 15vsp
592 set nowrap listchars=
593 let lineA='abcdefghijklmnopqrstuvwxyz'
594 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
595 $put =lineA
596 $put =lineB
597 1d
598
599 " Test for zl
600 1
601 norm! 5zl
602 call assert_equal(lineA, getline('.'))
603 call assert_equal(6, col('.'))
604 call assert_equal(5, winsaveview()['leftcol'])
605 norm! yl
606 call assert_equal('f', @0)
607
608 " Test for zh
609 norm! 2zh
610 call assert_equal(lineA, getline('.'))
611 call assert_equal(6, col('.'))
612 norm! yl
613 call assert_equal('f', @0)
614 call assert_equal(3, winsaveview()['leftcol'])
615
616 " Test for zL
617 norm! zL
618 call assert_equal(11, col('.'))
619 norm! yl
620 call assert_equal('k', @0)
621 call assert_equal(10, winsaveview()['leftcol'])
622 norm! 2zL
623 call assert_equal(25, col('.'))
624 norm! yl
625 call assert_equal('y', @0)
626 call assert_equal(24, winsaveview()['leftcol'])
627
628 " Test for zH
629 norm! 2zH
630 call assert_equal(25, col('.'))
631 call assert_equal(10, winsaveview()['leftcol'])
632 norm! yl
633 call assert_equal('y', @0)
634
635 " Test for zs
636 norm! $zs
637 call assert_equal(26, col('.'))
638 call assert_equal(25, winsaveview()['leftcol'])
639 norm! yl
640 call assert_equal('z', @0)
641
642 " Test for ze
643 norm! ze
644 call assert_equal(26, col('.'))
645 call assert_equal(11, winsaveview()['leftcol'])
646 norm! yl
647 call assert_equal('z', @0)
648
649 " cleanup
650 set wrap listchars=eol:$
651 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200652endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200653
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100654func Test_normal17_z_scroll_hor2()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200655 " basic test for z commands that scroll the window
656 " using 'sidescrolloff' setting
657 10new
658 20vsp
659 set nowrap listchars= sidescrolloff=5
660 let lineA='abcdefghijklmnopqrstuvwxyz'
661 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
662 $put =lineA
663 $put =lineB
664 1d
665
666 " Test for zl
667 1
668 norm! 5zl
669 call assert_equal(lineA, getline('.'))
670 call assert_equal(11, col('.'))
671 call assert_equal(5, winsaveview()['leftcol'])
672 norm! yl
673 call assert_equal('k', @0)
674
675 " Test for zh
676 norm! 2zh
677 call assert_equal(lineA, getline('.'))
678 call assert_equal(11, col('.'))
679 norm! yl
680 call assert_equal('k', @0)
681 call assert_equal(3, winsaveview()['leftcol'])
682
683 " Test for zL
684 norm! 0zL
685 call assert_equal(16, col('.'))
686 norm! yl
687 call assert_equal('p', @0)
688 call assert_equal(10, winsaveview()['leftcol'])
689 norm! 2zL
690 call assert_equal(26, col('.'))
691 norm! yl
692 call assert_equal('z', @0)
693 call assert_equal(15, winsaveview()['leftcol'])
694
695 " Test for zH
696 norm! 2zH
697 call assert_equal(15, col('.'))
698 call assert_equal(0, winsaveview()['leftcol'])
699 norm! yl
700 call assert_equal('o', @0)
701
702 " Test for zs
703 norm! $zs
704 call assert_equal(26, col('.'))
705 call assert_equal(20, winsaveview()['leftcol'])
706 norm! yl
707 call assert_equal('z', @0)
708
709 " Test for ze
710 norm! ze
711 call assert_equal(26, col('.'))
712 call assert_equal(11, winsaveview()['leftcol'])
713 norm! yl
714 call assert_equal('z', @0)
715
716 " cleanup
717 set wrap listchars=eol:$ sidescrolloff=0
718 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200719endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200720
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100721func Test_normal18_z_fold()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200722 " basic tests for foldopen/folddelete
723 if !has("folding")
724 return
725 endif
726 call Setup_NewWindow()
727 50
728 setl foldenable fdm=marker foldlevel=5
729
730 " Test for zF
731 " First fold
732 norm! 4zF
733 " check that folds have been created
734 call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53))
735
736 " Test for zd
737 51
738 norm! 2zF
739 call assert_equal(2, foldlevel('.'))
740 norm! kzd
741 call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53))
742 norm! j
743 call assert_equal(1, foldlevel('.'))
744
745 " Test for zD
746 " also deletes partially selected folds recursively
747 51
748 norm! zF
749 call assert_equal(2, foldlevel('.'))
750 norm! kV2jzD
751 call assert_equal(['50', '51', '52', '53'], getline(50,53))
752
753 " Test for zE
754 85
755 norm! 4zF
756 86
757 norm! 2zF
758 90
759 norm! 4zF
760 call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93))
761 norm! zE
762 call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93))
763
764 " Test for zn
765 50
766 set foldlevel=0
767 norm! 2zF
768 norm! zn
769 norm! k
770 call assert_equal('49', getline('.'))
771 norm! j
772 call assert_equal('50/*{{{*/', getline('.'))
773 norm! j
774 call assert_equal('51/*}}}*/', getline('.'))
775 norm! j
776 call assert_equal('52', getline('.'))
777 call assert_equal(0, &foldenable)
778
779 " Test for zN
780 49
781 norm! zN
782 call assert_equal('49', getline('.'))
783 norm! j
784 call assert_equal('50/*{{{*/', getline('.'))
785 norm! j
786 call assert_equal('52', getline('.'))
787 call assert_equal(1, &foldenable)
788
789 " Test for zi
790 norm! zi
791 call assert_equal(0, &foldenable)
792 norm! zi
793 call assert_equal(1, &foldenable)
794 norm! zi
795 call assert_equal(0, &foldenable)
796 norm! zi
797 call assert_equal(1, &foldenable)
798
799 " Test for za
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('51/*}}}*/', getline('.'))
808 norm! j
809 call assert_equal('52', getline('.'))
810 50
811 norm! za
812 norm! k
813 call assert_equal('49', getline('.'))
814 norm! j
815 call assert_equal('50/*{{{*/', getline('.'))
816 norm! j
817 call assert_equal('52', getline('.'))
818
819 49
820 norm! 5zF
821 norm! k
822 call assert_equal('48', getline('.'))
823 norm! j
824 call assert_equal('49/*{{{*/', getline('.'))
825 norm! j
826 call assert_equal('55', getline('.'))
827 49
828 norm! za
829 call assert_equal('49/*{{{*/', getline('.'))
830 norm! j
831 call assert_equal('50/*{{{*/', getline('.'))
832 norm! j
833 call assert_equal('52', getline('.'))
834 set nofoldenable
835 " close fold and set foldenable
836 norm! za
837 call assert_equal(1, &foldenable)
838
839 50
840 " have to use {count}za to open all folds and make the cursor visible
841 norm! 2za
842 norm! 2k
843 call assert_equal('48', getline('.'))
844 norm! j
845 call assert_equal('49/*{{{*/', getline('.'))
846 norm! j
847 call assert_equal('50/*{{{*/', getline('.'))
848 norm! j
849 call assert_equal('51/*}}}*/', getline('.'))
850 norm! j
851 call assert_equal('52', getline('.'))
852
853 " Test for zA
854 49
855 set foldlevel=0
856 50
857 norm! zA
858 norm! 2k
859 call assert_equal('48', getline('.'))
860 norm! j
861 call assert_equal('49/*{{{*/', getline('.'))
862 norm! j
863 call assert_equal('50/*{{{*/', getline('.'))
864 norm! j
865 call assert_equal('51/*}}}*/', getline('.'))
866 norm! j
867 call assert_equal('52', getline('.'))
868
Bram Moolenaar395b6ba2017-04-07 20:09:51 +0200869 " zA on a opened fold when foldenable is not set
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200870 50
871 set nofoldenable
872 norm! zA
873 call assert_equal(1, &foldenable)
874 norm! k
875 call assert_equal('48', getline('.'))
876 norm! j
877 call assert_equal('49/*{{{*/', getline('.'))
878 norm! j
879 call assert_equal('55', getline('.'))
880
881 " Test for zc
882 norm! zE
883 50
884 norm! 2zF
885 49
886 norm! 5zF
887 set nofoldenable
888 50
889 " There most likely is a bug somewhere:
890 " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ
891 " TODO: Should this only close the inner most fold or both folds?
892 norm! zc
893 call assert_equal(1, &foldenable)
894 norm! k
895 call assert_equal('48', getline('.'))
896 norm! j
897 call assert_equal('49/*{{{*/', getline('.'))
898 norm! j
899 call assert_equal('55', getline('.'))
900 set nofoldenable
901 50
902 norm! Vjzc
903 norm! k
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 zC
911 set nofoldenable
912 50
913 norm! zCk
914 call assert_equal('48', getline('.'))
915 norm! j
916 call assert_equal('49/*{{{*/', getline('.'))
917 norm! j
918 call assert_equal('55', getline('.'))
919
920 " Test for zx
921 " 1) close folds at line 49-54
922 set nofoldenable
923 48
924 norm! zx
925 call assert_equal(1, &foldenable)
926 norm! j
927 call assert_equal('49/*{{{*/', getline('.'))
928 norm! j
929 call assert_equal('55', getline('.'))
930
Bram Moolenaar395b6ba2017-04-07 20:09:51 +0200931 " 2) do not close fold under cursor
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200932 51
933 set nofoldenable
934 norm! zx
935 call assert_equal(1, &foldenable)
936 norm! 3k
937 call assert_equal('48', getline('.'))
938 norm! j
939 call assert_equal('49/*{{{*/', getline('.'))
940 norm! j
941 call assert_equal('50/*{{{*/', getline('.'))
942 norm! j
943 call assert_equal('51/*}}}*/', getline('.'))
944 norm! j
945 call assert_equal('52', getline('.'))
946 norm! j
947 call assert_equal('53', getline('.'))
948 norm! j
949 call assert_equal('54/*}}}*/', getline('.'))
950 norm! j
951 call assert_equal('55', getline('.'))
952
953 " 3) close one level of folds
954 48
955 set nofoldenable
956 set foldlevel=1
957 norm! zx
958 call assert_equal(1, &foldenable)
959 call assert_equal('48', getline('.'))
960 norm! j
961 call assert_equal('49/*{{{*/', getline('.'))
962 norm! j
963 call assert_equal('50/*{{{*/', getline('.'))
964 norm! j
965 call assert_equal('52', getline('.'))
966 norm! j
967 call assert_equal('53', getline('.'))
968 norm! j
969 call assert_equal('54/*}}}*/', getline('.'))
970 norm! j
971 call assert_equal('55', getline('.'))
972
973 " Test for zX
974 " Close all folds
975 set foldlevel=0 nofoldenable
976 50
977 norm! zX
978 call assert_equal(1, &foldenable)
979 norm! k
980 call assert_equal('48', getline('.'))
981 norm! j
982 call assert_equal('49/*{{{*/', getline('.'))
983 norm! j
984 call assert_equal('55', getline('.'))
985
986 " Test for zm
987 50
988 set nofoldenable foldlevel=2
989 norm! zm
990 call assert_equal(1, &foldenable)
991 call assert_equal(1, &foldlevel)
992 norm! zm
993 call assert_equal(0, &foldlevel)
994 norm! zm
995 call assert_equal(0, &foldlevel)
996 norm! k
997 call assert_equal('48', getline('.'))
998 norm! j
999 call assert_equal('49/*{{{*/', getline('.'))
1000 norm! j
1001 call assert_equal('55', getline('.'))
1002
1003 " Test for zM
1004 48
1005 set nofoldenable foldlevel=99
1006 norm! zM
1007 call assert_equal(1, &foldenable)
1008 call assert_equal(0, &foldlevel)
1009 call assert_equal('48', getline('.'))
1010 norm! j
1011 call assert_equal('49/*{{{*/', getline('.'))
1012 norm! j
1013 call assert_equal('55', getline('.'))
1014
1015 " Test for zr
1016 48
1017 set nofoldenable foldlevel=0
1018 norm! zr
1019 call assert_equal(0, &foldenable)
1020 call assert_equal(1, &foldlevel)
1021 set foldlevel=0 foldenable
1022 norm! zr
1023 call assert_equal(1, &foldenable)
1024 call assert_equal(1, &foldlevel)
1025 norm! zr
1026 call assert_equal(2, &foldlevel)
1027 call assert_equal('48', getline('.'))
1028 norm! j
1029 call assert_equal('49/*{{{*/', getline('.'))
1030 norm! j
1031 call assert_equal('50/*{{{*/', getline('.'))
1032 norm! j
1033 call assert_equal('51/*}}}*/', getline('.'))
1034 norm! j
1035 call assert_equal('52', getline('.'))
1036
1037 " Test for zR
1038 48
1039 set nofoldenable foldlevel=0
1040 norm! zR
1041 call assert_equal(0, &foldenable)
1042 call assert_equal(2, &foldlevel)
1043 set foldenable foldlevel=0
1044 norm! zR
1045 call assert_equal(1, &foldenable)
1046 call assert_equal(2, &foldlevel)
1047 call assert_equal('48', getline('.'))
1048 norm! j
1049 call assert_equal('49/*{{{*/', getline('.'))
1050 norm! j
1051 call assert_equal('50/*{{{*/', getline('.'))
1052 norm! j
1053 call assert_equal('51/*}}}*/', getline('.'))
1054 norm! j
1055 call assert_equal('52', getline('.'))
1056 call append(50, ['a /*{{{*/', 'b /*}}}*/'])
1057 48
1058 call assert_equal('48', getline('.'))
1059 norm! j
1060 call assert_equal('49/*{{{*/', getline('.'))
1061 norm! j
1062 call assert_equal('50/*{{{*/', getline('.'))
1063 norm! j
1064 call assert_equal('a /*{{{*/', getline('.'))
1065 norm! j
1066 call assert_equal('51/*}}}*/', getline('.'))
1067 norm! j
1068 call assert_equal('52', getline('.'))
1069 48
1070 norm! zR
1071 call assert_equal(1, &foldenable)
1072 call assert_equal(3, &foldlevel)
1073 call assert_equal('48', getline('.'))
1074 norm! j
1075 call assert_equal('49/*{{{*/', getline('.'))
1076 norm! j
1077 call assert_equal('50/*{{{*/', getline('.'))
1078 norm! j
1079 call assert_equal('a /*{{{*/', getline('.'))
1080 norm! j
1081 call assert_equal('b /*}}}*/', getline('.'))
1082 norm! j
1083 call assert_equal('51/*}}}*/', getline('.'))
1084 norm! j
1085 call assert_equal('52', getline('.'))
1086
1087 " clean up
1088 setl nofoldenable fdm=marker foldlevel=0
1089 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001090endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001091
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001092func Test_normal20_exmode()
Bram Moolenaar0913a102016-09-03 19:11:59 +02001093 if !has("unix")
1094 " Reading from redirected file doesn't work on MS-Windows
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001095 return
1096 endif
1097 call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript')
1098 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001099 call system(GetVimCommand() .. ' -e -s < Xscript Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001100 let a=readfile('Xfile2')
1101 call assert_equal(['1', 'foo', 'bar', '2'], a)
1102
1103 " clean up
1104 for file in ['Xfile', 'Xfile2', 'Xscript']
1105 call delete(file)
1106 endfor
1107 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001108endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001109
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001110func Test_normal21_nv_hat()
1111
1112 " Edit a fresh file and wipe the buffer list so that there is no alternate
1113 " file present. Next, check for the expected command failures.
1114 edit Xfoo | %bw
1115 call assert_fails(':buffer #', 'E86')
1116 call assert_fails(':execute "normal! \<C-^>"', 'E23')
1117
1118 " Test for the expected behavior when switching between two named buffers.
1119 edit Xfoo | edit Xbar
1120 call feedkeys("\<C-^>", 'tx')
1121 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1122 call feedkeys("\<C-^>", 'tx')
1123 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1124
1125 " Test for the expected behavior when only one buffer is named.
1126 enew | let l:nr = bufnr('%')
1127 call feedkeys("\<C-^>", 'tx')
1128 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1129 call feedkeys("\<C-^>", 'tx')
1130 call assert_equal('', bufname('%'))
1131 call assert_equal(l:nr, bufnr('%'))
1132
1133 " Test that no action is taken by "<C-^>" when an operator is pending.
1134 edit Xfoo
1135 call feedkeys("ci\<C-^>", 'tx')
1136 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1137
1138 %bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001139endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001140
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001141func Test_normal22_zet()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001142 " Test for ZZ
Bram Moolenaar0913a102016-09-03 19:11:59 +02001143 " let shell = &shell
1144 " let &shell = 'sh'
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001145 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001146 let args = ' -N -i NONE --noplugins -X --not-a-term'
1147 call system(GetVimCommand() .. args .. ' -c "%d" -c ":norm! ZZ" Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001148 let a = readfile('Xfile')
1149 call assert_equal([], a)
1150 " Test for ZQ
1151 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001152 call system(GetVimCommand() . args . ' -c "%d" -c ":norm! ZQ" Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001153 let a = readfile('Xfile')
1154 call assert_equal(['1', '2'], a)
1155
1156 " clean up
1157 for file in ['Xfile']
1158 call delete(file)
1159 endfor
Bram Moolenaar0913a102016-09-03 19:11:59 +02001160 " let &shell = shell
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001161endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001162
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001163func Test_normal23_K()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001164 " Test for K command
1165 new
Bram Moolenaar426f3752016-11-04 21:22:37 +01001166 call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd'])
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001167 let k = &keywordprg
1168 set keywordprg=:help
1169 1
1170 norm! VK
1171 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1172 call assert_equal('help', &ft)
1173 call assert_match('\*version8.txt\*', getline('.'))
1174 helpclose
1175 norm! 0K
1176 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1177 call assert_equal('help', &ft)
Bram Moolenaarb1c91982018-05-17 17:04:55 +02001178 call assert_match('\*version8\.\d\*', getline('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001179 helpclose
1180
Bram Moolenaar426f3752016-11-04 21:22:37 +01001181 set keywordprg=:new
1182 set iskeyword+=%
1183 set iskeyword+=\|
1184 2
1185 norm! K
1186 call assert_equal('man', fnamemodify(bufname('%'), ':t'))
1187 bwipe!
1188 3
1189 norm! K
1190 call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t'))
1191 bwipe!
Bram Moolenaareb828d02016-11-05 19:54:01 +01001192 if !has('win32')
1193 4
1194 norm! K
1195 call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t'))
1196 bwipe!
1197 endif
Bram Moolenaar426f3752016-11-04 21:22:37 +01001198 set iskeyword-=%
1199 set iskeyword-=\|
1200
Bram Moolenaar0913a102016-09-03 19:11:59 +02001201 " Only expect "man" to work on Unix
1202 if !has("unix")
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001203 let &keywordprg = k
1204 bw!
1205 return
1206 endif
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001207
1208 if has('mac')
1209 " In MacOS, the option for specifying a pager is different
1210 set keywordprg=man\ -P\ cat
1211 else
1212 set keywordprg=man\ --pager=cat
1213 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001214 " Test for using man
1215 2
1216 let a = execute('unsilent norm! K')
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001217 if has('mac')
1218 call assert_match("man -P cat 'man'", a)
1219 else
1220 call assert_match("man --pager=cat 'man'", a)
1221 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001222
1223 " clean up
1224 let &keywordprg = k
1225 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001226endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001227
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001228func Test_normal24_rot13()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001229 " Testing for g?? g?g?
1230 new
1231 call append(0, 'abcdefghijklmnopqrstuvwxyzäüö')
1232 1
1233 norm! g??
1234 call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.'))
1235 norm! g?g?
1236 call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.'))
1237
1238 " clean up
1239 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001240endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001241
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001242func Test_normal25_tag()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001243 " Testing for CTRL-] g CTRL-] g]
1244 " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-]
1245 h
1246 " Test for CTRL-]
1247 call search('\<x\>$')
1248 exe "norm! \<c-]>"
1249 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1250 norm! yiW
1251 call assert_equal("*x*", @0)
1252 exe ":norm \<c-o>"
1253
1254 " Test for g_CTRL-]
1255 call search('\<v_u\>$')
1256 exe "norm! g\<c-]>"
1257 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1258 norm! yiW
1259 call assert_equal("*v_u*", @0)
1260 exe ":norm \<c-o>"
1261
1262 " Test for g]
1263 call search('\<i_<Esc>$')
1264 let a = execute(":norm! g]")
1265 call assert_match('i_<Esc>.*insert.txt', a)
1266
1267 if !empty(exepath('cscope')) && has('cscope')
1268 " setting cscopetag changes how g] works
1269 set cst
1270 exe "norm! g]"
1271 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1272 norm! yiW
1273 call assert_equal("*i_<Esc>*", @0)
1274 exe ":norm \<c-o>"
1275 " Test for CTRL-W g]
1276 exe "norm! \<C-W>g]"
1277 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1278 norm! yiW
1279 call assert_equal("*i_<Esc>*", @0)
1280 call assert_equal(3, winnr('$'))
1281 helpclose
1282 set nocst
1283 endif
1284
1285 " Test for CTRL-W g]
1286 let a = execute("norm! \<C-W>g]")
1287 call assert_match('i_<Esc>.*insert.txt', a)
1288
1289 " Test for CTRL-W CTRL-]
1290 exe "norm! \<C-W>\<C-]>"
1291 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1292 norm! yiW
1293 call assert_equal("*i_<Esc>*", @0)
1294 call assert_equal(3, winnr('$'))
1295 helpclose
1296
1297 " Test for CTRL-W g CTRL-]
1298 exe "norm! \<C-W>g\<C-]>"
1299 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1300 norm! yiW
1301 call assert_equal("*i_<Esc>*", @0)
1302 call assert_equal(3, winnr('$'))
1303 helpclose
1304
1305 " clean up
1306 helpclose
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001307endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001308
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001309func Test_normal26_put()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001310 " Test for ]p ]P [p and [P
1311 new
1312 call append(0, ['while read LINE', 'do', ' ((count++))', ' if [ $? -ne 0 ]; then', " echo 'Error writing file'", ' fi', 'done'])
1313 1
1314 /Error/y a
1315 2
1316 norm! "a]pj"a[p
1317 call assert_equal(['do', "echo 'Error writing file'", " echo 'Error writing file'", ' ((count++))'], getline(2,5))
1318 1
1319 /^\s\{4}/
1320 exe "norm! \"a]P3Eldt'"
1321 exe "norm! j\"a[P2Eldt'"
1322 call assert_equal([' if [ $? -ne 0 ]; then', " echo 'Error writing'", " echo 'Error'", " echo 'Error writing file'", ' fi'], getline(6,10))
1323
1324 " clean up
1325 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001326endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001327
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001328func Test_normal27_bracket()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001329 " Test for [' [` ]' ]`
1330 call Setup_NewWindow()
1331 1,21s/.\+/ & b/
1332 1
1333 norm! $ma
1334 5
1335 norm! $mb
1336 10
1337 norm! $mc
1338 15
1339 norm! $md
1340 20
1341 norm! $me
1342
1343 " Test for ['
1344 9
1345 norm! 2['
1346 call assert_equal(' 1 b', getline('.'))
1347 call assert_equal(1, line('.'))
1348 call assert_equal(3, col('.'))
1349
1350 " Test for ]'
1351 norm! ]'
1352 call assert_equal(' 5 b', getline('.'))
1353 call assert_equal(5, line('.'))
1354 call assert_equal(3, col('.'))
1355
1356 " No mark after line 21, cursor moves to first non blank on current line
1357 21
1358 norm! $]'
1359 call assert_equal(' 21 b', getline('.'))
1360 call assert_equal(21, line('.'))
1361 call assert_equal(3, col('.'))
1362
1363 " Test for [`
1364 norm! 2[`
1365 call assert_equal(' 15 b', getline('.'))
1366 call assert_equal(15, line('.'))
1367 call assert_equal(8, col('.'))
1368
1369 " Test for ]`
1370 norm! ]`
1371 call assert_equal(' 20 b', getline('.'))
1372 call assert_equal(20, line('.'))
1373 call assert_equal(8, col('.'))
1374
1375 " clean up
1376 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001377endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001378
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001379func Test_normal28_parenthesis()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001380 " basic testing for ( and )
1381 new
1382 call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
1383
1384 $
1385 norm! d(
1386 call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$'))
1387 norm! 2d(
1388 call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$'))
1389 1
1390 norm! 0d)
1391 call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$'))
1392
1393 call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. '])
1394 $
1395 norm! $d(
1396 call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$'))
1397
1398 " clean up
1399 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001400endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001401
1402fun! Test_normal29_brace()
1403 " basic test for { and } movements
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001404 let text =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001405 A paragraph begins after each empty line, and also at each of a set of
1406 paragraph macros, specified by the pairs of characters in the 'paragraphs'
1407 option. The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to
1408 the macros ".IP", ".LP", etc. (These are nroff macros, so the dot must be in
1409 the first column). A section boundary is also a paragraph boundary.
1410 Note that a blank line (only containing white space) is NOT a paragraph
1411 boundary.
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001412
1413
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001414 Also note that this does not include a '{' or '}' in the first column. When
1415 the '{' flag is in 'cpoptions' then '{' in the first column is used as a
1416 paragraph boundary |posix|.
1417 {
1418 This is no paragraph
1419 unless the '{' is set
1420 in 'cpoptions'
1421 }
1422 .IP
1423 The nroff macros IP separates a paragraph
1424 That means, it must be a '.'
1425 followed by IP
1426 .LPIt does not matter, if afterwards some
1427 more characters follow.
1428 .SHAlso section boundaries from the nroff
1429 macros terminate a paragraph. That means
1430 a character like this:
1431 .NH
1432 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001433 [DATA]
1434
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001435 new
1436 call append(0, text)
1437 1
1438 norm! 0d2}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001439
1440 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001441 .IP
1442 The nroff macros IP separates a paragraph
1443 That means, it must be a '.'
1444 followed by IP
1445 .LPIt does not matter, if afterwards some
1446 more characters follow.
1447 .SHAlso section boundaries from the nroff
1448 macros terminate a paragraph. That means
1449 a character like this:
1450 .NH
1451 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001452
1453 [DATA]
1454 call assert_equal(expected, getline(1, '$'))
1455
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001456 norm! 0d}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001457
1458 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001459 .LPIt does not matter, if afterwards some
1460 more characters follow.
1461 .SHAlso section boundaries from the nroff
1462 macros terminate a paragraph. That means
1463 a character like this:
1464 .NH
1465 End of text here
1466
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001467 [DATA]
1468 call assert_equal(expected, getline(1, '$'))
1469
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001470 $
1471 norm! d{
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001472
1473 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001474 .LPIt does not matter, if afterwards some
1475 more characters follow.
1476 .SHAlso section boundaries from the nroff
1477 macros terminate a paragraph. That means
1478 a character like this:
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001479
1480 [DATA]
1481 call assert_equal(expected, getline(1, '$'))
1482
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001483 norm! d{
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001484
1485 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001486 .LPIt does not matter, if afterwards some
1487 more characters follow.
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001488
1489 [DATA]
1490 call assert_equal(expected, getline(1, '$'))
1491
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001492 " Test with { in cpooptions
1493 %d
1494 call append(0, text)
1495 set cpo+={
1496 1
1497 norm! 0d2}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001498
1499 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001500 {
1501 This is no paragraph
1502 unless the '{' is set
1503 in 'cpoptions'
1504 }
1505 .IP
1506 The nroff macros IP separates a paragraph
1507 That means, it must be a '.'
1508 followed by IP
1509 .LPIt does not matter, if afterwards some
1510 more characters follow.
1511 .SHAlso section boundaries from the nroff
1512 macros terminate a paragraph. That means
1513 a character like this:
1514 .NH
1515 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001516
1517 [DATA]
1518 call assert_equal(expected, getline(1, '$'))
1519
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001520 $
1521 norm! d}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001522
1523 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001524 {
1525 This is no paragraph
1526 unless the '{' is set
1527 in 'cpoptions'
1528 }
1529 .IP
1530 The nroff macros IP separates a paragraph
1531 That means, it must be a '.'
1532 followed by IP
1533 .LPIt does not matter, if afterwards some
1534 more characters follow.
1535 .SHAlso section boundaries from the nroff
1536 macros terminate a paragraph. That means
1537 a character like this:
1538 .NH
1539 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001540
1541 [DATA]
1542 call assert_equal(expected, getline(1, '$'))
1543
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001544 norm! gg}
1545 norm! d5}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001546
1547 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001548 {
1549 This is no paragraph
1550 unless the '{' is set
1551 in 'cpoptions'
1552 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001553
1554 [DATA]
1555 call assert_equal(expected, getline(1, '$'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001556
1557 " clean up
1558 set cpo-={
1559 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001560endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001561
1562fun! Test_normal30_changecase()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001563 new
1564 call append(0, 'This is a simple test: äüöß')
1565 norm! 1ggVu
1566 call assert_equal('this is a simple test: äüöß', getline('.'))
1567 norm! VU
1568 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1569 norm! guu
1570 call assert_equal('this is a simple test: äüöss', getline('.'))
1571 norm! gUgU
1572 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1573 norm! gugu
1574 call assert_equal('this is a simple test: äüöss', getline('.'))
1575 norm! gUU
1576 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1577 norm! 010~
1578 call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.'))
1579 norm! V~
1580 call assert_equal('THIS IS A simple test: äüöss', getline('.'))
1581
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001582 " Turkish ASCII turns to multi-byte. On some systems Turkish locale
1583 " is available but toupper()/tolower() don't do the right thing.
1584 try
1585 lang tr_TR.UTF-8
1586 set casemap=
1587 let iupper = toupper('i')
1588 if iupper == "\u0130"
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02001589 call setline(1, 'iI')
1590 1normal gUU
1591 call assert_equal("\u0130I", getline(1))
1592 call assert_equal("\u0130I", toupper("iI"))
Bram Moolenaar3317d5e2017-04-08 19:12:06 +02001593
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02001594 call setline(1, 'iI')
1595 1normal guu
1596 call assert_equal("i\u0131", getline(1))
1597 call assert_equal("i\u0131", tolower("iI"))
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001598 elseif iupper == "I"
Bram Moolenaar1cc48202017-04-09 13:41:59 +02001599 call setline(1, 'iI')
1600 1normal gUU
1601 call assert_equal("II", getline(1))
1602 call assert_equal("II", toupper("iI"))
1603
1604 call setline(1, 'iI')
1605 1normal guu
1606 call assert_equal("ii", getline(1))
1607 call assert_equal("ii", tolower("iI"))
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001608 else
1609 call assert_true(false, "expected toupper('i') to be either 'I' or '\u0130'")
1610 endif
1611 set casemap&
1612 call setline(1, 'iI')
1613 1normal gUU
1614 call assert_equal("II", getline(1))
1615 call assert_equal("II", toupper("iI"))
Bram Moolenaar1cc48202017-04-09 13:41:59 +02001616
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001617 call setline(1, 'iI')
1618 1normal guu
1619 call assert_equal("ii", getline(1))
1620 call assert_equal("ii", tolower("iI"))
1621
1622 lang en_US.UTF-8
1623 catch /E197:/
1624 " can't use Turkish locale
1625 throw 'Skipped: Turkish locale not available'
1626 endtry
Bram Moolenaar3317d5e2017-04-08 19:12:06 +02001627
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001628 " clean up
1629 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001630endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001631
1632fun! Test_normal31_r_cmd()
1633 " Test for r command
1634 new
1635 call append(0, 'This is a simple test: abcd')
1636 exe "norm! 1gg$r\<cr>"
1637 call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$'))
1638 exe "norm! 1gg2wlr\<cr>"
1639 call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$'))
1640 exe "norm! 2gg0W5r\<cr>"
1641 call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$'))
1642 set autoindent
1643 call setline(2, ['simple test: abc', ''])
1644 exe "norm! 2gg0W5r\<cr>"
1645 call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$'))
1646 exe "norm! 1ggVr\<cr>"
1647 call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1)))
1648 call setline(1, 'This is a')
1649 exe "norm! 1gg05rf"
1650 call assert_equal('fffffis a', getline(1))
1651
1652 " clean up
1653 set noautoindent
1654 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001655endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001656
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001657func Test_normal32_g_cmd1()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001658 " Test for g*, g#
1659 new
1660 call append(0, ['abc.x_foo', 'x_foobar.abc'])
1661 1
1662 norm! $g*
1663 call assert_equal('x_foo', @/)
1664 call assert_equal('x_foobar.abc', getline('.'))
1665 norm! $g#
1666 call assert_equal('abc', @/)
1667 call assert_equal('abc.x_foo', getline('.'))
1668
1669 " clean up
1670 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001671endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001672
1673fun! Test_normal33_g_cmd2()
1674 if !has("jumplist")
1675 return
1676 endif
1677 " Tests for g cmds
1678 call Setup_NewWindow()
1679 " Test for g`
1680 clearjumps
1681 norm! ma10j
1682 let a=execute(':jumps')
1683 " empty jumplist
1684 call assert_equal('>', a[-1:])
1685 norm! g`a
1686 call assert_equal('>', a[-1:])
1687 call assert_equal(1, line('.'))
1688 call assert_equal('1', getline('.'))
1689
1690 " Test for g; and g,
1691 norm! g;
1692 " there is only one change in the changelist
1693 " currently, when we setup the window
1694 call assert_equal(2, line('.'))
1695 call assert_fails(':norm! g;', 'E662')
1696 call assert_fails(':norm! g,', 'E663')
1697 let &ul=&ul
1698 call append('$', ['a', 'b', 'c', 'd'])
1699 let &ul=&ul
1700 call append('$', ['Z', 'Y', 'X', 'W'])
1701 let a = execute(':changes')
1702 call assert_match('2\s\+0\s\+2', a)
1703 call assert_match('101\s\+0\s\+a', a)
1704 call assert_match('105\s\+0\s\+Z', a)
1705 norm! 3g;
1706 call assert_equal(2, line('.'))
1707 norm! 2g,
1708 call assert_equal(105, line('.'))
1709
1710 " Test for g& - global substitute
1711 %d
1712 call setline(1, range(1,10))
1713 call append('$', ['a', 'b', 'c', 'd'])
1714 $s/\w/&&/g
1715 exe "norm! /[1-8]\<cr>"
1716 norm! g&
1717 call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$'))
1718
1719 " Test for gv
1720 %d
1721 call append('$', repeat(['abcdefgh'], 8))
1722 exe "norm! 2gg02l\<c-v>2j2ly"
1723 call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1))
1724 " in visual mode, gv swaps current and last selected region
1725 exe "norm! G0\<c-v>4k4lgvd"
1726 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$'))
1727 exe "norm! G0\<c-v>4k4ly"
1728 exe "norm! gvood"
1729 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$'))
1730
1731 " Test for gk/gj
1732 %d
1733 15vsp
1734 set wrap listchars= sbr=
1735 let lineA='abcdefghijklmnopqrstuvwxyz'
1736 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
1737 $put =lineA
1738 $put =lineB
1739
1740 norm! 3gg0dgk
1741 call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$'))
1742 set nu
1743 norm! 3gg0gjdgj
1744 call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1745
1746 " Test for gJ
1747 norm! 2gggJ
1748 call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1749 call assert_equal(16, col('.'))
1750 " shouldn't do anything
1751 norm! 10gJ
1752 call assert_equal(1, col('.'))
1753
1754 " Test for g0 g^ gm g$
1755 exe "norm! 2gg0gji "
1756 call assert_equal(['', 'abcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1757 norm! g0yl
1758 call assert_equal(12, col('.'))
1759 call assert_equal(' ', getreg(0))
1760 norm! g$yl
1761 call assert_equal(22, col('.'))
1762 call assert_equal('3', getreg(0))
1763 norm! gmyl
1764 call assert_equal(17, col('.'))
1765 call assert_equal('n', getreg(0))
1766 norm! g^yl
1767 call assert_equal(15, col('.'))
1768 call assert_equal('l', getreg(0))
1769
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001770 " Test for gI
1771 norm! gIfoo
1772 call assert_equal(['', 'fooabcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1773
1774 " Test for gi
1775 wincmd c
1776 %d
1777 set tw=0
1778 call setline(1, ['foobar', 'new line'])
1779 norm! A next word
1780 $put ='third line'
1781 norm! gi another word
1782 call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$'))
1783
1784 " clean up
1785 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001786endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001787
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001788func Test_g_ctrl_g()
Bram Moolenaar05295832018-08-24 22:07:58 +02001789 new
1790
1791 let a = execute(":norm! g\<c-g>")
1792 call assert_equal("\n--No lines in buffer--", a)
1793
1794 call setline(1, ['first line', 'second line'])
1795
1796 " Test g CTRL-g with dos, mac and unix file type.
1797 norm! gojll
1798 set ff=dos
1799 let a = execute(":norm! g\<c-g>")
1800 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 15 of 25", a)
1801
1802 set ff=mac
1803 let a = execute(":norm! g\<c-g>")
1804 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
1805
1806 set ff=unix
1807 let a = execute(":norm! g\<c-g>")
1808 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
1809
1810 " Test g CTRL-g in visual mode (v)
1811 let a = execute(":norm! gojllvlg\<c-g>")
1812 call assert_equal("\nSelected 1 of 2 Lines; 1 of 4 Words; 2 of 23 Bytes", a)
1813
1814 " Test g CTRL-g in visual mode (CTRL-V) with end col > start col
1815 let a = execute(":norm! \<Esc>gojll\<C-V>kllg\<c-g>")
1816 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
1817
1818 " Test g_CTRL-g in visual mode (CTRL-V) with end col < start col
1819 let a = execute(":norm! \<Esc>goll\<C-V>jhhg\<c-g>")
1820 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
1821
1822 " Test g CTRL-g in visual mode (CTRL-V) with end_vcol being MAXCOL
1823 let a = execute(":norm! \<Esc>gojll\<C-V>k$g\<c-g>")
1824 call assert_equal("\nSelected 2 of 2 Lines; 4 of 4 Words; 17 of 23 Bytes", a)
1825
1826 " There should be one byte less with noeol
1827 set bin noeol
1828 let a = execute(":norm! \<Esc>gog\<c-g>")
1829 call assert_equal("\nCol 1 of 10; Line 1 of 2; Word 1 of 4; Char 1 of 23; Byte 1 of 22", a)
1830 set bin & eol&
1831
Bram Moolenaar30276f22019-01-24 17:59:39 +01001832 call setline(1, ['Français', '日本語'])
Bram Moolenaar05295832018-08-24 22:07:58 +02001833
Bram Moolenaar30276f22019-01-24 17:59:39 +01001834 let a = execute(":norm! \<Esc>gojlg\<c-g>")
1835 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 +02001836
Bram Moolenaar30276f22019-01-24 17:59:39 +01001837 let a = execute(":norm! \<Esc>gojvlg\<c-g>")
1838 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 +02001839
Bram Moolenaar30276f22019-01-24 17:59:39 +01001840 let a = execute(":norm! \<Esc>goll\<c-v>jlg\<c-g>")
1841 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 +02001842
Bram Moolenaar30276f22019-01-24 17:59:39 +01001843 set fenc=utf8 bomb
1844 let a = execute(":norm! \<Esc>gojlg\<c-g>")
1845 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 +02001846
Bram Moolenaar30276f22019-01-24 17:59:39 +01001847 set fenc=utf16 bomb
1848 let a = execute(":norm! g\<c-g>")
1849 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 +02001850
Bram Moolenaar30276f22019-01-24 17:59:39 +01001851 set fenc=utf32 bomb
1852 let a = execute(":norm! g\<c-g>")
1853 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 +02001854
Bram Moolenaar30276f22019-01-24 17:59:39 +01001855 set fenc& bomb&
Bram Moolenaar05295832018-08-24 22:07:58 +02001856
1857 set ff&
1858 bwipe!
1859endfunc
1860
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001861fun! Test_normal34_g_cmd3()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001862 " Test for g8
1863 new
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001864 let a=execute(':norm! 1G0g8')
1865 call assert_equal("\nNUL", a)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001866
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001867 call setline(1, 'abcdefghijklmnopqrstuvwxyzäüö')
1868 let a=execute(':norm! 1G$g8')
1869 call assert_equal("\nc3 b6 ", a)
1870
1871 call setline(1, "a\u0302")
1872 let a=execute(':norm! 1G0g8')
1873 call assert_equal("\n61 + cc 82 ", a)
1874
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001875 " clean up
1876 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001877endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001878
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001879func Test_normal_8g8()
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001880 new
1881
1882 " Test 8g8 which finds invalid utf8 at or after the cursor.
1883
1884 " With invalid byte.
1885 call setline(1, "___\xff___")
1886 norm! 1G08g8g
1887 call assert_equal([0, 1, 4, 0, 1], getcurpos())
1888
1889 " With invalid byte before the cursor.
1890 call setline(1, "___\xff___")
1891 norm! 1G$h8g8g
1892 call assert_equal([0, 1, 6, 0, 9], getcurpos())
1893
1894 " With truncated sequence.
1895 call setline(1, "___\xE2\x82___")
1896 norm! 1G08g8g
1897 call assert_equal([0, 1, 4, 0, 1], getcurpos())
1898
1899 " With overlong sequence.
1900 call setline(1, "___\xF0\x82\x82\xAC___")
1901 norm! 1G08g8g
1902 call assert_equal([0, 1, 4, 0, 1], getcurpos())
1903
1904 " With valid utf8.
1905 call setline(1, "café")
1906 norm! 1G08g8
1907 call assert_equal([0, 1, 1, 0, 1], getcurpos())
1908
1909 bw!
1910endfunc
1911
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001912fun! Test_normal35_g_cmd4()
1913 " Test for g<
1914 " Cannot capture its output,
1915 " probably a bug, therefore, test disabled:
Bram Moolenaar31845092016-09-05 22:58:31 +02001916 throw "Skipped: output of g< can't be tested currently"
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001917 echo "a\nb\nc\nd"
1918 let b=execute(':norm! g<')
1919 call assert_true(!empty(b), 'failed `execute(g<)`')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001920endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001921
1922fun! Test_normal36_g_cmd5()
1923 new
1924 call append(0, 'abcdefghijklmnopqrstuvwxyz')
Bram Moolenaar0913a102016-09-03 19:11:59 +02001925 set ff=unix
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001926 " Test for gp gP
1927 call append(1, range(1,10))
1928 1
1929 norm! 1yy
1930 3
1931 norm! gp
1932 call assert_equal([0, 5, 1, 0, 1], getcurpos())
1933 $
1934 norm! gP
1935 call assert_equal([0, 14, 1, 0, 1], getcurpos())
1936
1937 " Test for go
1938 norm! 26go
1939 call assert_equal([0, 1, 26, 0, 26], getcurpos())
1940 norm! 27go
1941 call assert_equal([0, 1, 26, 0, 26], getcurpos())
1942 norm! 28go
1943 call assert_equal([0, 2, 1, 0, 1], getcurpos())
1944 set ff=dos
1945 norm! 29go
1946 call assert_equal([0, 2, 1, 0, 1], getcurpos())
1947 set ff=unix
1948 norm! gg0
1949 norm! 101go
1950 call assert_equal([0, 13, 26, 0, 26], getcurpos())
1951 norm! 103go
1952 call assert_equal([0, 14, 1, 0, 1], getcurpos())
1953 " count > buffer content
1954 norm! 120go
1955 call assert_equal([0, 14, 1, 0, 2147483647], getcurpos())
1956 " clean up
1957 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001958endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001959
1960fun! Test_normal37_g_cmd6()
1961 " basic test for gt and gT
1962 tabnew 1.txt
1963 tabnew 2.txt
1964 tabnew 3.txt
1965 norm! 1gt
1966 call assert_equal(1, tabpagenr())
1967 norm! 3gt
1968 call assert_equal(3, tabpagenr())
1969 norm! 1gT
1970 " count gT goes not to the absolute tabpagenumber
1971 " but, but goes to the count previous tabpagenumber
1972 call assert_equal(2, tabpagenr())
1973 " wrap around
1974 norm! 3gT
1975 call assert_equal(3, tabpagenr())
1976 " gt does not wrap around
1977 norm! 5gt
1978 call assert_equal(3, tabpagenr())
1979
1980 for i in range(3)
1981 tabclose
1982 endfor
1983 " clean up
1984 call assert_fails(':tabclose', 'E784')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001985endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001986
1987fun! Test_normal38_nvhome()
1988 " Test for <Home> and <C-Home> key
1989 new
1990 call setline(1, range(10))
1991 $
1992 setl et sw=2
1993 norm! V10>$
1994 " count is ignored
1995 exe "norm! 10\<home>"
1996 call assert_equal(1, col('.'))
1997 exe "norm! \<home>"
1998 call assert_equal([0, 10, 1, 0, 1], getcurpos())
1999 exe "norm! 5\<c-home>"
2000 call assert_equal([0, 5, 1, 0, 1], getcurpos())
2001 exe "norm! \<c-home>"
2002 call assert_equal([0, 1, 1, 0, 1], getcurpos())
2003
2004 " clean up
2005 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002006endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002007
2008fun! Test_normal39_cw()
2009 " Test for cw and cW on whitespace
2010 " and cpo+=w setting
2011 new
2012 set tw=0
2013 call append(0, 'here are some words')
2014 norm! 1gg0elcwZZZ
2015 call assert_equal('hereZZZare some words', getline('.'))
2016 norm! 1gg0elcWYYY
2017 call assert_equal('hereZZZareYYYsome words', getline('.'))
2018 set cpo+=w
2019 call setline(1, 'here are some words')
2020 norm! 1gg0elcwZZZ
2021 call assert_equal('hereZZZ are some words', getline('.'))
2022 norm! 1gg2elcWYYY
2023 call assert_equal('hereZZZ areYYY some words', getline('.'))
2024 set cpo-=w
2025 norm! 2gg0cwfoo
2026 call assert_equal('foo', getline('.'))
2027
2028 " clean up
2029 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002030endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002031
2032fun! Test_normal40_ctrl_bsl()
2033 " Basic test for CTRL-\ commands
2034 new
2035 call append(0, 'here are some words')
2036 exe "norm! 1gg0a\<C-\>\<C-N>"
2037 call assert_equal('n', mode())
2038 call assert_equal(1, col('.'))
2039 call assert_equal('', visualmode())
2040 exe "norm! 1gg0viw\<C-\>\<C-N>"
2041 call assert_equal('n', mode())
2042 call assert_equal(4, col('.'))
2043 exe "norm! 1gg0a\<C-\>\<C-G>"
2044 call assert_equal('n', mode())
2045 call assert_equal(1, col('.'))
2046 "imap <buffer> , <c-\><c-n>
2047 set im
2048 exe ":norm! \<c-\>\<c-n>dw"
2049 set noim
2050 call assert_equal('are some words', getline(1))
2051 call assert_false(&insertmode)
2052
2053 " clean up
2054 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002055endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002056
2057fun! Test_normal41_insert_reg()
2058 " Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>=
2059 " in insert mode
2060 new
2061 set sts=2 sw=2 ts=8 tw=0
2062 call append(0, ["aaa\tbbb\tccc", '', '', ''])
2063 let a=getline(1)
2064 norm! 2gg0
2065 exe "norm! a\<c-r>=a\<cr>"
2066 norm! 3gg0
2067 exe "norm! a\<c-r>\<c-r>=a\<cr>"
2068 norm! 4gg0
2069 exe "norm! a\<c-r>\<c-o>=a\<cr>"
2070 call assert_equal(['aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', ''], getline(1, '$'))
2071
2072 " clean up
2073 set sts=0 sw=8 ts=8
Bram Moolenaar31845092016-09-05 22:58:31 +02002074 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002075endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002076
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002077func Test_normal42_halfpage()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002078 " basic test for Ctrl-D and Ctrl-U
2079 call Setup_NewWindow()
2080 call assert_equal(5, &scroll)
2081 exe "norm! \<c-d>"
2082 call assert_equal('6', getline('.'))
2083 exe "norm! 2\<c-d>"
2084 call assert_equal('8', getline('.'))
2085 call assert_equal(2, &scroll)
2086 set scroll=5
2087 exe "norm! \<c-u>"
2088 call assert_equal('3', getline('.'))
2089 1
2090 set scrolloff=5
2091 exe "norm! \<c-d>"
2092 call assert_equal('10', getline('.'))
2093 exe "norm! \<c-u>"
2094 call assert_equal('5', getline('.'))
2095 1
2096 set scrolloff=99
2097 exe "norm! \<c-d>"
2098 call assert_equal('10', getline('.'))
2099 set scrolloff=0
2100 100
2101 exe "norm! $\<c-u>"
2102 call assert_equal('95', getline('.'))
2103 call assert_equal([0, 95, 1, 0, 1], getcurpos())
2104 100
2105 set nostartofline
2106 exe "norm! $\<c-u>"
2107 call assert_equal('95', getline('.'))
2108 call assert_equal([0, 95, 2, 0, 2147483647], getcurpos())
2109 " cleanup
2110 set startofline
2111 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002112endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002113
2114fun! Test_normal43_textobject1()
2115 " basic tests for text object aw
2116 new
2117 call append(0, ['foobar,eins,foobar', 'foo,zwei,foo '])
2118 " diw
2119 norm! 1gg0diw
2120 call assert_equal([',eins,foobar', 'foo,zwei,foo ', ''], getline(1,'$'))
2121 " daw
2122 norm! 2ggEdaw
2123 call assert_equal([',eins,foobar', 'foo,zwei,', ''], getline(1, '$'))
2124 %d
2125 call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo "])
2126 " diW
2127 norm! 2ggwd2iW
2128 call assert_equal(['foo eins foobar', 'foo foo ', ''], getline(1,'$'))
2129 " daW
2130 norm! 1ggd2aW
2131 call assert_equal(['foobar', 'foo foo ', ''], getline(1,'$'))
2132
2133 %d
2134 call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo "])
2135 " aw in visual line mode switches to characterwise mode
2136 norm! 2gg$Vawd
2137 call assert_equal(['foo eins foobar', 'foo zwei foo'], getline(1,'$'))
2138 norm! 1gg$Viwd
2139 call assert_equal(['foo eins ', 'foo zwei foo'], getline(1,'$'))
2140
2141 " clean up
2142 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002143endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002144
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002145func Test_normal44_textobjects2()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002146 " basic testing for is and as text objects
2147 new
2148 call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
2149 " Test for dis - does not remove trailing whitespace
2150 norm! 1gg0dis
2151 call assert_equal([' With some sentences!', '', 'Even with a question? And one more. And no sentence here', ''], getline(1,'$'))
2152 " Test for das - removes leading whitespace
2153 norm! 3ggf?ldas
2154 call assert_equal([' With some sentences!', '', 'Even with a question? And no sentence here', ''], getline(1,'$'))
2155 " when used in visual mode, is made characterwise
2156 norm! 3gg$Visy
2157 call assert_equal('v', visualmode())
2158 " reset visualmode()
2159 norm! 3ggVy
2160 norm! 3gg$Vasy
2161 call assert_equal('v', visualmode())
2162 " basic testing for textobjects a< and at
2163 %d
2164 call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>',' </div>', ' '])
2165 " a<
2166 norm! 1gg0da<
2167 call assert_equal([' ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2168 norm! 1pj
2169 call assert_equal([' <div>', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2170 " at
2171 norm! d2at
2172 call assert_equal([' '], getline(1,'$'))
2173 %d
2174 call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>',' </div>', ' '])
2175 " i<
2176 norm! 1gg0di<
2177 call assert_equal(['<> ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2178 norm! 1Pj
2179 call assert_equal(['<div> ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2180 norm! d2it
2181 call assert_equal(['<div></div>',' '], getline(1,'$'))
2182 " basic testing for a[ and i[ text object
2183 %d
2184 call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
2185 norm! 3gg0di[
2186 call assert_equal([' ', '[', ']'], getline(1,'$'))
2187 call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
2188 norm! 3gg0ftd2a[
2189 call assert_equal([' '], getline(1,'$'))
2190 %d
2191 " Test for i" when cursor is in front of a quoted object
2192 call append(0, 'foo "bar"')
2193 norm! 1gg0di"
2194 call assert_equal(['foo ""', ''], getline(1,'$'))
2195
2196 " clean up
2197 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002198endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002199
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002200func Test_normal45_drop()
Bram Moolenaar29495952018-02-12 22:49:00 +01002201 if !has('dnd')
Bram Moolenaarb48e96f2018-02-13 12:26:14 +01002202 " The ~ register does not exist
2203 call assert_beeps('norm! "~')
Bram Moolenaar29495952018-02-12 22:49:00 +01002204 return
2205 endif
2206
2207 " basic test for drag-n-drop
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002208 " unfortunately, without a gui, we can't really test much here,
2209 " so simply test that ~p fails (which uses the drop register)
2210 new
2211 call assert_fails(':norm! "~p', 'E353')
2212 call assert_equal([], getreg('~', 1, 1))
2213 " the ~ register is read only
2214 call assert_fails(':let @~="1"', 'E354')
2215 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002216endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002217
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002218func Test_normal46_ignore()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002219 new
2220 " How to test this?
2221 " let's just for now test, that the buffer
2222 " does not change
2223 call feedkeys("\<c-s>", 't')
2224 call assert_equal([''], getline(1,'$'))
2225
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002226 " no valid commands
2227 exe "norm! \<char-0x100>"
2228 call assert_equal([''], getline(1,'$'))
2229
2230 exe "norm! ä"
2231 call assert_equal([''], getline(1,'$'))
2232
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002233 " clean up
2234 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002235endfunc
Bram Moolenaarc4a908e2016-09-08 23:35:30 +02002236
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002237func Test_normal47_visual_buf_wipe()
Bram Moolenaarc4a908e2016-09-08 23:35:30 +02002238 " This was causing a crash or ml_get error.
2239 enew!
2240 call setline(1,'xxx')
2241 normal $
2242 new
2243 call setline(1, range(1,2))
2244 2
2245 exe "norm \<C-V>$"
2246 bw!
2247 norm yp
2248 set nomodified
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002249endfunc
2250
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002251func Test_normal47_autocmd()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002252 " disabled, does not seem to be possible currently
2253 throw "Skipped: not possible to test cursorhold autocmd while waiting for input in normal_cmd"
2254 new
2255 call append(0, repeat('-',20))
2256 au CursorHold * call feedkeys('2l', '')
2257 1
2258 set updatetime=20
2259 " should delete 12 chars (d12l)
2260 call feedkeys('d1', '!')
2261 call assert_equal('--------', getline(1))
2262
2263 " clean up
2264 au! CursorHold
2265 set updatetime=4000
2266 bw!
2267endfunc
2268
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002269func Test_normal48_wincmd()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002270 new
2271 exe "norm! \<c-w>c"
2272 call assert_equal(1, winnr('$'))
2273 call assert_fails(":norm! \<c-w>c", "E444")
2274endfunc
2275
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002276func Test_normal49_counts()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002277 new
2278 call setline(1, 'one two three four five six seven eight nine ten')
2279 1
2280 norm! 3d2w
2281 call assert_equal('seven eight nine ten', getline(1))
2282 bw!
2283endfunc
2284
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002285func Test_normal50_commandline()
Bram Moolenaar4033c552017-09-16 20:54:51 +02002286 if !has("timers") || !has("cmdline_hist")
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002287 return
2288 endif
2289 func! DoTimerWork(id)
2290 call assert_equal('[Command Line]', bufname(''))
2291 " should fail, with E11, but does fail with E23?
2292 "call feedkeys("\<c-^>", 'tm')
2293
2294 " should also fail with E11
2295 call assert_fails(":wincmd p", 'E11')
2296 " return from commandline window
2297 call feedkeys("\<cr>")
2298 endfunc
2299
2300 let oldlang=v:lang
2301 lang C
2302 set updatetime=20
2303 call timer_start(100, 'DoTimerWork')
2304 try
2305 " throws E23, for whatever reason...
2306 call feedkeys('q:', 'x!')
2307 catch /E23/
2308 " no-op
2309 endtry
2310 " clean up
2311 set updatetime=4000
2312 exe "lang" oldlang
2313 bw!
2314endfunc
2315
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002316func Test_normal51_FileChangedRO()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002317 if !has("autocmd")
2318 return
2319 endif
Bram Moolenaare5f2a072017-02-01 22:31:49 +01002320 " Don't sleep after the warning message.
2321 call test_settime(1)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002322 call writefile(['foo'], 'Xreadonly.log')
2323 new Xreadonly.log
2324 setl ro
2325 au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix')
2326 call assert_fails(":norm! Af", 'E788')
2327 call assert_equal(['foo'], getline(1,'$'))
2328 call assert_equal('Xreadonly.log', bufname(''))
2329
2330 " cleanup
Bram Moolenaare5f2a072017-02-01 22:31:49 +01002331 call test_settime(0)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002332 bw!
2333 call delete("Xreadonly.log")
2334endfunc
2335
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002336func Test_normal52_rl()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002337 if !has("rightleft")
2338 return
2339 endif
2340 new
2341 call setline(1, 'abcde fghij klmnopq')
2342 norm! 1gg$
2343 set rl
2344 call assert_equal(19, col('.'))
2345 call feedkeys('l', 'tx')
2346 call assert_equal(18, col('.'))
2347 call feedkeys('h', 'tx')
2348 call assert_equal(19, col('.'))
2349 call feedkeys("\<right>", 'tx')
2350 call assert_equal(18, col('.'))
2351 call feedkeys("\<s-right>", 'tx')
2352 call assert_equal(13, col('.'))
2353 call feedkeys("\<c-right>", 'tx')
2354 call assert_equal(7, col('.'))
2355 call feedkeys("\<c-left>", 'tx')
2356 call assert_equal(13, col('.'))
2357 call feedkeys("\<s-left>", 'tx')
2358 call assert_equal(19, col('.'))
2359 call feedkeys("<<", 'tx')
2360 call assert_equal(' abcde fghij klmnopq',getline(1))
2361 call feedkeys(">>", 'tx')
2362 call assert_equal('abcde fghij klmnopq',getline(1))
2363
2364 " cleanup
2365 set norl
2366 bw!
2367endfunc
2368
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002369func Test_normal53_digraph()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002370 if !has('digraphs')
2371 return
2372 endif
2373 new
2374 call setline(1, 'abcdefgh|')
2375 exe "norm! 1gg0f\<c-k>!!"
2376 call assert_equal(9, col('.'))
2377 set cpo+=D
2378 exe "norm! 1gg0f\<c-k>!!"
2379 call assert_equal(1, col('.'))
2380
2381 set cpo-=D
2382 bw!
2383endfunc
2384
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002385func Test_normal54_Ctrl_bsl()
2386 new
2387 call setline(1, 'abcdefghijklmn')
2388 exe "norm! df\<c-\>\<c-n>"
2389 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2390 exe "norm! df\<c-\>\<c-g>"
2391 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2392 exe "norm! df\<c-\>m"
2393 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
Bram Moolenaar30276f22019-01-24 17:59:39 +01002394
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002395 call setline(2, 'abcdefghijklmnāf')
2396 norm! 2gg0
2397 exe "norm! df\<Char-0x101>"
2398 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
2399 norm! 1gg0
2400 exe "norm! df\<esc>"
2401 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002402
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002403 " clean up
2404 bw!
2405endfunc
2406
2407func Test_normal_large_count()
2408 " This may fail with 32bit long, how do we detect that?
2409 new
2410 normal o
2411 normal 6666666666dL
2412 bwipe!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002413endfunc
Bram Moolenaarbf3d5802017-03-29 19:48:11 +02002414
2415func Test_delete_until_paragraph()
Bram Moolenaarbf3d5802017-03-29 19:48:11 +02002416 new
2417 normal grádv}
2418 call assert_equal('á', getline(1))
2419 normal grád}
2420 call assert_equal('', getline(1))
2421 bwipe!
2422endfunc
Bram Moolenaarfb094e12017-11-05 20:59:28 +01002423
2424" Test for the gr (virtual replace) command
2425" Test for the bug fixed by 7.4.387
2426func Test_gr_command()
2427 enew!
2428 let save_cpo = &cpo
2429 call append(0, ['First line', 'Second line', 'Third line'])
2430 exe "normal i\<C-G>u"
2431 call cursor(2, 1)
2432 set cpo-=X
2433 normal 4gro
2434 call assert_equal('oooond line', getline(2))
2435 undo
2436 set cpo+=X
2437 normal 4gro
2438 call assert_equal('ooooecond line', getline(2))
2439 let &cpo = save_cpo
2440 enew!
2441endfunc
2442
2443" When splitting a window the changelist position is wrong.
2444" Test the changelist position after splitting a window.
2445" Test for the bug fixed by 7.4.386
2446func Test_changelist()
2447 let save_ul = &ul
2448 enew!
2449 call append('$', ['1', '2'])
2450 exe "normal i\<C-G>u"
2451 exe "normal Gkylpa\<C-G>u"
2452 set ul=100
2453 exe "normal Gylpa\<C-G>u"
2454 set ul=100
2455 normal gg
2456 vsplit
2457 normal g;
2458 call assert_equal([3, 2], [line('.'), col('.')])
2459 normal g;
2460 call assert_equal([2, 2], [line('.'), col('.')])
2461 call assert_fails('normal g;', 'E662:')
2462 %bwipe!
2463 let &ul = save_ul
2464endfunc
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002465
2466func Test_nv_hat_count()
2467 %bwipeout!
2468 let l:nr = bufnr('%') + 1
2469 call assert_fails(':execute "normal! ' . l:nr . '\<C-^>"', 'E92')
2470
2471 edit Xfoo
2472 let l:foo_nr = bufnr('Xfoo')
2473
2474 edit Xbar
2475 let l:bar_nr = bufnr('Xbar')
2476
2477 " Make sure we are not just using the alternate file.
2478 edit Xbaz
2479
2480 call feedkeys(l:foo_nr . "\<C-^>", 'tx')
2481 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
2482
2483 call feedkeys(l:bar_nr . "\<C-^>", 'tx')
2484 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
2485
2486 %bwipeout!
2487endfunc
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002488
2489func Test_message_when_using_ctrl_c()
Bram Moolenaar553e5a52019-03-25 23:16:34 +01002490 " Make sure no buffers are changed.
2491 %bwipe!
2492
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002493 exe "normal \<C-C>"
2494 call assert_match("Type :qa and press <Enter> to exit Vim", Screenline(&lines))
Bram Moolenaar553e5a52019-03-25 23:16:34 +01002495
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002496 new
2497 cal setline(1, 'hi!')
2498 exe "normal \<C-C>"
2499 call assert_match("Type :qa! and press <Enter> to abandon all changes and exit Vim", Screenline(&lines))
Bram Moolenaar553e5a52019-03-25 23:16:34 +01002500
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002501 bwipe!
2502endfunc
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02002503
2504" Test for '[m', ']m', '[M' and ']M'
2505" Jumping to beginning and end of methods in Java-like languages
2506func Test_java_motion()
2507 new
2508 a
2509Piece of Java
2510{
2511 tt m1 {
2512 t1;
2513 } e1
2514
2515 tt m2 {
2516 t2;
2517 } e2
2518
2519 tt m3 {
2520 if (x)
2521 {
2522 t3;
2523 }
2524 } e3
2525}
2526.
2527
2528 normal gg
2529
2530 normal 2]maA
2531 call assert_equal("\ttt m1 {A", getline('.'))
2532 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
2533
2534 normal j]maB
2535 call assert_equal("\ttt m2 {B", getline('.'))
2536 call assert_equal([7, 9, 16], [line('.'), col('.'), virtcol('.')])
2537
2538 normal ]maC
2539 call assert_equal("\ttt m3 {C", getline('.'))
2540 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
2541
2542 normal [maD
2543 call assert_equal("\ttt m3 {DC", getline('.'))
2544 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
2545
2546 normal k2[maE
2547 call assert_equal("\ttt m1 {EA", getline('.'))
2548 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
2549
2550 normal 3[maF
2551 call assert_equal("{F", getline('.'))
2552 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
2553
2554 normal ]MaG
2555 call assert_equal("\t}G e1", getline('.'))
2556 call assert_equal([5, 3, 10], [line('.'), col('.'), virtcol('.')])
2557
2558 normal j2]MaH
2559 call assert_equal("\t}H e3", getline('.'))
2560 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
2561
2562 normal ]M]M
2563 normal aI
2564 call assert_equal("}I", getline('.'))
2565 call assert_equal([17, 2, 2], [line('.'), col('.'), virtcol('.')])
2566
2567 normal 2[MaJ
2568 call assert_equal("\t}JH e3", getline('.'))
2569 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
2570
2571 normal k[MaK
2572 call assert_equal("\t}K e2", getline('.'))
2573 call assert_equal([9, 3, 10], [line('.'), col('.'), virtcol('.')])
2574
2575 normal 3[MaL
2576 call assert_equal("{LF", getline('.'))
2577 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
2578
2579 close!
2580endfunc
Bram Moolenaard5c82342019-07-27 18:44:57 +02002581
2582fun! Test_normal_gdollar_cmd()
2583 if !has("jumplist")
2584 return
2585 endif
2586 " Tests for g cmds
2587 call Setup_NewWindow()
2588 " Make long lines that will wrap
2589 %s/$/\=repeat(' foobar', 10)/
2590 20vsp
2591 set wrap
2592 " Test for g$ with count
2593 norm! gg
2594 norm! 0vg$y
2595 call assert_equal(20, col("'>"))
2596 call assert_equal('1 foobar foobar foob', getreg(0))
2597 norm! gg
2598 norm! 0v4g$y
2599 call assert_equal(72, col("'>"))
2600 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.."\n", getreg(0))
2601 norm! gg
2602 norm! 0v6g$y
2603 call assert_equal(40, col("'>"))
2604 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2605 \ '2 foobar foobar foobar foobar foobar foo', getreg(0))
2606 set nowrap
2607 " clean up
2608 norm! gg
2609 norm! 0vg$y
2610 call assert_equal(20, col("'>"))
2611 call assert_equal('1 foobar foobar foob', getreg(0))
2612 norm! gg
2613 norm! 0v4g$y
2614 call assert_equal(20, col("'>"))
2615 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2616 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2617 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2618 \ '4 foobar foobar foob', getreg(0))
2619 norm! gg
2620 norm! 0v6g$y
2621 call assert_equal(20, col("'>"))
2622 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2623 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2624 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2625 \ '4 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2626 \ '5 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2627 \ '6 foobar foobar foob', getreg(0))
2628 " Move to last line, also down movement is not possible, should still move
2629 " the cursor to the last visible char
2630 norm! G
2631 norm! 0v6g$y
2632 call assert_equal(20, col("'>"))
2633 call assert_equal('100 foobar foobar fo', getreg(0))
2634 bw!
2635endfunc