blob: c2cbc3e1b32dbfccf1abba3876b59d746150ef46 [file] [log] [blame]
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001" Test for various Normal mode commands
2
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01003source shared.vim
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01004source check.vim
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01005
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01006func Setup_NewWindow()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02007 10new
8 call setline(1, range(1,100))
9endfunc
10
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010011func MyFormatExpr()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020012 " Adds '->$' at lines having numbers followed by trailing whitespace
13 for ln in range(v:lnum, v:lnum+v:count-1)
14 let line = getline(ln)
15 if getline(ln) =~# '\d\s\+$'
16 call setline(ln, substitute(line, '\s\+$', '', '') . '->$')
17 endif
18 endfor
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020019endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020020
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010021func CountSpaces(type, ...)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020022 " for testing operatorfunc
23 " will count the number of spaces
24 " and return the result in g:a
25 let sel_save = &selection
26 let &selection = "inclusive"
27 let reg_save = @@
28
29 if a:0 " Invoked from Visual mode, use gv command.
30 silent exe "normal! gvy"
31 elseif a:type == 'line'
32 silent exe "normal! '[V']y"
33 else
34 silent exe "normal! `[v`]y"
35 endif
36 let g:a=strlen(substitute(@@, '[^ ]', '', 'g'))
37 let &selection = sel_save
38 let @@ = reg_save
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020039endfunc
40
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010041func OpfuncDummy(type, ...)
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +010042 " for testing operatorfunc
43 let g:opt=&linebreak
44
45 if a:0 " Invoked from Visual mode, use gv command.
46 silent exe "normal! gvy"
47 elseif a:type == 'line'
48 silent exe "normal! '[V']y"
49 else
50 silent exe "normal! `[v`]y"
51 endif
52 " Create a new dummy window
53 new
54 let g:bufnr=bufnr('%')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020055endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020056
Bram Moolenaar1671f442020-03-10 07:48:13 +010057func Test_normal00_optrans()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020058 new
59 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
60 1
61 exe "norm! Sfoobar\<esc>"
62 call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$'))
63 2
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020064 exe "norm! $vbsone"
65 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 +020066 norm! VS Second line here
67 call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$'))
68 %d
69 call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line'])
70 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
71
72 1
73 norm! 2D
74 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,'$'))
75 set cpo+=#
76 norm! 4D
77 call assert_equal(['', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
78
79 " clean up
80 set cpo-=#
81 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020082endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020083
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010084func Test_normal01_keymodel()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020085 call Setup_NewWindow()
86 " Test 1: depending on 'keymodel' <s-down> does something different
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020087 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020088 call feedkeys("V\<S-Up>y", 'tx')
89 call assert_equal(['47', '48', '49', '50'], getline("'<", "'>"))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020090 set keymodel=startsel
91 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020092 call feedkeys("V\<S-Up>y", 'tx')
93 call assert_equal(['49', '50'], getline("'<", "'>"))
94 " Start visual mode when keymodel = startsel
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020095 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020096 call feedkeys("\<S-Up>y", 'tx')
97 call assert_equal(['49', '5'], getreg(0, 0, 1))
Bram Moolenaar1671f442020-03-10 07:48:13 +010098 " Use the different Shift special keys
99 50
100 call feedkeys("\<S-Right>\<S-Left>\<S-Up>\<S-Down>\<S-Home>\<S-End>y", 'tx')
101 call assert_equal(['50'], getline("'<", "'>"))
102 call assert_equal(['50', ''], getreg(0, 0, 1))
103
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200104 " Do not start visual mode when keymodel=
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200105 set keymodel=
106 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200107 call feedkeys("\<S-Up>y$", 'tx')
108 call assert_equal(['42'], getreg(0, 0, 1))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200109 " Stop visual mode when keymodel=stopsel
110 set keymodel=stopsel
111 50
112 call feedkeys("Vkk\<Up>yy", 'tx')
113 call assert_equal(['47'], getreg(0, 0, 1))
114
115 set keymodel=
116 50
117 call feedkeys("Vkk\<Up>yy", 'tx')
118 call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200119
120 " clean up
121 bw!
122endfunc
123
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100124func Test_normal03_join()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200125 " basic join test
126 call Setup_NewWindow()
127 50
128 norm! VJ
129 call assert_equal('50 51', getline('.'))
130 $
131 norm! J
132 call assert_equal('100', getline('.'))
133 $
134 norm! V9-gJ
135 call assert_equal('919293949596979899100', getline('.'))
136 call setline(1, range(1,100))
137 $
138 :j 10
139 call assert_equal('100', getline('.'))
140 " clean up
141 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200142endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200143
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100144func Test_normal04_filter()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200145 " basic filter test
146 " only test on non windows platform
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100147 if has('win32')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200148 return
149 endif
150 call Setup_NewWindow()
151 1
152 call feedkeys("!!sed -e 's/^/| /'\n", 'tx')
153 call assert_equal('| 1', getline('.'))
154 90
155 :sil :!echo one
156 call feedkeys('.', 'tx')
157 call assert_equal('| 90', getline('.'))
158 95
159 set cpo+=!
160 " 2 <CR>, 1: for executing the command,
161 " 2: clear hit-enter-prompt
162 call feedkeys("!!\n", 'tx')
163 call feedkeys(":!echo one\n\n", 'tx')
164 call feedkeys(".", 'tx')
165 call assert_equal('one', getline('.'))
166 set cpo-=!
167 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200168endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200169
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100170func Test_normal05_formatexpr()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200171 " basic formatexpr test
172 call Setup_NewWindow()
173 %d_
174 call setline(1, ['here: 1 ', '2', 'here: 3 ', '4', 'not here: '])
175 1
176 set formatexpr=MyFormatExpr()
177 norm! gqG
178 call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here: '], getline(1,'$'))
179 set formatexpr=
180 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200181endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200182
Bram Moolenaard77f9d52016-09-04 15:13:39 +0200183func Test_normal05_formatexpr_newbuf()
184 " Edit another buffer in the 'formatexpr' function
185 new
186 func! Format()
187 edit another
188 endfunc
189 set formatexpr=Format()
190 norm gqG
191 bw!
192 set formatexpr=
193endfunc
194
195func Test_normal05_formatexpr_setopt()
196 " Change the 'formatexpr' value in the function
197 new
198 func! Format()
199 set formatexpr=
200 endfunc
201 set formatexpr=Format()
202 norm gqG
203 bw!
204 set formatexpr=
205endfunc
206
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100207func Test_normal06_formatprg()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200208 " basic test for formatprg
209 " only test on non windows platform
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100210 if has('win32')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200211 return
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200212 endif
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100213
214 " uses sed to number non-empty lines
215 call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/ /', '}'''], 'Xsed_format.sh')
216 call system('chmod +x ./Xsed_format.sh')
217 let text = ['a', '', 'c', '', ' ', 'd', 'e']
218 let expected = ['1 a', '', '3 c', '', '5 ', '6 d', '7 e']
219
220 10new
221 call setline(1, text)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200222 set formatprg=./Xsed_format.sh
223 norm! gggqG
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100224 call assert_equal(expected, getline(1, '$'))
225 bw!
226
227 10new
228 call setline(1, text)
229 set formatprg=donothing
230 setlocal formatprg=./Xsed_format.sh
231 norm! gggqG
232 call assert_equal(expected, getline(1, '$'))
233 bw!
234
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200235 " clean up
236 set formatprg=
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100237 setlocal formatprg=
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200238 call delete('Xsed_format.sh')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200239endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200240
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100241func Test_normal07_internalfmt()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200242 " basic test for internal formmatter to textwidth of 12
243 let list=range(1,11)
244 call map(list, 'v:val." "')
245 10new
246 call setline(1, list)
247 set tw=12
248 norm! gggqG
249 call assert_equal(['1 2 3', '4 5 6', '7 8 9', '10 11 '], getline(1, '$'))
250 " clean up
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100251 set tw=0
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200252 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200253endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200254
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100255func Test_normal08_fold()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200256 " basic tests for foldopen/folddelete
257 if !has("folding")
258 return
259 endif
260 call Setup_NewWindow()
261 50
262 setl foldenable fdm=marker
263 " First fold
264 norm! V4jzf
265 " check that folds have been created
266 call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54))
267 " Second fold
268 46
269 norm! V10jzf
270 " check that folds have been created
271 call assert_equal('46/*{{{*/', getline(46))
272 call assert_equal('60/*}}}*/', getline(60))
273 norm! k
274 call assert_equal('45', getline('.'))
275 norm! j
276 call assert_equal('46/*{{{*/', getline('.'))
277 norm! j
278 call assert_equal('61', getline('.'))
279 norm! k
280 " open a fold
281 norm! Vzo
282 norm! k
283 call assert_equal('45', getline('.'))
284 norm! j
285 call assert_equal('46/*{{{*/', getline('.'))
286 norm! j
287 call assert_equal('47', getline('.'))
288 norm! k
289 norm! zcVzO
290 call assert_equal('46/*{{{*/', getline('.'))
291 norm! j
292 call assert_equal('47', getline('.'))
293 norm! j
294 call assert_equal('48', getline('.'))
295 norm! j
296 call assert_equal('49', getline('.'))
297 norm! j
298 call assert_equal('50/*{{{*/', getline('.'))
299 norm! j
300 call assert_equal('51', getline('.'))
301 " delete folds
302 :46
303 " collapse fold
304 norm! V14jzC
305 " delete all folds recursively
306 norm! VzD
307 call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60))
308
309 " clean up
310 setl nofoldenable fdm=marker
311 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200312endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200313
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100314func Test_normal09_operatorfunc()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200315 " Test operatorfunc
316 call Setup_NewWindow()
317 " Add some spaces for counting
318 50,60s/$/ /
319 unlet! g:a
320 let g:a=0
321 nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@
322 vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
323 50
324 norm V2j,,
325 call assert_equal(6, g:a)
326 norm V,,
327 call assert_equal(2, g:a)
328 norm ,,l
329 call assert_equal(0, g:a)
330 50
331 exe "norm 0\<c-v>10j2l,,"
332 call assert_equal(11, g:a)
333 50
334 norm V10j,,
335 call assert_equal(22, g:a)
336
337 " clean up
338 unmap <buffer> ,,
339 set opfunc=
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100340 unlet! g:a
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200341 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200342endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200343
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100344func Test_normal09a_operatorfunc()
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100345 " Test operatorfunc
346 call Setup_NewWindow()
347 " Add some spaces for counting
348 50,60s/$/ /
349 unlet! g:opt
350 set linebreak
351 nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@
352 50
353 norm ,,j
354 exe "bd!" g:bufnr
355 call assert_true(&linebreak)
356 call assert_equal(g:opt, &linebreak)
357 set nolinebreak
358 norm ,,j
359 exe "bd!" g:bufnr
360 call assert_false(&linebreak)
361 call assert_equal(g:opt, &linebreak)
362
363 " clean up
364 unmap <buffer> ,,
365 set opfunc=
366 bw!
367 unlet! g:opt
368endfunc
369
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100370func Test_normal10_expand()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200371 " Test for expand()
372 10new
373 call setline(1, ['1', 'ifooar,,cbar'])
374 2
375 norm! $
Bram Moolenaar65f08472017-09-10 18:16:20 +0200376 call assert_equal('cbar', expand('<cword>'))
377 call assert_equal('ifooar,,cbar', expand('<cWORD>'))
378
379 call setline(1, ['prx = list[idx];'])
380 1
381 let expected = ['', 'prx', 'prx', 'prx',
382 \ 'list', 'list', 'list', 'list', 'list', 'list', 'list',
383 \ 'idx', 'idx', 'idx', 'idx',
384 \ 'list[idx]',
385 \ '];',
386 \ ]
387 for i in range(1, 16)
388 exe 'norm ' . i . '|'
389 call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i)
390 endfor
391
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100392 if executable('echo')
393 " Test expand(`...`) i.e. backticks command expansion.
Bram Moolenaar077ff432019-10-28 00:42:21 +0100394 call assert_equal('abcde', expand('`echo abcde`'))
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100395 endif
396
397 " Test expand(`=...`) i.e. backticks expression expansion
398 call assert_equal('5', expand('`=2+3`'))
Bram Moolenaar8b633132020-03-20 18:20:51 +0100399 call assert_equal('3.14', expand('`=3.14`'))
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100400
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200401 " clean up
402 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200403endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200404
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100405func Test_normal11_showcmd()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200406 " test for 'showcmd'
407 10new
408 exe "norm! ofoobar\<esc>"
409 call assert_equal(2, line('$'))
410 set showcmd
411 exe "norm! ofoobar2\<esc>"
412 call assert_equal(3, line('$'))
413 exe "norm! VAfoobar3\<esc>"
414 call assert_equal(3, line('$'))
415 exe "norm! 0d3\<del>2l"
416 call assert_equal('obar2foobar3', getline('.'))
417 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200418endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200419
Bram Moolenaar1671f442020-03-10 07:48:13 +0100420" Test for nv_error and normal command errors
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100421func Test_normal12_nv_error()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200422 10new
423 call setline(1, range(1,5))
424 " should not do anything, just beep
Bram Moolenaarf5f1e102020-03-08 05:13:15 +0100425 call assert_beeps('exe "norm! <c-k>"')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200426 call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +0100427 call assert_beeps('normal! G2dd')
428 call assert_beeps("normal! g\<C-A>")
429 call assert_beeps("normal! g\<C-X>")
430 call assert_beeps("normal! g\<C-B>")
Bram Moolenaar1671f442020-03-10 07:48:13 +0100431 call assert_beeps("normal! vQ\<Esc>")
432 call assert_beeps("normal! 2[[")
433 call assert_beeps("normal! 2]]")
434 call assert_beeps("normal! 2[]")
435 call assert_beeps("normal! 2][")
436 call assert_beeps("normal! 4[z")
437 call assert_beeps("normal! 4]z")
438 call assert_beeps("normal! 4[c")
439 call assert_beeps("normal! 4]c")
440 call assert_beeps("normal! 200%")
441 call assert_beeps("normal! %")
442 call assert_beeps("normal! 2{")
443 call assert_beeps("normal! 2}")
444 call assert_beeps("normal! r\<Right>")
445 call assert_beeps("normal! 8ry")
446 call assert_beeps('normal! "@')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200447 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200448endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200449
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100450func Test_normal13_help()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200451 " Test for F1
452 call assert_equal(1, winnr())
453 call feedkeys("\<f1>", 'txi')
454 call assert_match('help\.txt', bufname('%'))
455 call assert_equal(2, winnr('$'))
456 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200457endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200458
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100459func Test_normal14_page()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200460 " basic test for Ctrl-F and Ctrl-B
461 call Setup_NewWindow()
462 exe "norm! \<c-f>"
463 call assert_equal('9', getline('.'))
464 exe "norm! 2\<c-f>"
465 call assert_equal('25', getline('.'))
466 exe "norm! 2\<c-b>"
467 call assert_equal('18', getline('.'))
468 1
469 set scrolloff=5
470 exe "norm! 2\<c-f>"
471 call assert_equal('21', getline('.'))
472 exe "norm! \<c-b>"
473 call assert_equal('13', getline('.'))
474 1
475 set scrolloff=99
476 exe "norm! \<c-f>"
477 call assert_equal('13', getline('.'))
478 set scrolloff=0
479 100
480 exe "norm! $\<c-b>"
481 call assert_equal('92', getline('.'))
482 call assert_equal([0, 92, 1, 0, 1], getcurpos())
483 100
484 set nostartofline
485 exe "norm! $\<c-b>"
486 call assert_equal('92', getline('.'))
487 call assert_equal([0, 92, 2, 0, 2147483647], getcurpos())
488 " cleanup
489 set startofline
490 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200491endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200492
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100493func Test_normal14_page_eol()
Bram Moolenaarbc54f3f2016-09-04 14:34:28 +0200494 10new
495 norm oxxxxxxx
496 exe "norm 2\<c-f>"
497 " check with valgrind that cursor is put back in column 1
498 exe "norm 2\<c-b>"
499 bw!
500endfunc
501
Bram Moolenaar1671f442020-03-10 07:48:13 +0100502" Test for errors with z command
503func Test_normal_z_error()
504 call assert_beeps('normal! z2p')
505 call assert_beeps('normal! zp')
506endfunc
507
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100508func Test_normal15_z_scroll_vert()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200509 " basic test for z commands that scroll the window
510 call Setup_NewWindow()
511 100
512 norm! >>
513 " Test for z<cr>
514 exe "norm! z\<cr>"
515 call assert_equal(' 100', getline('.'))
516 call assert_equal(100, winsaveview()['topline'])
517 call assert_equal([0, 100, 2, 0, 9], getcurpos())
518
519 " Test for zt
520 21
521 norm! >>0zt
522 call assert_equal(' 21', getline('.'))
523 call assert_equal(21, winsaveview()['topline'])
524 call assert_equal([0, 21, 1, 0, 8], getcurpos())
525
526 " Test for zb
527 30
528 norm! >>$ztzb
529 call assert_equal(' 30', getline('.'))
530 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
531 call assert_equal([0, 30, 3, 0, 2147483647], getcurpos())
532
533 " Test for z-
534 1
535 30
536 norm! 0z-
537 call assert_equal(' 30', getline('.'))
538 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
539 call assert_equal([0, 30, 2, 0, 9], getcurpos())
540
541 " Test for z{height}<cr>
542 call assert_equal(10, winheight(0))
543 exe "norm! z12\<cr>"
544 call assert_equal(12, winheight(0))
545 exe "norm! z10\<cr>"
546 call assert_equal(10, winheight(0))
547
548 " Test for z.
549 1
550 21
551 norm! 0z.
552 call assert_equal(' 21', getline('.'))
553 call assert_equal(17, winsaveview()['topline'])
554 call assert_equal([0, 21, 2, 0, 9], getcurpos())
555
556 " Test for zz
557 1
558 21
559 norm! 0zz
560 call assert_equal(' 21', getline('.'))
561 call assert_equal(17, winsaveview()['topline'])
562 call assert_equal([0, 21, 1, 0, 8], getcurpos())
563
564 " Test for z+
565 11
566 norm! zt
567 norm! z+
568 call assert_equal(' 21', getline('.'))
569 call assert_equal(21, winsaveview()['topline'])
570 call assert_equal([0, 21, 2, 0, 9], getcurpos())
571
572 " Test for [count]z+
573 1
574 norm! 21z+
575 call assert_equal(' 21', getline('.'))
576 call assert_equal(21, winsaveview()['topline'])
577 call assert_equal([0, 21, 2, 0, 9], getcurpos())
578
579 " Test for z^
580 norm! 22z+0
581 norm! z^
582 call assert_equal(' 21', getline('.'))
583 call assert_equal(12, winsaveview()['topline'])
584 call assert_equal([0, 21, 2, 0, 9], getcurpos())
585
586 " Test for [count]z^
587 1
588 norm! 30z^
589 call assert_equal(' 21', getline('.'))
590 call assert_equal(12, winsaveview()['topline'])
591 call assert_equal([0, 21, 2, 0, 9], getcurpos())
592
593 " cleanup
594 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200595endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200596
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100597func Test_normal16_z_scroll_hor()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200598 " basic test for z commands that scroll the window
599 10new
600 15vsp
601 set nowrap listchars=
602 let lineA='abcdefghijklmnopqrstuvwxyz'
603 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
604 $put =lineA
605 $put =lineB
606 1d
607
Bram Moolenaar1671f442020-03-10 07:48:13 +0100608 " Test for zl and zh with a count
609 norm! 0z10l
610 call assert_equal([11, 1], [col('.'), wincol()])
611 norm! z4h
612 call assert_equal([11, 5], [col('.'), wincol()])
613 normal! 2gg
614
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200615 " Test for zl
616 1
617 norm! 5zl
618 call assert_equal(lineA, getline('.'))
619 call assert_equal(6, col('.'))
620 call assert_equal(5, winsaveview()['leftcol'])
621 norm! yl
622 call assert_equal('f', @0)
623
624 " Test for zh
625 norm! 2zh
626 call assert_equal(lineA, getline('.'))
627 call assert_equal(6, col('.'))
628 norm! yl
629 call assert_equal('f', @0)
630 call assert_equal(3, winsaveview()['leftcol'])
631
632 " Test for zL
633 norm! zL
634 call assert_equal(11, col('.'))
635 norm! yl
636 call assert_equal('k', @0)
637 call assert_equal(10, winsaveview()['leftcol'])
638 norm! 2zL
639 call assert_equal(25, col('.'))
640 norm! yl
641 call assert_equal('y', @0)
642 call assert_equal(24, winsaveview()['leftcol'])
643
644 " Test for zH
645 norm! 2zH
646 call assert_equal(25, col('.'))
647 call assert_equal(10, winsaveview()['leftcol'])
648 norm! yl
649 call assert_equal('y', @0)
650
651 " Test for zs
652 norm! $zs
653 call assert_equal(26, col('.'))
654 call assert_equal(25, winsaveview()['leftcol'])
655 norm! yl
656 call assert_equal('z', @0)
657
658 " Test for ze
659 norm! ze
660 call assert_equal(26, col('.'))
661 call assert_equal(11, winsaveview()['leftcol'])
662 norm! yl
663 call assert_equal('z', @0)
664
665 " cleanup
666 set wrap listchars=eol:$
667 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200668endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200669
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100670func Test_normal17_z_scroll_hor2()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200671 " basic test for z commands that scroll the window
672 " using 'sidescrolloff' setting
673 10new
674 20vsp
675 set nowrap listchars= sidescrolloff=5
676 let lineA='abcdefghijklmnopqrstuvwxyz'
677 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
678 $put =lineA
679 $put =lineB
680 1d
681
682 " Test for zl
683 1
684 norm! 5zl
685 call assert_equal(lineA, getline('.'))
686 call assert_equal(11, col('.'))
687 call assert_equal(5, winsaveview()['leftcol'])
688 norm! yl
689 call assert_equal('k', @0)
690
691 " Test for zh
692 norm! 2zh
693 call assert_equal(lineA, getline('.'))
694 call assert_equal(11, col('.'))
695 norm! yl
696 call assert_equal('k', @0)
697 call assert_equal(3, winsaveview()['leftcol'])
698
699 " Test for zL
700 norm! 0zL
701 call assert_equal(16, col('.'))
702 norm! yl
703 call assert_equal('p', @0)
704 call assert_equal(10, winsaveview()['leftcol'])
705 norm! 2zL
706 call assert_equal(26, col('.'))
707 norm! yl
708 call assert_equal('z', @0)
709 call assert_equal(15, winsaveview()['leftcol'])
710
711 " Test for zH
712 norm! 2zH
713 call assert_equal(15, col('.'))
714 call assert_equal(0, winsaveview()['leftcol'])
715 norm! yl
716 call assert_equal('o', @0)
717
718 " Test for zs
719 norm! $zs
720 call assert_equal(26, col('.'))
721 call assert_equal(20, winsaveview()['leftcol'])
722 norm! yl
723 call assert_equal('z', @0)
724
725 " Test for ze
726 norm! ze
727 call assert_equal(26, col('.'))
728 call assert_equal(11, winsaveview()['leftcol'])
729 norm! yl
730 call assert_equal('z', @0)
731
732 " cleanup
733 set wrap listchars=eol:$ sidescrolloff=0
734 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200735endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200736
Bram Moolenaar1671f442020-03-10 07:48:13 +0100737" Test for H, M and L commands with folds
738func Test_scroll_cmds()
739 15new
740 call setline(1, range(1, 100))
741 exe "normal! 30ggz\<CR>"
742 set foldenable
743 33,36fold
744 40,43fold
745 46,49fold
746 let h = winheight(0)
747 " Top of the screen = 30
748 " Folded lines = 9
749 " Bottom of the screen = 30 + h + 9 - 1
750 normal! 4L
751 call assert_equal(35 + h, line('.'))
752 normal! 4H
753 call assert_equal(33, line('.'))
754 set foldenable&
755 close!
756endfunc
757
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100758func Test_normal18_z_fold()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200759 " basic tests for foldopen/folddelete
760 if !has("folding")
761 return
762 endif
763 call Setup_NewWindow()
764 50
765 setl foldenable fdm=marker foldlevel=5
766
Bram Moolenaar1671f442020-03-10 07:48:13 +0100767 call assert_beeps('normal! zj')
768 call assert_beeps('normal! zk')
769
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200770 " Test for zF
771 " First fold
772 norm! 4zF
773 " check that folds have been created
774 call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53))
775
776 " Test for zd
777 51
778 norm! 2zF
779 call assert_equal(2, foldlevel('.'))
780 norm! kzd
781 call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53))
782 norm! j
783 call assert_equal(1, foldlevel('.'))
784
785 " Test for zD
786 " also deletes partially selected folds recursively
787 51
788 norm! zF
789 call assert_equal(2, foldlevel('.'))
790 norm! kV2jzD
791 call assert_equal(['50', '51', '52', '53'], getline(50,53))
792
793 " Test for zE
794 85
795 norm! 4zF
796 86
797 norm! 2zF
798 90
799 norm! 4zF
800 call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93))
801 norm! zE
802 call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93))
803
804 " Test for zn
805 50
806 set foldlevel=0
807 norm! 2zF
808 norm! zn
809 norm! k
810 call assert_equal('49', getline('.'))
811 norm! j
812 call assert_equal('50/*{{{*/', getline('.'))
813 norm! j
814 call assert_equal('51/*}}}*/', getline('.'))
815 norm! j
816 call assert_equal('52', getline('.'))
817 call assert_equal(0, &foldenable)
818
819 " Test for zN
820 49
821 norm! zN
822 call assert_equal('49', getline('.'))
823 norm! j
824 call assert_equal('50/*{{{*/', getline('.'))
825 norm! j
826 call assert_equal('52', getline('.'))
827 call assert_equal(1, &foldenable)
828
829 " Test for zi
830 norm! zi
831 call assert_equal(0, &foldenable)
832 norm! zi
833 call assert_equal(1, &foldenable)
834 norm! zi
835 call assert_equal(0, &foldenable)
836 norm! zi
837 call assert_equal(1, &foldenable)
838
839 " Test for za
840 50
841 norm! za
842 norm! k
843 call assert_equal('49', getline('.'))
844 norm! j
845 call assert_equal('50/*{{{*/', getline('.'))
846 norm! j
847 call assert_equal('51/*}}}*/', getline('.'))
848 norm! j
849 call assert_equal('52', getline('.'))
850 50
851 norm! za
852 norm! k
853 call assert_equal('49', getline('.'))
854 norm! j
855 call assert_equal('50/*{{{*/', getline('.'))
856 norm! j
857 call assert_equal('52', getline('.'))
858
859 49
860 norm! 5zF
861 norm! k
862 call assert_equal('48', getline('.'))
863 norm! j
864 call assert_equal('49/*{{{*/', getline('.'))
865 norm! j
866 call assert_equal('55', getline('.'))
867 49
868 norm! za
869 call assert_equal('49/*{{{*/', getline('.'))
870 norm! j
871 call assert_equal('50/*{{{*/', getline('.'))
872 norm! j
873 call assert_equal('52', getline('.'))
874 set nofoldenable
875 " close fold and set foldenable
876 norm! za
877 call assert_equal(1, &foldenable)
878
879 50
880 " have to use {count}za to open all folds and make the cursor visible
881 norm! 2za
882 norm! 2k
883 call assert_equal('48', getline('.'))
884 norm! j
885 call assert_equal('49/*{{{*/', getline('.'))
886 norm! j
887 call assert_equal('50/*{{{*/', getline('.'))
888 norm! j
889 call assert_equal('51/*}}}*/', getline('.'))
890 norm! j
891 call assert_equal('52', getline('.'))
892
893 " Test for zA
894 49
895 set foldlevel=0
896 50
897 norm! zA
898 norm! 2k
899 call assert_equal('48', getline('.'))
900 norm! j
901 call assert_equal('49/*{{{*/', getline('.'))
902 norm! j
903 call assert_equal('50/*{{{*/', getline('.'))
904 norm! j
905 call assert_equal('51/*}}}*/', getline('.'))
906 norm! j
907 call assert_equal('52', getline('.'))
908
Bram Moolenaar395b6ba2017-04-07 20:09:51 +0200909 " zA on a opened fold when foldenable is not set
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200910 50
911 set nofoldenable
912 norm! zA
913 call assert_equal(1, &foldenable)
914 norm! k
915 call assert_equal('48', getline('.'))
916 norm! j
917 call assert_equal('49/*{{{*/', getline('.'))
918 norm! j
919 call assert_equal('55', getline('.'))
920
921 " Test for zc
922 norm! zE
923 50
924 norm! 2zF
925 49
926 norm! 5zF
927 set nofoldenable
928 50
929 " There most likely is a bug somewhere:
930 " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ
931 " TODO: Should this only close the inner most fold or both folds?
932 norm! zc
933 call assert_equal(1, &foldenable)
934 norm! k
935 call assert_equal('48', getline('.'))
936 norm! j
937 call assert_equal('49/*{{{*/', getline('.'))
938 norm! j
939 call assert_equal('55', getline('.'))
940 set nofoldenable
941 50
942 norm! Vjzc
943 norm! k
944 call assert_equal('48', getline('.'))
945 norm! j
946 call assert_equal('49/*{{{*/', getline('.'))
947 norm! j
948 call assert_equal('55', getline('.'))
949
950 " Test for zC
951 set nofoldenable
952 50
953 norm! zCk
954 call assert_equal('48', getline('.'))
955 norm! j
956 call assert_equal('49/*{{{*/', getline('.'))
957 norm! j
958 call assert_equal('55', getline('.'))
959
960 " Test for zx
961 " 1) close folds at line 49-54
962 set nofoldenable
963 48
964 norm! zx
965 call assert_equal(1, &foldenable)
966 norm! j
967 call assert_equal('49/*{{{*/', getline('.'))
968 norm! j
969 call assert_equal('55', getline('.'))
970
Bram Moolenaar395b6ba2017-04-07 20:09:51 +0200971 " 2) do not close fold under cursor
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200972 51
973 set nofoldenable
974 norm! zx
975 call assert_equal(1, &foldenable)
976 norm! 3k
977 call assert_equal('48', getline('.'))
978 norm! j
979 call assert_equal('49/*{{{*/', getline('.'))
980 norm! j
981 call assert_equal('50/*{{{*/', getline('.'))
982 norm! j
983 call assert_equal('51/*}}}*/', getline('.'))
984 norm! j
985 call assert_equal('52', getline('.'))
986 norm! j
987 call assert_equal('53', getline('.'))
988 norm! j
989 call assert_equal('54/*}}}*/', getline('.'))
990 norm! j
991 call assert_equal('55', getline('.'))
992
993 " 3) close one level of folds
994 48
995 set nofoldenable
996 set foldlevel=1
997 norm! zx
998 call assert_equal(1, &foldenable)
999 call assert_equal('48', getline('.'))
1000 norm! j
1001 call assert_equal('49/*{{{*/', getline('.'))
1002 norm! j
1003 call assert_equal('50/*{{{*/', getline('.'))
1004 norm! j
1005 call assert_equal('52', getline('.'))
1006 norm! j
1007 call assert_equal('53', getline('.'))
1008 norm! j
1009 call assert_equal('54/*}}}*/', getline('.'))
1010 norm! j
1011 call assert_equal('55', getline('.'))
1012
1013 " Test for zX
1014 " Close all folds
1015 set foldlevel=0 nofoldenable
1016 50
1017 norm! zX
1018 call assert_equal(1, &foldenable)
1019 norm! k
1020 call assert_equal('48', getline('.'))
1021 norm! j
1022 call assert_equal('49/*{{{*/', getline('.'))
1023 norm! j
1024 call assert_equal('55', getline('.'))
1025
1026 " Test for zm
1027 50
1028 set nofoldenable foldlevel=2
1029 norm! zm
1030 call assert_equal(1, &foldenable)
1031 call assert_equal(1, &foldlevel)
1032 norm! zm
1033 call assert_equal(0, &foldlevel)
1034 norm! zm
1035 call assert_equal(0, &foldlevel)
1036 norm! k
1037 call assert_equal('48', getline('.'))
1038 norm! j
1039 call assert_equal('49/*{{{*/', getline('.'))
1040 norm! j
1041 call assert_equal('55', getline('.'))
1042
1043 " Test for zM
1044 48
1045 set nofoldenable foldlevel=99
1046 norm! zM
1047 call assert_equal(1, &foldenable)
1048 call assert_equal(0, &foldlevel)
1049 call assert_equal('48', getline('.'))
1050 norm! j
1051 call assert_equal('49/*{{{*/', getline('.'))
1052 norm! j
1053 call assert_equal('55', getline('.'))
1054
1055 " Test for zr
1056 48
1057 set nofoldenable foldlevel=0
1058 norm! zr
1059 call assert_equal(0, &foldenable)
1060 call assert_equal(1, &foldlevel)
1061 set foldlevel=0 foldenable
1062 norm! zr
1063 call assert_equal(1, &foldenable)
1064 call assert_equal(1, &foldlevel)
1065 norm! zr
1066 call assert_equal(2, &foldlevel)
1067 call assert_equal('48', getline('.'))
1068 norm! j
1069 call assert_equal('49/*{{{*/', getline('.'))
1070 norm! j
1071 call assert_equal('50/*{{{*/', getline('.'))
1072 norm! j
1073 call assert_equal('51/*}}}*/', getline('.'))
1074 norm! j
1075 call assert_equal('52', getline('.'))
1076
1077 " Test for zR
1078 48
1079 set nofoldenable foldlevel=0
1080 norm! zR
1081 call assert_equal(0, &foldenable)
1082 call assert_equal(2, &foldlevel)
1083 set foldenable foldlevel=0
1084 norm! zR
1085 call assert_equal(1, &foldenable)
1086 call assert_equal(2, &foldlevel)
1087 call assert_equal('48', getline('.'))
1088 norm! j
1089 call assert_equal('49/*{{{*/', getline('.'))
1090 norm! j
1091 call assert_equal('50/*{{{*/', getline('.'))
1092 norm! j
1093 call assert_equal('51/*}}}*/', getline('.'))
1094 norm! j
1095 call assert_equal('52', getline('.'))
1096 call append(50, ['a /*{{{*/', 'b /*}}}*/'])
1097 48
1098 call assert_equal('48', getline('.'))
1099 norm! j
1100 call assert_equal('49/*{{{*/', getline('.'))
1101 norm! j
1102 call assert_equal('50/*{{{*/', getline('.'))
1103 norm! j
1104 call assert_equal('a /*{{{*/', getline('.'))
1105 norm! j
1106 call assert_equal('51/*}}}*/', getline('.'))
1107 norm! j
1108 call assert_equal('52', getline('.'))
1109 48
1110 norm! zR
1111 call assert_equal(1, &foldenable)
1112 call assert_equal(3, &foldlevel)
1113 call assert_equal('48', getline('.'))
1114 norm! j
1115 call assert_equal('49/*{{{*/', getline('.'))
1116 norm! j
1117 call assert_equal('50/*{{{*/', getline('.'))
1118 norm! j
1119 call assert_equal('a /*{{{*/', getline('.'))
1120 norm! j
1121 call assert_equal('b /*}}}*/', getline('.'))
1122 norm! j
1123 call assert_equal('51/*}}}*/', getline('.'))
1124 norm! j
1125 call assert_equal('52', getline('.'))
1126
1127 " clean up
1128 setl nofoldenable fdm=marker foldlevel=0
1129 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001130endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001131
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001132func Test_normal20_exmode()
Bram Moolenaar0913a102016-09-03 19:11:59 +02001133 if !has("unix")
1134 " Reading from redirected file doesn't work on MS-Windows
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001135 return
1136 endif
1137 call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript')
1138 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001139 call system(GetVimCommand() .. ' -e -s < Xscript Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001140 let a=readfile('Xfile2')
1141 call assert_equal(['1', 'foo', 'bar', '2'], a)
1142
1143 " clean up
1144 for file in ['Xfile', 'Xfile2', 'Xscript']
1145 call delete(file)
1146 endfor
1147 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001148endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001149
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001150func Test_normal21_nv_hat()
1151
1152 " Edit a fresh file and wipe the buffer list so that there is no alternate
1153 " file present. Next, check for the expected command failures.
1154 edit Xfoo | %bw
1155 call assert_fails(':buffer #', 'E86')
1156 call assert_fails(':execute "normal! \<C-^>"', 'E23')
1157
1158 " Test for the expected behavior when switching between two named buffers.
1159 edit Xfoo | edit Xbar
1160 call feedkeys("\<C-^>", 'tx')
1161 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1162 call feedkeys("\<C-^>", 'tx')
1163 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1164
1165 " Test for the expected behavior when only one buffer is named.
1166 enew | let l:nr = bufnr('%')
1167 call feedkeys("\<C-^>", 'tx')
1168 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1169 call feedkeys("\<C-^>", 'tx')
1170 call assert_equal('', bufname('%'))
1171 call assert_equal(l:nr, bufnr('%'))
1172
1173 " Test that no action is taken by "<C-^>" when an operator is pending.
1174 edit Xfoo
1175 call feedkeys("ci\<C-^>", 'tx')
1176 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1177
1178 %bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001179endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001180
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001181func Test_normal22_zet()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001182 " Test for ZZ
Bram Moolenaar0913a102016-09-03 19:11:59 +02001183 " let shell = &shell
1184 " let &shell = 'sh'
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001185 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001186 let args = ' -N -i NONE --noplugins -X --not-a-term'
1187 call system(GetVimCommand() .. args .. ' -c "%d" -c ":norm! ZZ" Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001188 let a = readfile('Xfile')
1189 call assert_equal([], a)
1190 " Test for ZQ
1191 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001192 call system(GetVimCommand() . args . ' -c "%d" -c ":norm! ZQ" Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001193 let a = readfile('Xfile')
1194 call assert_equal(['1', '2'], a)
1195
Bram Moolenaar1671f442020-03-10 07:48:13 +01001196 " Unsupported Z command
1197 call assert_beeps('normal! ZW')
1198
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001199 " clean up
1200 for file in ['Xfile']
1201 call delete(file)
1202 endfor
Bram Moolenaar0913a102016-09-03 19:11:59 +02001203 " let &shell = shell
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001204endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001205
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001206func Test_normal23_K()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001207 " Test for K command
1208 new
Bram Moolenaar426f3752016-11-04 21:22:37 +01001209 call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd'])
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001210 let k = &keywordprg
1211 set keywordprg=:help
1212 1
1213 norm! VK
1214 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1215 call assert_equal('help', &ft)
1216 call assert_match('\*version8.txt\*', getline('.'))
1217 helpclose
1218 norm! 0K
1219 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1220 call assert_equal('help', &ft)
Bram Moolenaarb1c91982018-05-17 17:04:55 +02001221 call assert_match('\*version8\.\d\*', getline('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001222 helpclose
1223
Bram Moolenaar426f3752016-11-04 21:22:37 +01001224 set keywordprg=:new
1225 set iskeyword+=%
1226 set iskeyword+=\|
1227 2
1228 norm! K
1229 call assert_equal('man', fnamemodify(bufname('%'), ':t'))
1230 bwipe!
1231 3
1232 norm! K
1233 call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t'))
1234 bwipe!
Bram Moolenaareb828d02016-11-05 19:54:01 +01001235 if !has('win32')
1236 4
1237 norm! K
1238 call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t'))
1239 bwipe!
1240 endif
Bram Moolenaar426f3752016-11-04 21:22:37 +01001241 set iskeyword-=%
1242 set iskeyword-=\|
1243
Bram Moolenaar0913a102016-09-03 19:11:59 +02001244 " Only expect "man" to work on Unix
1245 if !has("unix")
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001246 let &keywordprg = k
1247 bw!
1248 return
1249 endif
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001250
Bram Moolenaar9134f1e2019-11-29 20:26:13 +01001251 let not_gnu_man = has('mac') || has('bsd')
1252 if not_gnu_man
Bram Moolenaarc7d2a572019-11-28 21:16:06 +01001253 " In MacOS and BSD, the option for specifying a pager is different
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001254 set keywordprg=man\ -P\ cat
1255 else
1256 set keywordprg=man\ --pager=cat
1257 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001258 " Test for using man
1259 2
1260 let a = execute('unsilent norm! K')
Bram Moolenaar9134f1e2019-11-29 20:26:13 +01001261 if not_gnu_man
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001262 call assert_match("man -P cat 'man'", a)
1263 else
1264 call assert_match("man --pager=cat 'man'", a)
1265 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001266
Bram Moolenaar1671f442020-03-10 07:48:13 +01001267 " Error cases
1268 call setline(1, '#$#')
1269 call assert_fails('normal! ggK', 'E349:')
1270 call setline(1, '---')
1271 call assert_fails('normal! ggv2lK', 'E349:')
1272 call setline(1, ['abc', 'xyz'])
1273 call assert_fails("normal! gg2lv2h\<C-]>", 'E426:')
1274 call assert_beeps("normal! ggVjK")
1275
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001276 " clean up
1277 let &keywordprg = k
1278 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001279endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001280
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001281func Test_normal24_rot13()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001282 " Testing for g?? g?g?
1283 new
1284 call append(0, 'abcdefghijklmnopqrstuvwxyzäüö')
1285 1
1286 norm! g??
1287 call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.'))
1288 norm! g?g?
1289 call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.'))
1290
1291 " clean up
1292 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001293endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001294
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001295func Test_normal25_tag()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01001296 CheckFeature quickfix
1297
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001298 " Testing for CTRL-] g CTRL-] g]
1299 " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-]
1300 h
1301 " Test for CTRL-]
1302 call search('\<x\>$')
1303 exe "norm! \<c-]>"
1304 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1305 norm! yiW
1306 call assert_equal("*x*", @0)
1307 exe ":norm \<c-o>"
1308
1309 " Test for g_CTRL-]
1310 call search('\<v_u\>$')
1311 exe "norm! g\<c-]>"
1312 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1313 norm! yiW
1314 call assert_equal("*v_u*", @0)
1315 exe ":norm \<c-o>"
1316
1317 " Test for g]
1318 call search('\<i_<Esc>$')
1319 let a = execute(":norm! g]")
1320 call assert_match('i_<Esc>.*insert.txt', a)
1321
1322 if !empty(exepath('cscope')) && has('cscope')
1323 " setting cscopetag changes how g] works
1324 set cst
1325 exe "norm! g]"
1326 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1327 norm! yiW
1328 call assert_equal("*i_<Esc>*", @0)
1329 exe ":norm \<c-o>"
1330 " Test for CTRL-W g]
1331 exe "norm! \<C-W>g]"
1332 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1333 norm! yiW
1334 call assert_equal("*i_<Esc>*", @0)
1335 call assert_equal(3, winnr('$'))
1336 helpclose
1337 set nocst
1338 endif
1339
1340 " Test for CTRL-W g]
1341 let a = execute("norm! \<C-W>g]")
1342 call assert_match('i_<Esc>.*insert.txt', a)
1343
1344 " Test for CTRL-W CTRL-]
1345 exe "norm! \<C-W>\<C-]>"
1346 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1347 norm! yiW
1348 call assert_equal("*i_<Esc>*", @0)
1349 call assert_equal(3, winnr('$'))
1350 helpclose
1351
1352 " Test for CTRL-W g CTRL-]
1353 exe "norm! \<C-W>g\<C-]>"
1354 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1355 norm! yiW
1356 call assert_equal("*i_<Esc>*", @0)
1357 call assert_equal(3, winnr('$'))
1358 helpclose
1359
1360 " clean up
1361 helpclose
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001362endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001363
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001364func Test_normal26_put()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001365 " Test for ]p ]P [p and [P
1366 new
1367 call append(0, ['while read LINE', 'do', ' ((count++))', ' if [ $? -ne 0 ]; then', " echo 'Error writing file'", ' fi', 'done'])
1368 1
1369 /Error/y a
1370 2
1371 norm! "a]pj"a[p
1372 call assert_equal(['do', "echo 'Error writing file'", " echo 'Error writing file'", ' ((count++))'], getline(2,5))
1373 1
1374 /^\s\{4}/
1375 exe "norm! \"a]P3Eldt'"
1376 exe "norm! j\"a[P2Eldt'"
1377 call assert_equal([' if [ $? -ne 0 ]; then', " echo 'Error writing'", " echo 'Error'", " echo 'Error writing file'", ' fi'], getline(6,10))
1378
1379 " clean up
1380 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001381endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001382
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001383func Test_normal27_bracket()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001384 " Test for [' [` ]' ]`
1385 call Setup_NewWindow()
1386 1,21s/.\+/ & b/
1387 1
1388 norm! $ma
1389 5
1390 norm! $mb
1391 10
1392 norm! $mc
1393 15
1394 norm! $md
1395 20
1396 norm! $me
1397
1398 " Test for ['
1399 9
1400 norm! 2['
1401 call assert_equal(' 1 b', getline('.'))
1402 call assert_equal(1, line('.'))
1403 call assert_equal(3, col('.'))
1404
1405 " Test for ]'
1406 norm! ]'
1407 call assert_equal(' 5 b', getline('.'))
1408 call assert_equal(5, line('.'))
1409 call assert_equal(3, col('.'))
1410
1411 " No mark after line 21, cursor moves to first non blank on current line
1412 21
1413 norm! $]'
1414 call assert_equal(' 21 b', getline('.'))
1415 call assert_equal(21, line('.'))
1416 call assert_equal(3, col('.'))
1417
1418 " Test for [`
1419 norm! 2[`
1420 call assert_equal(' 15 b', getline('.'))
1421 call assert_equal(15, line('.'))
1422 call assert_equal(8, col('.'))
1423
1424 " Test for ]`
1425 norm! ]`
1426 call assert_equal(' 20 b', getline('.'))
1427 call assert_equal(20, line('.'))
1428 call assert_equal(8, col('.'))
1429
1430 " clean up
1431 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001432endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001433
Bram Moolenaar1671f442020-03-10 07:48:13 +01001434" Test for ( and ) sentence movements
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001435func Test_normal28_parenthesis()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001436 new
1437 call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
1438
1439 $
1440 norm! d(
1441 call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$'))
1442 norm! 2d(
1443 call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$'))
1444 1
1445 norm! 0d)
1446 call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$'))
1447
1448 call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. '])
1449 $
1450 norm! $d(
1451 call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$'))
1452
Bram Moolenaar1671f442020-03-10 07:48:13 +01001453 " It is an error if a next sentence is not found
1454 %d
1455 call setline(1, '.SH')
1456 call assert_beeps('normal )')
1457
1458 " Jumping to a fold should open the fold
1459 call setline(1, ['', '', 'one', 'two', 'three'])
1460 set foldenable
1461 2,$fold
1462 call feedkeys(')', 'xt')
1463 call assert_equal(3, line('.'))
1464 call assert_equal(1, foldlevel('.'))
1465 call assert_equal(-1, foldclosed('.'))
1466 set foldenable&
1467
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001468 " clean up
1469 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001470endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001471
Bram Moolenaar1671f442020-03-10 07:48:13 +01001472" Test for { and } paragraph movements
1473func Test_normal29_brace()
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001474 let text =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001475 A paragraph begins after each empty line, and also at each of a set of
1476 paragraph macros, specified by the pairs of characters in the 'paragraphs'
1477 option. The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to
1478 the macros ".IP", ".LP", etc. (These are nroff macros, so the dot must be in
1479 the first column). A section boundary is also a paragraph boundary.
1480 Note that a blank line (only containing white space) is NOT a paragraph
1481 boundary.
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001482
1483
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001484 Also note that this does not include a '{' or '}' in the first column. When
1485 the '{' flag is in 'cpoptions' then '{' in the first column is used as a
1486 paragraph boundary |posix|.
1487 {
1488 This is no paragraph
1489 unless the '{' is set
1490 in 'cpoptions'
1491 }
1492 .IP
1493 The nroff macros IP separates a paragraph
1494 That means, it must be a '.'
1495 followed by IP
1496 .LPIt does not matter, if afterwards some
1497 more characters follow.
1498 .SHAlso section boundaries from the nroff
1499 macros terminate a paragraph. That means
1500 a character like this:
1501 .NH
1502 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001503 [DATA]
1504
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001505 new
1506 call append(0, text)
1507 1
1508 norm! 0d2}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001509
1510 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001511 .IP
1512 The nroff macros IP separates a paragraph
1513 That means, it must be a '.'
1514 followed by IP
1515 .LPIt does not matter, if afterwards some
1516 more characters follow.
1517 .SHAlso section boundaries from the nroff
1518 macros terminate a paragraph. That means
1519 a character like this:
1520 .NH
1521 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001522
1523 [DATA]
1524 call assert_equal(expected, getline(1, '$'))
1525
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001526 norm! 0d}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001527
1528 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001529 .LPIt does not matter, if afterwards some
1530 more characters follow.
1531 .SHAlso section boundaries from the nroff
1532 macros terminate a paragraph. That means
1533 a character like this:
1534 .NH
1535 End of text here
1536
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001537 [DATA]
1538 call assert_equal(expected, getline(1, '$'))
1539
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001540 $
1541 norm! d{
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001542
1543 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001544 .LPIt does not matter, if afterwards some
1545 more characters follow.
1546 .SHAlso section boundaries from the nroff
1547 macros terminate a paragraph. That means
1548 a character like this:
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001549
1550 [DATA]
1551 call assert_equal(expected, getline(1, '$'))
1552
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001553 norm! d{
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001554
1555 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001556 .LPIt does not matter, if afterwards some
1557 more characters follow.
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001558
1559 [DATA]
1560 call assert_equal(expected, getline(1, '$'))
1561
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001562 " Test with { in cpooptions
1563 %d
1564 call append(0, text)
1565 set cpo+={
1566 1
1567 norm! 0d2}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001568
1569 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001570 {
1571 This is no paragraph
1572 unless the '{' is set
1573 in 'cpoptions'
1574 }
1575 .IP
1576 The nroff macros IP separates a paragraph
1577 That means, it must be a '.'
1578 followed by IP
1579 .LPIt does not matter, if afterwards some
1580 more characters follow.
1581 .SHAlso section boundaries from the nroff
1582 macros terminate a paragraph. That means
1583 a character like this:
1584 .NH
1585 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001586
1587 [DATA]
1588 call assert_equal(expected, getline(1, '$'))
1589
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001590 $
1591 norm! d}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001592
1593 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001594 {
1595 This is no paragraph
1596 unless the '{' is set
1597 in 'cpoptions'
1598 }
1599 .IP
1600 The nroff macros IP separates a paragraph
1601 That means, it must be a '.'
1602 followed by IP
1603 .LPIt does not matter, if afterwards some
1604 more characters follow.
1605 .SHAlso section boundaries from the nroff
1606 macros terminate a paragraph. That means
1607 a character like this:
1608 .NH
1609 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001610
1611 [DATA]
1612 call assert_equal(expected, getline(1, '$'))
1613
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001614 norm! gg}
1615 norm! d5}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001616
1617 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001618 {
1619 This is no paragraph
1620 unless the '{' is set
1621 in 'cpoptions'
1622 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001623
1624 [DATA]
1625 call assert_equal(expected, getline(1, '$'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001626
Bram Moolenaar1671f442020-03-10 07:48:13 +01001627 " Jumping to a fold should open the fold
1628 %d
1629 call setline(1, ['', 'one', 'two', ''])
1630 set foldenable
1631 2,$fold
1632 call feedkeys('}', 'xt')
1633 call assert_equal(4, line('.'))
1634 call assert_equal(1, foldlevel('.'))
1635 call assert_equal(-1, foldclosed('.'))
1636 set foldenable&
1637
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001638 " clean up
1639 set cpo-={
1640 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001641endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001642
Bram Moolenaar1671f442020-03-10 07:48:13 +01001643" Test for ~ command
1644func Test_normal30_changecase()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001645 new
1646 call append(0, 'This is a simple test: äüöß')
1647 norm! 1ggVu
1648 call assert_equal('this is a simple test: äüöß', getline('.'))
1649 norm! VU
1650 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1651 norm! guu
1652 call assert_equal('this is a simple test: äüöss', getline('.'))
1653 norm! gUgU
1654 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1655 norm! gugu
1656 call assert_equal('this is a simple test: äüöss', getline('.'))
1657 norm! gUU
1658 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
1659 norm! 010~
1660 call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.'))
1661 norm! V~
1662 call assert_equal('THIS IS A simple test: äüöss', getline('.'))
1663
Bram Moolenaar1671f442020-03-10 07:48:13 +01001664 " Test for changing case across lines using 'whichwrap'
1665 call setline(1, ['aaaaaa', 'aaaaaa'])
1666 normal! gg10~
1667 call assert_equal(['AAAAAA', 'aaaaaa'], getline(1, 2))
1668 set whichwrap+=~
1669 normal! gg10~
1670 call assert_equal(['aaaaaa', 'AAAAaa'], getline(1, 2))
1671 set whichwrap&
1672
1673 " clean up
1674 bw!
1675endfunc
1676
1677" Turkish ASCII turns to multi-byte. On some systems Turkish locale
1678" is available but toupper()/tolower() don't do the right thing.
1679func Test_normal_changecase_turkish()
1680 new
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001681 try
1682 lang tr_TR.UTF-8
1683 set casemap=
1684 let iupper = toupper('i')
1685 if iupper == "\u0130"
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02001686 call setline(1, 'iI')
1687 1normal gUU
1688 call assert_equal("\u0130I", getline(1))
1689 call assert_equal("\u0130I", toupper("iI"))
Bram Moolenaar3317d5e2017-04-08 19:12:06 +02001690
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02001691 call setline(1, 'iI')
1692 1normal guu
1693 call assert_equal("i\u0131", getline(1))
1694 call assert_equal("i\u0131", tolower("iI"))
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001695 elseif iupper == "I"
Bram Moolenaar1cc48202017-04-09 13:41:59 +02001696 call setline(1, 'iI')
1697 1normal gUU
1698 call assert_equal("II", getline(1))
1699 call assert_equal("II", toupper("iI"))
1700
1701 call setline(1, 'iI')
1702 1normal guu
1703 call assert_equal("ii", getline(1))
1704 call assert_equal("ii", tolower("iI"))
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001705 else
1706 call assert_true(false, "expected toupper('i') to be either 'I' or '\u0130'")
1707 endif
1708 set casemap&
1709 call setline(1, 'iI')
1710 1normal gUU
1711 call assert_equal("II", getline(1))
1712 call assert_equal("II", toupper("iI"))
Bram Moolenaar1cc48202017-04-09 13:41:59 +02001713
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02001714 call setline(1, 'iI')
1715 1normal guu
1716 call assert_equal("ii", getline(1))
1717 call assert_equal("ii", tolower("iI"))
1718
1719 lang en_US.UTF-8
1720 catch /E197:/
1721 " can't use Turkish locale
1722 throw 'Skipped: Turkish locale not available'
1723 endtry
Bram Moolenaar1671f442020-03-10 07:48:13 +01001724 close!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001725endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001726
Bram Moolenaar1671f442020-03-10 07:48:13 +01001727" Test for r (replace) command
1728func Test_normal31_r_cmd()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001729 new
1730 call append(0, 'This is a simple test: abcd')
1731 exe "norm! 1gg$r\<cr>"
1732 call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$'))
1733 exe "norm! 1gg2wlr\<cr>"
1734 call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$'))
1735 exe "norm! 2gg0W5r\<cr>"
1736 call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$'))
1737 set autoindent
1738 call setline(2, ['simple test: abc', ''])
1739 exe "norm! 2gg0W5r\<cr>"
1740 call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$'))
1741 exe "norm! 1ggVr\<cr>"
1742 call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1)))
1743 call setline(1, 'This is a')
1744 exe "norm! 1gg05rf"
1745 call assert_equal('fffffis a', getline(1))
1746
Bram Moolenaar1671f442020-03-10 07:48:13 +01001747 " When replacing characters, copy characters from above and below lines
1748 " using CTRL-Y and CTRL-E.
1749 " Different code paths are used for utf-8 and latin1 encodings
1750 set showmatch
1751 for enc in ['latin1', 'utf-8']
1752 enew!
1753 let &encoding = enc
1754 call setline(1, [' {a}', 'xxxxxxxxxx', ' [b]'])
1755 exe "norm! 2gg5r\<C-Y>l5r\<C-E>"
1756 call assert_equal(' {a}x [b]x', getline(2))
1757 endfor
1758 set showmatch&
1759
1760 " r command should fail in operator pending mode
1761 call assert_beeps('normal! cr')
1762
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001763 " clean up
1764 set noautoindent
1765 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001766endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001767
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001768" Test for g*, g#
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001769func Test_normal32_g_cmd1()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001770 new
1771 call append(0, ['abc.x_foo', 'x_foobar.abc'])
1772 1
1773 norm! $g*
1774 call assert_equal('x_foo', @/)
1775 call assert_equal('x_foobar.abc', getline('.'))
1776 norm! $g#
1777 call assert_equal('abc', @/)
1778 call assert_equal('abc.x_foo', getline('.'))
1779
1780 " clean up
1781 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001782endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001783
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001784" Test for g`, g;, g,, g&, gv, gk, gj, gJ, g0, g^, g_, gm, g$, gM, g CTRL-G,
1785" gi and gI commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01001786func Test_normal33_g_cmd2()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001787 if !has("jumplist")
1788 return
1789 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001790 call Setup_NewWindow()
1791 " Test for g`
1792 clearjumps
1793 norm! ma10j
1794 let a=execute(':jumps')
1795 " empty jumplist
1796 call assert_equal('>', a[-1:])
1797 norm! g`a
1798 call assert_equal('>', a[-1:])
1799 call assert_equal(1, line('.'))
1800 call assert_equal('1', getline('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001801 call cursor(10, 1)
1802 norm! g'a
1803 call assert_equal('>', a[-1:])
1804 call assert_equal(1, line('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001805
1806 " Test for g; and g,
1807 norm! g;
1808 " there is only one change in the changelist
1809 " currently, when we setup the window
1810 call assert_equal(2, line('.'))
1811 call assert_fails(':norm! g;', 'E662')
1812 call assert_fails(':norm! g,', 'E663')
1813 let &ul=&ul
1814 call append('$', ['a', 'b', 'c', 'd'])
1815 let &ul=&ul
1816 call append('$', ['Z', 'Y', 'X', 'W'])
1817 let a = execute(':changes')
1818 call assert_match('2\s\+0\s\+2', a)
1819 call assert_match('101\s\+0\s\+a', a)
1820 call assert_match('105\s\+0\s\+Z', a)
1821 norm! 3g;
1822 call assert_equal(2, line('.'))
1823 norm! 2g,
1824 call assert_equal(105, line('.'))
1825
1826 " Test for g& - global substitute
1827 %d
1828 call setline(1, range(1,10))
1829 call append('$', ['a', 'b', 'c', 'd'])
1830 $s/\w/&&/g
1831 exe "norm! /[1-8]\<cr>"
1832 norm! g&
1833 call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$'))
1834
Bram Moolenaar1671f442020-03-10 07:48:13 +01001835 " Jumping to a fold using gg should open the fold
1836 set foldenable
1837 set foldopen+=jump
1838 5,8fold
1839 call feedkeys('6gg', 'xt')
1840 call assert_equal(1, foldlevel('.'))
1841 call assert_equal(-1, foldclosed('.'))
1842 set foldopen-=jump
1843 set foldenable&
1844
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001845 " Test for gv
1846 %d
1847 call append('$', repeat(['abcdefgh'], 8))
1848 exe "norm! 2gg02l\<c-v>2j2ly"
1849 call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1))
1850 " in visual mode, gv swaps current and last selected region
1851 exe "norm! G0\<c-v>4k4lgvd"
1852 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$'))
1853 exe "norm! G0\<c-v>4k4ly"
1854 exe "norm! gvood"
1855 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001856 " gv cannot be used in operator pending mode
1857 call assert_beeps('normal! cgv')
1858 " gv should beep without a previously selected visual area
1859 new
1860 call assert_beeps('normal! gv')
1861 close
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001862
1863 " Test for gk/gj
1864 %d
1865 15vsp
1866 set wrap listchars= sbr=
1867 let lineA='abcdefghijklmnopqrstuvwxyz'
1868 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
Bram Moolenaar8b530c12019-10-28 02:13:05 +01001869 let lineC='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001870 $put =lineA
1871 $put =lineB
1872
1873 norm! 3gg0dgk
1874 call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$'))
1875 set nu
1876 norm! 3gg0gjdgj
1877 call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1878
1879 " Test for gJ
1880 norm! 2gggJ
1881 call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1882 call assert_equal(16, col('.'))
1883 " shouldn't do anything
1884 norm! 10gJ
1885 call assert_equal(1, col('.'))
1886
1887 " Test for g0 g^ gm g$
1888 exe "norm! 2gg0gji "
1889 call assert_equal(['', 'abcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
1890 norm! g0yl
1891 call assert_equal(12, col('.'))
1892 call assert_equal(' ', getreg(0))
1893 norm! g$yl
1894 call assert_equal(22, col('.'))
1895 call assert_equal('3', getreg(0))
1896 norm! gmyl
1897 call assert_equal(17, col('.'))
1898 call assert_equal('n', getreg(0))
1899 norm! g^yl
1900 call assert_equal(15, col('.'))
1901 call assert_equal('l', getreg(0))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001902 call assert_beeps('normal 5g$')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001903
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001904 " Test for g_
1905 call assert_beeps('normal! 100g_')
1906 call setline(2, [' foo ', ' foobar '])
1907 normal! 2ggg_
1908 call assert_equal(5, col('.'))
1909 normal! 2g_
1910 call assert_equal(8, col('.'))
1911
1912 norm! 2ggdG
Bram Moolenaar8b530c12019-10-28 02:13:05 +01001913 $put =lineC
1914
1915 " Test for gM
1916 norm! gMyl
1917 call assert_equal(73, col('.'))
1918 call assert_equal('0', getreg(0))
1919 " Test for 20gM
1920 norm! 20gMyl
1921 call assert_equal(29, col('.'))
1922 call assert_equal('S', getreg(0))
1923 " Test for 60gM
1924 norm! 60gMyl
1925 call assert_equal(87, col('.'))
1926 call assert_equal('E', getreg(0))
1927
1928 " Test for g Ctrl-G
1929 set ff=unix
1930 let a=execute(":norm! g\<c-g>")
1931 call assert_match('Col 87 of 144; Line 2 of 2; Word 1 of 1; Byte 88 of 146', a)
1932
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001933 " Test for gI
1934 norm! gIfoo
Bram Moolenaar8b530c12019-10-28 02:13:05 +01001935 call assert_equal(['', 'foo0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'], getline(1,'$'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001936
1937 " Test for gi
1938 wincmd c
1939 %d
1940 set tw=0
1941 call setline(1, ['foobar', 'new line'])
1942 norm! A next word
1943 $put ='third line'
1944 norm! gi another word
1945 call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001946 call setline(1, 'foobar')
1947 normal! Ggifirst line
1948 call assert_equal('foobarfirst line', getline(1))
1949 " Test gi in 'virtualedit' mode with cursor after the end of the line
1950 set virtualedit=all
1951 call setline(1, 'foo')
1952 exe "normal! Abar\<Right>\<Right>\<Right>\<Right>"
1953 call setline(1, 'foo')
1954 normal! Ggifirst line
1955 call assert_equal('foo first line', getline(1))
1956 set virtualedit&
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001957
Bram Moolenaar1671f442020-03-10 07:48:13 +01001958 " Test for aboring a g command using CTRL-\ CTRL-G
1959 exe "normal! g\<C-\>\<C-G>"
1960 call assert_equal('foo first line', getline('.'))
1961
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001962 " clean up
1963 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001964endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001965
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001966" Test for g CTRL-G
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001967func Test_g_ctrl_g()
Bram Moolenaar05295832018-08-24 22:07:58 +02001968 new
1969
1970 let a = execute(":norm! g\<c-g>")
1971 call assert_equal("\n--No lines in buffer--", a)
1972
Bram Moolenaar1671f442020-03-10 07:48:13 +01001973 " Test for CTRL-G (same as :file)
1974 let a = execute(":norm! \<c-g>")
1975 call assert_equal("\n\n\"[No Name]\" --No lines in buffer--", a)
1976
Bram Moolenaar05295832018-08-24 22:07:58 +02001977 call setline(1, ['first line', 'second line'])
1978
1979 " Test g CTRL-g with dos, mac and unix file type.
1980 norm! gojll
1981 set ff=dos
1982 let a = execute(":norm! g\<c-g>")
1983 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 15 of 25", a)
1984
1985 set ff=mac
1986 let a = execute(":norm! g\<c-g>")
1987 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
1988
1989 set ff=unix
1990 let a = execute(":norm! g\<c-g>")
1991 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
1992
1993 " Test g CTRL-g in visual mode (v)
1994 let a = execute(":norm! gojllvlg\<c-g>")
1995 call assert_equal("\nSelected 1 of 2 Lines; 1 of 4 Words; 2 of 23 Bytes", a)
1996
1997 " Test g CTRL-g in visual mode (CTRL-V) with end col > start col
1998 let a = execute(":norm! \<Esc>gojll\<C-V>kllg\<c-g>")
1999 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
2000
2001 " Test g_CTRL-g in visual mode (CTRL-V) with end col < start col
2002 let a = execute(":norm! \<Esc>goll\<C-V>jhhg\<c-g>")
2003 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
2004
2005 " Test g CTRL-g in visual mode (CTRL-V) with end_vcol being MAXCOL
2006 let a = execute(":norm! \<Esc>gojll\<C-V>k$g\<c-g>")
2007 call assert_equal("\nSelected 2 of 2 Lines; 4 of 4 Words; 17 of 23 Bytes", a)
2008
2009 " There should be one byte less with noeol
2010 set bin noeol
2011 let a = execute(":norm! \<Esc>gog\<c-g>")
2012 call assert_equal("\nCol 1 of 10; Line 1 of 2; Word 1 of 4; Char 1 of 23; Byte 1 of 22", a)
2013 set bin & eol&
2014
Bram Moolenaar30276f22019-01-24 17:59:39 +01002015 call setline(1, ['Français', '日本語'])
Bram Moolenaar05295832018-08-24 22:07:58 +02002016
Bram Moolenaar30276f22019-01-24 17:59:39 +01002017 let a = execute(":norm! \<Esc>gojlg\<c-g>")
2018 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 +02002019
Bram Moolenaar30276f22019-01-24 17:59:39 +01002020 let a = execute(":norm! \<Esc>gojvlg\<c-g>")
2021 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 +02002022
Bram Moolenaar30276f22019-01-24 17:59:39 +01002023 let a = execute(":norm! \<Esc>goll\<c-v>jlg\<c-g>")
2024 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 +02002025
Bram Moolenaar30276f22019-01-24 17:59:39 +01002026 set fenc=utf8 bomb
2027 let a = execute(":norm! \<Esc>gojlg\<c-g>")
2028 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 +02002029
Bram Moolenaar30276f22019-01-24 17:59:39 +01002030 set fenc=utf16 bomb
2031 let a = execute(":norm! g\<c-g>")
2032 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 +02002033
Bram Moolenaar30276f22019-01-24 17:59:39 +01002034 set fenc=utf32 bomb
2035 let a = execute(":norm! g\<c-g>")
2036 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 +02002037
Bram Moolenaar30276f22019-01-24 17:59:39 +01002038 set fenc& bomb&
Bram Moolenaar05295832018-08-24 22:07:58 +02002039
2040 set ff&
2041 bwipe!
2042endfunc
2043
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002044" Test for g8
Bram Moolenaar1671f442020-03-10 07:48:13 +01002045func Test_normal34_g_cmd3()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002046 new
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002047 let a=execute(':norm! 1G0g8')
2048 call assert_equal("\nNUL", a)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002049
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002050 call setline(1, 'abcdefghijklmnopqrstuvwxyzäüö')
2051 let a=execute(':norm! 1G$g8')
2052 call assert_equal("\nc3 b6 ", a)
2053
2054 call setline(1, "a\u0302")
2055 let a=execute(':norm! 1G0g8')
2056 call assert_equal("\n61 + cc 82 ", a)
2057
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002058 " clean up
2059 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002060endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002061
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002062" Test 8g8 which finds invalid utf8 at or after the cursor.
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002063func Test_normal_8g8()
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002064 new
2065
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002066 " With invalid byte.
2067 call setline(1, "___\xff___")
2068 norm! 1G08g8g
2069 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2070
2071 " With invalid byte before the cursor.
2072 call setline(1, "___\xff___")
2073 norm! 1G$h8g8g
2074 call assert_equal([0, 1, 6, 0, 9], getcurpos())
2075
2076 " With truncated sequence.
2077 call setline(1, "___\xE2\x82___")
2078 norm! 1G08g8g
2079 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2080
2081 " With overlong sequence.
2082 call setline(1, "___\xF0\x82\x82\xAC___")
2083 norm! 1G08g8g
2084 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2085
2086 " With valid utf8.
2087 call setline(1, "café")
2088 norm! 1G08g8
2089 call assert_equal([0, 1, 1, 0, 1], getcurpos())
2090
2091 bw!
2092endfunc
2093
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002094" Test for g<
Bram Moolenaar1671f442020-03-10 07:48:13 +01002095func Test_normal35_g_cmd4()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002096 " Cannot capture its output,
2097 " probably a bug, therefore, test disabled:
Bram Moolenaar31845092016-09-05 22:58:31 +02002098 throw "Skipped: output of g< can't be tested currently"
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002099 echo "a\nb\nc\nd"
2100 let b=execute(':norm! g<')
2101 call assert_true(!empty(b), 'failed `execute(g<)`')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002102endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002103
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002104" Test for gp gP go
Bram Moolenaar1671f442020-03-10 07:48:13 +01002105func Test_normal36_g_cmd5()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002106 new
2107 call append(0, 'abcdefghijklmnopqrstuvwxyz')
Bram Moolenaar0913a102016-09-03 19:11:59 +02002108 set ff=unix
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002109 " Test for gp gP
2110 call append(1, range(1,10))
2111 1
2112 norm! 1yy
2113 3
2114 norm! gp
2115 call assert_equal([0, 5, 1, 0, 1], getcurpos())
2116 $
2117 norm! gP
2118 call assert_equal([0, 14, 1, 0, 1], getcurpos())
2119
2120 " Test for go
2121 norm! 26go
2122 call assert_equal([0, 1, 26, 0, 26], getcurpos())
2123 norm! 27go
2124 call assert_equal([0, 1, 26, 0, 26], getcurpos())
2125 norm! 28go
2126 call assert_equal([0, 2, 1, 0, 1], getcurpos())
2127 set ff=dos
2128 norm! 29go
2129 call assert_equal([0, 2, 1, 0, 1], getcurpos())
2130 set ff=unix
2131 norm! gg0
2132 norm! 101go
2133 call assert_equal([0, 13, 26, 0, 26], getcurpos())
2134 norm! 103go
2135 call assert_equal([0, 14, 1, 0, 1], getcurpos())
2136 " count > buffer content
2137 norm! 120go
2138 call assert_equal([0, 14, 1, 0, 2147483647], getcurpos())
2139 " clean up
2140 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002141endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002142
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002143" Test for gt and gT
Bram Moolenaar1671f442020-03-10 07:48:13 +01002144func Test_normal37_g_cmd6()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002145 tabnew 1.txt
2146 tabnew 2.txt
2147 tabnew 3.txt
2148 norm! 1gt
2149 call assert_equal(1, tabpagenr())
2150 norm! 3gt
2151 call assert_equal(3, tabpagenr())
2152 norm! 1gT
2153 " count gT goes not to the absolute tabpagenumber
2154 " but, but goes to the count previous tabpagenumber
2155 call assert_equal(2, tabpagenr())
2156 " wrap around
2157 norm! 3gT
2158 call assert_equal(3, tabpagenr())
2159 " gt does not wrap around
2160 norm! 5gt
2161 call assert_equal(3, tabpagenr())
2162
2163 for i in range(3)
2164 tabclose
2165 endfor
2166 " clean up
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +01002167 call assert_fails(':tabclose', 'E784:')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002168endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002169
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002170" Test for <Home> and <C-Home> key
Bram Moolenaar1671f442020-03-10 07:48:13 +01002171func Test_normal38_nvhome()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002172 new
2173 call setline(1, range(10))
2174 $
2175 setl et sw=2
2176 norm! V10>$
2177 " count is ignored
2178 exe "norm! 10\<home>"
2179 call assert_equal(1, col('.'))
2180 exe "norm! \<home>"
2181 call assert_equal([0, 10, 1, 0, 1], getcurpos())
2182 exe "norm! 5\<c-home>"
2183 call assert_equal([0, 5, 1, 0, 1], getcurpos())
2184 exe "norm! \<c-home>"
2185 call assert_equal([0, 1, 1, 0, 1], getcurpos())
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002186 exe "norm! G\<c-kHome>"
2187 call assert_equal([0, 1, 1, 0, 1], getcurpos())
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002188
2189 " clean up
2190 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002191endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002192
Bram Moolenaar1671f442020-03-10 07:48:13 +01002193" Test for <End> and <C-End> keys
2194func Test_normal_nvend()
2195 new
2196 call setline(1, map(range(1, 10), '"line" .. v:val'))
2197 exe "normal! \<End>"
2198 call assert_equal(5, col('.'))
2199 exe "normal! 4\<End>"
2200 call assert_equal([4, 5], [line('.'), col('.')])
2201 exe "normal! \<C-End>"
2202 call assert_equal([10, 6], [line('.'), col('.')])
2203 close!
2204endfunc
2205
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002206" Test for cw cW ce
Bram Moolenaar1671f442020-03-10 07:48:13 +01002207func Test_normal39_cw()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002208 " Test for cw and cW on whitespace
2209 " and cpo+=w setting
2210 new
2211 set tw=0
2212 call append(0, 'here are some words')
2213 norm! 1gg0elcwZZZ
2214 call assert_equal('hereZZZare some words', getline('.'))
2215 norm! 1gg0elcWYYY
2216 call assert_equal('hereZZZareYYYsome words', getline('.'))
2217 set cpo+=w
2218 call setline(1, 'here are some words')
2219 norm! 1gg0elcwZZZ
2220 call assert_equal('hereZZZ are some words', getline('.'))
2221 norm! 1gg2elcWYYY
2222 call assert_equal('hereZZZ areYYY some words', getline('.'))
2223 set cpo-=w
2224 norm! 2gg0cwfoo
2225 call assert_equal('foo', getline('.'))
2226
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002227 call setline(1, 'one; two')
2228 call cursor(1, 1)
2229 call feedkeys('cwvim', 'xt')
2230 call assert_equal('vim; two', getline(1))
2231 call feedkeys('0cWone', 'xt')
2232 call assert_equal('one two', getline(1))
2233 "When cursor is at the end of a word 'ce' will change until the end of the
2234 "next word, but 'cw' will change only one character
2235 call setline(1, 'one two')
2236 call feedkeys('0ecwce', 'xt')
2237 call assert_equal('once two', getline(1))
2238 call setline(1, 'one two')
2239 call feedkeys('0ecely', 'xt')
2240 call assert_equal('only', getline(1))
2241
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002242 " clean up
2243 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002244endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002245
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002246" Test for CTRL-\ commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01002247func Test_normal40_ctrl_bsl()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002248 new
2249 call append(0, 'here are some words')
2250 exe "norm! 1gg0a\<C-\>\<C-N>"
2251 call assert_equal('n', mode())
2252 call assert_equal(1, col('.'))
2253 call assert_equal('', visualmode())
2254 exe "norm! 1gg0viw\<C-\>\<C-N>"
2255 call assert_equal('n', mode())
2256 call assert_equal(4, col('.'))
2257 exe "norm! 1gg0a\<C-\>\<C-G>"
2258 call assert_equal('n', mode())
2259 call assert_equal(1, col('.'))
2260 "imap <buffer> , <c-\><c-n>
2261 set im
2262 exe ":norm! \<c-\>\<c-n>dw"
2263 set noim
2264 call assert_equal('are some words', getline(1))
2265 call assert_false(&insertmode)
Bram Moolenaar1671f442020-03-10 07:48:13 +01002266 call assert_beeps("normal! \<C-\>\<C-A>", 'xt')
2267
2268 " Using CTRL-\ CTRL-N in cmd window should close the window
2269 call feedkeys("q:\<C-\>\<C-N>", 'xt')
2270 call assert_equal('', getcmdwintype())
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002271
2272 " clean up
2273 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002274endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002275
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002276" Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>= in insert mode
Bram Moolenaar1671f442020-03-10 07:48:13 +01002277func Test_normal41_insert_reg()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002278 new
2279 set sts=2 sw=2 ts=8 tw=0
2280 call append(0, ["aaa\tbbb\tccc", '', '', ''])
2281 let a=getline(1)
2282 norm! 2gg0
2283 exe "norm! a\<c-r>=a\<cr>"
2284 norm! 3gg0
2285 exe "norm! a\<c-r>\<c-r>=a\<cr>"
2286 norm! 4gg0
2287 exe "norm! a\<c-r>\<c-o>=a\<cr>"
2288 call assert_equal(['aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', ''], getline(1, '$'))
2289
2290 " clean up
2291 set sts=0 sw=8 ts=8
Bram Moolenaar31845092016-09-05 22:58:31 +02002292 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002293endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002294
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002295" Test for Ctrl-D and Ctrl-U
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002296func Test_normal42_halfpage()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002297 call Setup_NewWindow()
2298 call assert_equal(5, &scroll)
2299 exe "norm! \<c-d>"
2300 call assert_equal('6', getline('.'))
2301 exe "norm! 2\<c-d>"
2302 call assert_equal('8', getline('.'))
2303 call assert_equal(2, &scroll)
2304 set scroll=5
2305 exe "norm! \<c-u>"
2306 call assert_equal('3', getline('.'))
2307 1
2308 set scrolloff=5
2309 exe "norm! \<c-d>"
2310 call assert_equal('10', getline('.'))
2311 exe "norm! \<c-u>"
2312 call assert_equal('5', getline('.'))
2313 1
2314 set scrolloff=99
2315 exe "norm! \<c-d>"
2316 call assert_equal('10', getline('.'))
2317 set scrolloff=0
2318 100
2319 exe "norm! $\<c-u>"
2320 call assert_equal('95', getline('.'))
2321 call assert_equal([0, 95, 1, 0, 1], getcurpos())
2322 100
2323 set nostartofline
2324 exe "norm! $\<c-u>"
2325 call assert_equal('95', getline('.'))
2326 call assert_equal([0, 95, 2, 0, 2147483647], getcurpos())
2327 " cleanup
2328 set startofline
2329 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002330endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002331
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002332" Tests for text object aw
Bram Moolenaar1671f442020-03-10 07:48:13 +01002333func Test_normal43_textobject1()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002334 new
2335 call append(0, ['foobar,eins,foobar', 'foo,zwei,foo '])
2336 " diw
2337 norm! 1gg0diw
2338 call assert_equal([',eins,foobar', 'foo,zwei,foo ', ''], getline(1,'$'))
2339 " daw
2340 norm! 2ggEdaw
2341 call assert_equal([',eins,foobar', 'foo,zwei,', ''], getline(1, '$'))
2342 %d
2343 call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo "])
2344 " diW
2345 norm! 2ggwd2iW
2346 call assert_equal(['foo eins foobar', 'foo foo ', ''], getline(1,'$'))
2347 " daW
2348 norm! 1ggd2aW
2349 call assert_equal(['foobar', 'foo foo ', ''], getline(1,'$'))
2350
2351 %d
2352 call append(0, ["foo\teins\tfoobar", "foo\tzwei\tfoo "])
2353 " aw in visual line mode switches to characterwise mode
2354 norm! 2gg$Vawd
2355 call assert_equal(['foo eins foobar', 'foo zwei foo'], getline(1,'$'))
2356 norm! 1gg$Viwd
2357 call assert_equal(['foo eins ', 'foo zwei foo'], getline(1,'$'))
2358
2359 " clean up
2360 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002361endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002362
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002363" Test for is and as text objects
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002364func Test_normal44_textobjects2()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002365 new
2366 call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
2367 " Test for dis - does not remove trailing whitespace
2368 norm! 1gg0dis
2369 call assert_equal([' With some sentences!', '', 'Even with a question? And one more. And no sentence here', ''], getline(1,'$'))
2370 " Test for das - removes leading whitespace
2371 norm! 3ggf?ldas
2372 call assert_equal([' With some sentences!', '', 'Even with a question? And no sentence here', ''], getline(1,'$'))
2373 " when used in visual mode, is made characterwise
2374 norm! 3gg$Visy
2375 call assert_equal('v', visualmode())
2376 " reset visualmode()
2377 norm! 3ggVy
2378 norm! 3gg$Vasy
2379 call assert_equal('v', visualmode())
2380 " basic testing for textobjects a< and at
2381 %d
2382 call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>',' </div>', ' '])
2383 " a<
2384 norm! 1gg0da<
2385 call assert_equal([' ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2386 norm! 1pj
2387 call assert_equal([' <div>', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2388 " at
2389 norm! d2at
2390 call assert_equal([' '], getline(1,'$'))
2391 %d
2392 call setline(1, ['<div> ','<a href="foobar" class="foo">xyz</a>',' </div>', ' '])
2393 " i<
2394 norm! 1gg0di<
2395 call assert_equal(['<> ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2396 norm! 1Pj
2397 call assert_equal(['<div> ', '<a href="foobar" class="foo">xyz</a>', ' </div>', ' '], getline(1,'$'))
2398 norm! d2it
2399 call assert_equal(['<div></div>',' '], getline(1,'$'))
2400 " basic testing for a[ and i[ text object
2401 %d
2402 call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
2403 norm! 3gg0di[
2404 call assert_equal([' ', '[', ']'], getline(1,'$'))
2405 call setline(1, [' ', '[', 'one [two]', 'thre', ']'])
2406 norm! 3gg0ftd2a[
2407 call assert_equal([' '], getline(1,'$'))
2408 %d
2409 " Test for i" when cursor is in front of a quoted object
2410 call append(0, 'foo "bar"')
2411 norm! 1gg0di"
2412 call assert_equal(['foo ""', ''], getline(1,'$'))
2413
2414 " clean up
2415 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002416endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002417
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002418func Test_normal45_drop()
Bram Moolenaar29495952018-02-12 22:49:00 +01002419 if !has('dnd')
Bram Moolenaarb48e96f2018-02-13 12:26:14 +01002420 " The ~ register does not exist
2421 call assert_beeps('norm! "~')
Bram Moolenaar29495952018-02-12 22:49:00 +01002422 return
2423 endif
2424
2425 " basic test for drag-n-drop
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002426 " unfortunately, without a gui, we can't really test much here,
2427 " so simply test that ~p fails (which uses the drop register)
2428 new
2429 call assert_fails(':norm! "~p', 'E353')
2430 call assert_equal([], getreg('~', 1, 1))
2431 " the ~ register is read only
2432 call assert_fails(':let @~="1"', 'E354')
2433 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002434endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002435
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002436func Test_normal46_ignore()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002437 new
2438 " How to test this?
2439 " let's just for now test, that the buffer
2440 " does not change
2441 call feedkeys("\<c-s>", 't')
2442 call assert_equal([''], getline(1,'$'))
2443
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002444 " no valid commands
2445 exe "norm! \<char-0x100>"
2446 call assert_equal([''], getline(1,'$'))
2447
2448 exe "norm! ä"
2449 call assert_equal([''], getline(1,'$'))
2450
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002451 " clean up
2452 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002453endfunc
Bram Moolenaarc4a908e2016-09-08 23:35:30 +02002454
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002455func Test_normal47_visual_buf_wipe()
Bram Moolenaarc4a908e2016-09-08 23:35:30 +02002456 " This was causing a crash or ml_get error.
2457 enew!
2458 call setline(1,'xxx')
2459 normal $
2460 new
2461 call setline(1, range(1,2))
2462 2
2463 exe "norm \<C-V>$"
2464 bw!
2465 norm yp
2466 set nomodified
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002467endfunc
2468
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002469func Test_normal47_autocmd()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002470 " disabled, does not seem to be possible currently
2471 throw "Skipped: not possible to test cursorhold autocmd while waiting for input in normal_cmd"
2472 new
2473 call append(0, repeat('-',20))
2474 au CursorHold * call feedkeys('2l', '')
2475 1
2476 set updatetime=20
2477 " should delete 12 chars (d12l)
2478 call feedkeys('d1', '!')
2479 call assert_equal('--------', getline(1))
2480
2481 " clean up
2482 au! CursorHold
2483 set updatetime=4000
2484 bw!
2485endfunc
2486
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002487func Test_normal48_wincmd()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002488 new
2489 exe "norm! \<c-w>c"
2490 call assert_equal(1, winnr('$'))
2491 call assert_fails(":norm! \<c-w>c", "E444")
2492endfunc
2493
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002494func Test_normal49_counts()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002495 new
2496 call setline(1, 'one two three four five six seven eight nine ten')
2497 1
2498 norm! 3d2w
2499 call assert_equal('seven eight nine ten', getline(1))
2500 bw!
2501endfunc
2502
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002503func Test_normal50_commandline()
Bram Moolenaar4033c552017-09-16 20:54:51 +02002504 if !has("timers") || !has("cmdline_hist")
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002505 return
2506 endif
2507 func! DoTimerWork(id)
2508 call assert_equal('[Command Line]', bufname(''))
2509 " should fail, with E11, but does fail with E23?
2510 "call feedkeys("\<c-^>", 'tm')
2511
2512 " should also fail with E11
2513 call assert_fails(":wincmd p", 'E11')
2514 " return from commandline window
2515 call feedkeys("\<cr>")
2516 endfunc
2517
2518 let oldlang=v:lang
2519 lang C
2520 set updatetime=20
2521 call timer_start(100, 'DoTimerWork')
2522 try
2523 " throws E23, for whatever reason...
2524 call feedkeys('q:', 'x!')
2525 catch /E23/
2526 " no-op
2527 endtry
2528 " clean up
2529 set updatetime=4000
2530 exe "lang" oldlang
2531 bw!
2532endfunc
2533
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002534func Test_normal51_FileChangedRO()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002535 if !has("autocmd")
2536 return
2537 endif
Bram Moolenaare5f2a072017-02-01 22:31:49 +01002538 " Don't sleep after the warning message.
2539 call test_settime(1)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002540 call writefile(['foo'], 'Xreadonly.log')
2541 new Xreadonly.log
2542 setl ro
2543 au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix')
2544 call assert_fails(":norm! Af", 'E788')
2545 call assert_equal(['foo'], getline(1,'$'))
2546 call assert_equal('Xreadonly.log', bufname(''))
2547
2548 " cleanup
Bram Moolenaare5f2a072017-02-01 22:31:49 +01002549 call test_settime(0)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002550 bw!
2551 call delete("Xreadonly.log")
2552endfunc
2553
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002554func Test_normal52_rl()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002555 if !has("rightleft")
2556 return
2557 endif
2558 new
2559 call setline(1, 'abcde fghij klmnopq')
2560 norm! 1gg$
2561 set rl
2562 call assert_equal(19, col('.'))
2563 call feedkeys('l', 'tx')
2564 call assert_equal(18, col('.'))
2565 call feedkeys('h', 'tx')
2566 call assert_equal(19, col('.'))
2567 call feedkeys("\<right>", 'tx')
2568 call assert_equal(18, col('.'))
Bram Moolenaar1671f442020-03-10 07:48:13 +01002569 call feedkeys("\<left>", 'tx')
2570 call assert_equal(19, col('.'))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002571 call feedkeys("\<s-right>", 'tx')
2572 call assert_equal(13, col('.'))
2573 call feedkeys("\<c-right>", 'tx')
2574 call assert_equal(7, col('.'))
2575 call feedkeys("\<c-left>", 'tx')
2576 call assert_equal(13, col('.'))
2577 call feedkeys("\<s-left>", 'tx')
2578 call assert_equal(19, col('.'))
2579 call feedkeys("<<", 'tx')
2580 call assert_equal(' abcde fghij klmnopq',getline(1))
2581 call feedkeys(">>", 'tx')
2582 call assert_equal('abcde fghij klmnopq',getline(1))
2583
2584 " cleanup
2585 set norl
2586 bw!
2587endfunc
2588
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002589func Test_normal53_digraph()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002590 if !has('digraphs')
2591 return
2592 endif
2593 new
2594 call setline(1, 'abcdefgh|')
2595 exe "norm! 1gg0f\<c-k>!!"
2596 call assert_equal(9, col('.'))
2597 set cpo+=D
2598 exe "norm! 1gg0f\<c-k>!!"
2599 call assert_equal(1, col('.'))
2600
2601 set cpo-=D
2602 bw!
2603endfunc
2604
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002605func Test_normal54_Ctrl_bsl()
2606 new
2607 call setline(1, 'abcdefghijklmn')
2608 exe "norm! df\<c-\>\<c-n>"
2609 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2610 exe "norm! df\<c-\>\<c-g>"
2611 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2612 exe "norm! df\<c-\>m"
2613 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
Bram Moolenaar30276f22019-01-24 17:59:39 +01002614
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002615 call setline(2, 'abcdefghijklmnāf')
2616 norm! 2gg0
2617 exe "norm! df\<Char-0x101>"
2618 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
2619 norm! 1gg0
2620 exe "norm! df\<esc>"
2621 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002622
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002623 " clean up
2624 bw!
2625endfunc
2626
2627func Test_normal_large_count()
2628 " This may fail with 32bit long, how do we detect that?
2629 new
2630 normal o
2631 normal 6666666666dL
2632 bwipe!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002633endfunc
Bram Moolenaarbf3d5802017-03-29 19:48:11 +02002634
2635func Test_delete_until_paragraph()
Bram Moolenaarbf3d5802017-03-29 19:48:11 +02002636 new
2637 normal grádv}
2638 call assert_equal('á', getline(1))
2639 normal grád}
2640 call assert_equal('', getline(1))
2641 bwipe!
2642endfunc
Bram Moolenaarfb094e12017-11-05 20:59:28 +01002643
2644" Test for the gr (virtual replace) command
2645" Test for the bug fixed by 7.4.387
2646func Test_gr_command()
2647 enew!
2648 let save_cpo = &cpo
2649 call append(0, ['First line', 'Second line', 'Third line'])
2650 exe "normal i\<C-G>u"
2651 call cursor(2, 1)
2652 set cpo-=X
2653 normal 4gro
2654 call assert_equal('oooond line', getline(2))
2655 undo
2656 set cpo+=X
2657 normal 4gro
2658 call assert_equal('ooooecond line', getline(2))
2659 let &cpo = save_cpo
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002660 normal! ggvegrx
2661 call assert_equal('xxxxx line', getline(1))
2662 exe "normal! gggr\<C-V>122"
2663 call assert_equal('zxxxx line', getline(1))
2664 set virtualedit=all
2665 normal! 15|grl
2666 call assert_equal('zxxxx line l', getline(1))
2667 set virtualedit&
2668 set nomodifiable
2669 call assert_fails('normal! grx', 'E21:')
2670 call assert_fails('normal! gRx', 'E21:')
2671 set modifiable&
Bram Moolenaarfb094e12017-11-05 20:59:28 +01002672 enew!
2673endfunc
2674
2675" When splitting a window the changelist position is wrong.
2676" Test the changelist position after splitting a window.
2677" Test for the bug fixed by 7.4.386
2678func Test_changelist()
2679 let save_ul = &ul
2680 enew!
2681 call append('$', ['1', '2'])
2682 exe "normal i\<C-G>u"
2683 exe "normal Gkylpa\<C-G>u"
2684 set ul=100
2685 exe "normal Gylpa\<C-G>u"
2686 set ul=100
2687 normal gg
2688 vsplit
2689 normal g;
2690 call assert_equal([3, 2], [line('.'), col('.')])
2691 normal g;
2692 call assert_equal([2, 2], [line('.'), col('.')])
2693 call assert_fails('normal g;', 'E662:')
Bram Moolenaar1671f442020-03-10 07:48:13 +01002694 new
2695 call assert_fails('normal g;', 'E664:')
Bram Moolenaarfb094e12017-11-05 20:59:28 +01002696 %bwipe!
2697 let &ul = save_ul
2698endfunc
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002699
2700func Test_nv_hat_count()
2701 %bwipeout!
2702 let l:nr = bufnr('%') + 1
2703 call assert_fails(':execute "normal! ' . l:nr . '\<C-^>"', 'E92')
2704
2705 edit Xfoo
2706 let l:foo_nr = bufnr('Xfoo')
2707
2708 edit Xbar
2709 let l:bar_nr = bufnr('Xbar')
2710
2711 " Make sure we are not just using the alternate file.
2712 edit Xbaz
2713
2714 call feedkeys(l:foo_nr . "\<C-^>", 'tx')
2715 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
2716
2717 call feedkeys(l:bar_nr . "\<C-^>", 'tx')
2718 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
2719
2720 %bwipeout!
2721endfunc
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002722
2723func Test_message_when_using_ctrl_c()
Bram Moolenaar553e5a52019-03-25 23:16:34 +01002724 " Make sure no buffers are changed.
2725 %bwipe!
2726
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002727 exe "normal \<C-C>"
2728 call assert_match("Type :qa and press <Enter> to exit Vim", Screenline(&lines))
Bram Moolenaar553e5a52019-03-25 23:16:34 +01002729
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002730 new
2731 cal setline(1, 'hi!')
2732 exe "normal \<C-C>"
2733 call assert_match("Type :qa! and press <Enter> to abandon all changes and exit Vim", Screenline(&lines))
Bram Moolenaar553e5a52019-03-25 23:16:34 +01002734
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01002735 bwipe!
2736endfunc
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02002737
2738" Test for '[m', ']m', '[M' and ']M'
2739" Jumping to beginning and end of methods in Java-like languages
2740func Test_java_motion()
2741 new
Bram Moolenaar1671f442020-03-10 07:48:13 +01002742 call assert_beeps('normal! [m')
2743 call assert_beeps('normal! ]m')
2744 call assert_beeps('normal! [M')
2745 call assert_beeps('normal! ]M')
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02002746 a
2747Piece of Java
2748{
2749 tt m1 {
2750 t1;
2751 } e1
2752
2753 tt m2 {
2754 t2;
2755 } e2
2756
2757 tt m3 {
2758 if (x)
2759 {
2760 t3;
2761 }
2762 } e3
2763}
2764.
2765
2766 normal gg
2767
2768 normal 2]maA
2769 call assert_equal("\ttt m1 {A", getline('.'))
2770 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
2771
2772 normal j]maB
2773 call assert_equal("\ttt m2 {B", getline('.'))
2774 call assert_equal([7, 9, 16], [line('.'), col('.'), virtcol('.')])
2775
2776 normal ]maC
2777 call assert_equal("\ttt m3 {C", getline('.'))
2778 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
2779
2780 normal [maD
2781 call assert_equal("\ttt m3 {DC", getline('.'))
2782 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
2783
2784 normal k2[maE
2785 call assert_equal("\ttt m1 {EA", getline('.'))
2786 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
2787
2788 normal 3[maF
2789 call assert_equal("{F", getline('.'))
2790 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
2791
2792 normal ]MaG
2793 call assert_equal("\t}G e1", getline('.'))
2794 call assert_equal([5, 3, 10], [line('.'), col('.'), virtcol('.')])
2795
2796 normal j2]MaH
2797 call assert_equal("\t}H e3", getline('.'))
2798 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
2799
2800 normal ]M]M
2801 normal aI
2802 call assert_equal("}I", getline('.'))
2803 call assert_equal([17, 2, 2], [line('.'), col('.'), virtcol('.')])
2804
2805 normal 2[MaJ
2806 call assert_equal("\t}JH e3", getline('.'))
2807 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
2808
2809 normal k[MaK
2810 call assert_equal("\t}K e2", getline('.'))
2811 call assert_equal([9, 3, 10], [line('.'), col('.'), virtcol('.')])
2812
2813 normal 3[MaL
2814 call assert_equal("{LF", getline('.'))
2815 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
2816
2817 close!
2818endfunc
Bram Moolenaard5c82342019-07-27 18:44:57 +02002819
Bram Moolenaar1671f442020-03-10 07:48:13 +01002820func Test_normal_gdollar_cmd()
Bram Moolenaard5c82342019-07-27 18:44:57 +02002821 if !has("jumplist")
2822 return
2823 endif
2824 " Tests for g cmds
2825 call Setup_NewWindow()
2826 " Make long lines that will wrap
2827 %s/$/\=repeat(' foobar', 10)/
2828 20vsp
2829 set wrap
2830 " Test for g$ with count
2831 norm! gg
2832 norm! 0vg$y
2833 call assert_equal(20, col("'>"))
2834 call assert_equal('1 foobar foobar foob', getreg(0))
2835 norm! gg
2836 norm! 0v4g$y
2837 call assert_equal(72, col("'>"))
2838 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.."\n", getreg(0))
2839 norm! gg
2840 norm! 0v6g$y
2841 call assert_equal(40, col("'>"))
2842 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2843 \ '2 foobar foobar foobar foobar foobar foo', getreg(0))
2844 set nowrap
2845 " clean up
2846 norm! gg
2847 norm! 0vg$y
2848 call assert_equal(20, col("'>"))
2849 call assert_equal('1 foobar foobar foob', getreg(0))
2850 norm! gg
2851 norm! 0v4g$y
2852 call assert_equal(20, col("'>"))
2853 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2854 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2855 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2856 \ '4 foobar foobar foob', getreg(0))
2857 norm! gg
2858 norm! 0v6g$y
2859 call assert_equal(20, col("'>"))
2860 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2861 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2862 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2863 \ '4 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2864 \ '5 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
2865 \ '6 foobar foobar foob', getreg(0))
2866 " Move to last line, also down movement is not possible, should still move
2867 " the cursor to the last visible char
2868 norm! G
2869 norm! 0v6g$y
2870 call assert_equal(20, col("'>"))
2871 call assert_equal('100 foobar foobar fo', getreg(0))
2872 bw!
2873endfunc
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02002874
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002875func Test_normal_gk_gj()
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02002876 " needs 80 column new window
2877 new
2878 vert 80new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002879 call assert_beeps('normal gk')
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02002880 put =[repeat('x',90)..' {{{1', 'x {{{1']
2881 norm! gk
2882 " In a 80 column wide terminal the window will be only 78 char
2883 " (because Vim will leave space for the other window),
2884 " but if the terminal is larger, it will be 80 chars, so verify the
2885 " cursor column correctly.
2886 call assert_equal(winwidth(0)+1, col('.'))
2887 call assert_equal(winwidth(0)+1, virtcol('.'))
2888 norm! j
2889 call assert_equal(6, col('.'))
2890 call assert_equal(6, virtcol('.'))
2891 norm! gk
2892 call assert_equal(95, col('.'))
2893 call assert_equal(95, virtcol('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002894 %bw!
Bram Moolenaarceba3dd2019-10-12 16:12:54 +02002895
2896 " needs 80 column new window
2897 new
2898 vert 80new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002899 call assert_beeps('normal gj')
Bram Moolenaarceba3dd2019-10-12 16:12:54 +02002900 set number
2901 set numberwidth=10
2902 set cpoptions+=n
2903 put =[repeat('0',90), repeat('1',90)]
2904 norm! 075l
2905 call assert_equal(76, col('.'))
2906 norm! gk
2907 call assert_equal(1, col('.'))
2908 norm! gk
2909 call assert_equal(76, col('.'))
2910 norm! gk
2911 call assert_equal(1, col('.'))
2912 norm! gj
2913 call assert_equal(76, col('.'))
2914 norm! gj
2915 call assert_equal(1, col('.'))
2916 norm! gj
2917 call assert_equal(76, col('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002918 " When 'nowrap' is set, gk and gj behave like k and j
2919 set nowrap
2920 normal! gk
2921 call assert_equal([2, 76], [line('.'), col('.')])
2922 normal! gj
2923 call assert_equal([3, 76], [line('.'), col('.')])
2924 %bw!
2925 set cpoptions& number& numberwidth& wrap&
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02002926endfunc
Bram Moolenaarf0cee192020-02-16 13:33:56 +01002927
2928" Test for cursor movement with '-' in 'cpoptions'
2929func Test_normal_cpo_minus()
2930 new
2931 call setline(1, ['foo', 'bar', 'baz'])
2932 let save_cpo = &cpo
2933 set cpo+=-
2934 call assert_beeps('normal 10j')
2935 call assert_equal(1, line('.'))
2936 normal G
2937 call assert_beeps('normal 10k')
2938 call assert_equal(3, line('.'))
2939 call assert_fails(10, 'E16:')
2940 let &cpo = save_cpo
2941 close!
2942endfunc
Bram Moolenaar818fc9a2020-02-21 17:54:45 +01002943
2944" Test for using : to run a multi-line Ex command in operator pending mode
2945func Test_normal_yank_with_excmd()
2946 new
2947 call setline(1, ['foo', 'bar', 'baz'])
2948 let @a = ''
2949 call feedkeys("\"ay:if v:true\<CR>normal l\<CR>endif\<CR>", 'xt')
2950 call assert_equal('f', @a)
2951 close!
2952endfunc
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002953
2954" Test for supplying a count to a normal-mode command across a cursorhold call
2955func Test_normal_cursorhold_with_count()
2956 func s:cHold()
2957 let g:cHold_Called += 1
2958 endfunc
2959 new
2960 augroup normalcHoldTest
2961 au!
2962 au CursorHold <buffer> call s:cHold()
2963 augroup END
2964 let g:cHold_Called = 0
2965 call feedkeys("3\<CursorHold>2ix", 'xt')
2966 call assert_equal(1, g:cHold_Called)
2967 call assert_equal(repeat('x', 32), getline(1))
2968 augroup normalcHoldTest
2969 au!
2970 augroup END
2971 au! normalcHoldTest
2972 close!
2973 delfunc s:cHold
2974endfunc
2975
2976" Test for using a count and a command with CTRL-W
2977func Test_wincmd_with_count()
2978 call feedkeys("\<C-W>12n", 'xt')
2979 call assert_equal(12, winheight(0))
2980endfunc
2981
2982" Test for 'b', 'B' 'ge' and 'gE' commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01002983func Test_horiz_motion()
2984 new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002985 normal! gg
2986 call assert_beeps('normal! b')
2987 call assert_beeps('normal! B')
2988 call assert_beeps('normal! gE')
2989 call assert_beeps('normal! ge')
Bram Moolenaar1671f442020-03-10 07:48:13 +01002990 " <S-Backspace> moves one word left and <C-Backspace> moves one WORD left
2991 call setline(1, 'one ,two ,three')
2992 exe "normal! $\<S-BS>"
2993 call assert_equal(11, col('.'))
2994 exe "normal! $\<C-BS>"
2995 call assert_equal(10, col('.'))
2996 close!
2997endfunc
2998
2999" Test for using a : command in operator pending mode
3000func Test_normal_colon_op()
3001 new
3002 call setline(1, ['one', 'two'])
3003 call assert_beeps("normal! Gc:d\<CR>")
3004 close!
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003005endfunc
3006
3007" vim: shiftwidth=2 sts=2 expandtab