blob: fd2e2ecf1c0b8733de3a3c2624da48c9c4a1816e [file] [log] [blame]
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001" Test for various Normal mode commands
2
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01003source shared.vim
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01004source check.vim
Bram Moolenaarca68ae12020-03-30 19:32:53 +02005source view_util.vim
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01006
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01007func Setup_NewWindow()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02008 10new
9 call setline(1, range(1,100))
10endfunc
11
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010012func MyFormatExpr()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020013 " Adds '->$' at lines having numbers followed by trailing whitespace
14 for ln in range(v:lnum, v:lnum+v:count-1)
15 let line = getline(ln)
16 if getline(ln) =~# '\d\s\+$'
17 call setline(ln, substitute(line, '\s\+$', '', '') . '->$')
18 endif
19 endfor
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020020endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020021
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010022func CountSpaces(type, ...)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020023 " for testing operatorfunc
24 " will count the number of spaces
25 " and return the result in g:a
26 let sel_save = &selection
27 let &selection = "inclusive"
28 let reg_save = @@
29
30 if a:0 " Invoked from Visual mode, use gv command.
31 silent exe "normal! gvy"
32 elseif a:type == 'line'
33 silent exe "normal! '[V']y"
34 else
35 silent exe "normal! `[v`]y"
36 endif
Bram Moolenaar777e7c22021-10-25 17:07:04 +010037 let g:a = strlen(substitute(@@, '[^ ]', '', 'g'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020038 let &selection = sel_save
39 let @@ = reg_save
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020040endfunc
41
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010042func OpfuncDummy(type, ...)
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +010043 " for testing operatorfunc
Bram Moolenaar777e7c22021-10-25 17:07:04 +010044 let g:opt = &linebreak
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +010045
46 if a:0 " Invoked from Visual mode, use gv command.
47 silent exe "normal! gvy"
48 elseif a:type == 'line'
49 silent exe "normal! '[V']y"
50 else
51 silent exe "normal! `[v`]y"
52 endif
53 " Create a new dummy window
54 new
Bram Moolenaar777e7c22021-10-25 17:07:04 +010055 let g:bufnr = bufnr('%')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020056endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020057
Bram Moolenaar1671f442020-03-10 07:48:13 +010058func Test_normal00_optrans()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020059 new
60 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
61 1
62 exe "norm! Sfoobar\<esc>"
63 call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$'))
64 2
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020065 exe "norm! $vbsone"
66 call assert_equal(['foobar', '2 This is the second one', '3 this is the third line', ''], getline(1,'$'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020067 norm! VS Second line here
68 call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$'))
69 %d
70 call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line'])
71 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
72
73 1
74 norm! 2D
75 call assert_equal(['3 this is the third line', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
76 set cpo+=#
77 norm! 4D
78 call assert_equal(['', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
79
80 " clean up
81 set cpo-=#
82 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020083endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020084
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010085func Test_normal01_keymodel()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020086 call Setup_NewWindow()
87 " Test 1: depending on 'keymodel' <s-down> does something different
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020088 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020089 call feedkeys("V\<S-Up>y", 'tx')
90 call assert_equal(['47', '48', '49', '50'], getline("'<", "'>"))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020091 set keymodel=startsel
92 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020093 call feedkeys("V\<S-Up>y", 'tx')
94 call assert_equal(['49', '50'], getline("'<", "'>"))
95 " Start visual mode when keymodel = startsel
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020096 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020097 call feedkeys("\<S-Up>y", 'tx')
98 call assert_equal(['49', '5'], getreg(0, 0, 1))
Bram Moolenaar1671f442020-03-10 07:48:13 +010099 " Use the different Shift special keys
100 50
101 call feedkeys("\<S-Right>\<S-Left>\<S-Up>\<S-Down>\<S-Home>\<S-End>y", 'tx')
102 call assert_equal(['50'], getline("'<", "'>"))
103 call assert_equal(['50', ''], getreg(0, 0, 1))
104
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200105 " Do not start visual mode when keymodel=
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200106 set keymodel=
107 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200108 call feedkeys("\<S-Up>y$", 'tx')
109 call assert_equal(['42'], getreg(0, 0, 1))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200110 " Stop visual mode when keymodel=stopsel
111 set keymodel=stopsel
112 50
113 call feedkeys("Vkk\<Up>yy", 'tx')
114 call assert_equal(['47'], getreg(0, 0, 1))
115
116 set keymodel=
117 50
118 call feedkeys("Vkk\<Up>yy", 'tx')
119 call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200120
Bram Moolenaard7e5e942020-10-07 16:54:52 +0200121 " Test for using special keys to start visual selection
122 %d
123 call setline(1, ['red fox tail', 'red fox tail', 'red fox tail'])
124 set keymodel=startsel
125 " Test for <S-PageUp> and <S-PageDown>
126 call cursor(1, 1)
127 call feedkeys("\<S-PageDown>y", 'xt')
128 call assert_equal([0, 1, 1, 0], getpos("'<"))
129 call assert_equal([0, 3, 1, 0], getpos("'>"))
130 call feedkeys("Gz\<CR>8|\<S-PageUp>y", 'xt')
131 call assert_equal([0, 2, 1, 0], getpos("'<"))
132 call assert_equal([0, 3, 8, 0], getpos("'>"))
133 " Test for <S-C-Home> and <S-C-End>
134 call cursor(2, 12)
135 call feedkeys("\<S-C-Home>y", 'xt')
136 call assert_equal([0, 1, 1, 0], getpos("'<"))
137 call assert_equal([0, 2, 12, 0], getpos("'>"))
138 call cursor(1, 4)
139 call feedkeys("\<S-C-End>y", 'xt')
140 call assert_equal([0, 1, 4, 0], getpos("'<"))
141 call assert_equal([0, 3, 13, 0], getpos("'>"))
142 " Test for <S-C-Left> and <S-C-Right>
143 call cursor(2, 5)
144 call feedkeys("\<S-C-Right>y", 'xt')
145 call assert_equal([0, 2, 5, 0], getpos("'<"))
146 call assert_equal([0, 2, 9, 0], getpos("'>"))
147 call cursor(2, 9)
148 call feedkeys("\<S-C-Left>y", 'xt')
149 call assert_equal([0, 2, 5, 0], getpos("'<"))
150 call assert_equal([0, 2, 9, 0], getpos("'>"))
151
152 set keymodel&
153
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200154 " clean up
155 bw!
156endfunc
157
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100158func Test_normal03_join()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200159 " basic join test
160 call Setup_NewWindow()
161 50
162 norm! VJ
163 call assert_equal('50 51', getline('.'))
164 $
165 norm! J
166 call assert_equal('100', getline('.'))
167 $
168 norm! V9-gJ
169 call assert_equal('919293949596979899100', getline('.'))
170 call setline(1, range(1,100))
171 $
172 :j 10
173 call assert_equal('100', getline('.'))
Bram Moolenaar004a6782020-04-11 17:09:31 +0200174 call assert_beeps('normal GVJ')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200175 " clean up
176 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200177endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200178
Bram Moolenaar004a6782020-04-11 17:09:31 +0200179" basic filter test
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100180func Test_normal04_filter()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200181 " only test on non windows platform
Bram Moolenaar004a6782020-04-11 17:09:31 +0200182 CheckNotMSWindows
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200183 call Setup_NewWindow()
184 1
185 call feedkeys("!!sed -e 's/^/| /'\n", 'tx')
186 call assert_equal('| 1', getline('.'))
187 90
188 :sil :!echo one
189 call feedkeys('.', 'tx')
190 call assert_equal('| 90', getline('.'))
191 95
192 set cpo+=!
193 " 2 <CR>, 1: for executing the command,
194 " 2: clear hit-enter-prompt
195 call feedkeys("!!\n", 'tx')
196 call feedkeys(":!echo one\n\n", 'tx')
197 call feedkeys(".", 'tx')
198 call assert_equal('one', getline('.'))
199 set cpo-=!
200 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200201endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200202
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100203func Test_normal05_formatexpr()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200204 " basic formatexpr test
205 call Setup_NewWindow()
206 %d_
207 call setline(1, ['here: 1 ', '2', 'here: 3 ', '4', 'not here: '])
208 1
209 set formatexpr=MyFormatExpr()
210 norm! gqG
211 call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here: '], getline(1,'$'))
212 set formatexpr=
213 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200214endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200215
Bram Moolenaard77f9d52016-09-04 15:13:39 +0200216func Test_normal05_formatexpr_newbuf()
217 " Edit another buffer in the 'formatexpr' function
218 new
219 func! Format()
220 edit another
221 endfunc
222 set formatexpr=Format()
223 norm gqG
224 bw!
225 set formatexpr=
226endfunc
227
228func Test_normal05_formatexpr_setopt()
229 " Change the 'formatexpr' value in the function
230 new
231 func! Format()
232 set formatexpr=
233 endfunc
234 set formatexpr=Format()
235 norm gqG
236 bw!
237 set formatexpr=
238endfunc
239
Bram Moolenaar2eaeaf32020-05-03 16:04:43 +0200240" When 'formatexpr' returns non-zero, internal formatting is used.
241func Test_normal_formatexpr_returns_nonzero()
242 new
243 call setline(1, ['one', 'two'])
244 func! Format()
245 return 1
246 endfunc
247 setlocal formatexpr=Format()
248 normal VGgq
249 call assert_equal(['one two'], getline(1, '$'))
250 setlocal formatexpr=
251 delfunc Format
252 close!
253endfunc
254
Bram Moolenaar004a6782020-04-11 17:09:31 +0200255" basic test for formatprg
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100256func Test_normal06_formatprg()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200257 " only test on non windows platform
Bram Moolenaar004a6782020-04-11 17:09:31 +0200258 CheckNotMSWindows
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100259
260 " uses sed to number non-empty lines
261 call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/ /', '}'''], 'Xsed_format.sh')
262 call system('chmod +x ./Xsed_format.sh')
263 let text = ['a', '', 'c', '', ' ', 'd', 'e']
264 let expected = ['1 a', '', '3 c', '', '5 ', '6 d', '7 e']
265
266 10new
267 call setline(1, text)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200268 set formatprg=./Xsed_format.sh
269 norm! gggqG
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100270 call assert_equal(expected, getline(1, '$'))
Bram Moolenaar004a6782020-04-11 17:09:31 +0200271 %d
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100272
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100273 call setline(1, text)
274 set formatprg=donothing
275 setlocal formatprg=./Xsed_format.sh
276 norm! gggqG
277 call assert_equal(expected, getline(1, '$'))
Bram Moolenaar004a6782020-04-11 17:09:31 +0200278 %d
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100279
Bram Moolenaar004a6782020-04-11 17:09:31 +0200280 " Check for the command-line ranges added to 'formatprg'
281 set formatprg=cat
282 call setline(1, ['one', 'two', 'three', 'four', 'five'])
283 call feedkeys('gggqG', 'xt')
284 call assert_equal('.,$!cat', @:)
285 call feedkeys('2Ggq2j', 'xt')
286 call assert_equal('.,.+2!cat', @:)
287
288 bw!
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200289 " clean up
290 set formatprg=
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100291 setlocal formatprg=
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200292 call delete('Xsed_format.sh')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200293endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200294
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100295func Test_normal07_internalfmt()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200296 " basic test for internal formmatter to textwidth of 12
297 let list=range(1,11)
298 call map(list, 'v:val." "')
299 10new
300 call setline(1, list)
301 set tw=12
Bram Moolenaar004a6782020-04-11 17:09:31 +0200302 norm! ggVGgq
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200303 call assert_equal(['1 2 3', '4 5 6', '7 8 9', '10 11 '], getline(1, '$'))
304 " clean up
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100305 set tw=0
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200306 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200307endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200308
Bram Moolenaar004a6782020-04-11 17:09:31 +0200309" basic tests for foldopen/folddelete
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100310func Test_normal08_fold()
Bram Moolenaar004a6782020-04-11 17:09:31 +0200311 CheckFeature folding
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200312 call Setup_NewWindow()
313 50
314 setl foldenable fdm=marker
315 " First fold
316 norm! V4jzf
317 " check that folds have been created
318 call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54))
319 " Second fold
320 46
321 norm! V10jzf
322 " check that folds have been created
323 call assert_equal('46/*{{{*/', getline(46))
324 call assert_equal('60/*}}}*/', getline(60))
325 norm! k
326 call assert_equal('45', getline('.'))
327 norm! j
328 call assert_equal('46/*{{{*/', getline('.'))
329 norm! j
330 call assert_equal('61', getline('.'))
331 norm! k
332 " open a fold
333 norm! Vzo
334 norm! k
335 call assert_equal('45', getline('.'))
336 norm! j
337 call assert_equal('46/*{{{*/', getline('.'))
338 norm! j
339 call assert_equal('47', getline('.'))
340 norm! k
341 norm! zcVzO
342 call assert_equal('46/*{{{*/', getline('.'))
343 norm! j
344 call assert_equal('47', getline('.'))
345 norm! j
346 call assert_equal('48', getline('.'))
347 norm! j
348 call assert_equal('49', getline('.'))
349 norm! j
350 call assert_equal('50/*{{{*/', getline('.'))
351 norm! j
352 call assert_equal('51', getline('.'))
353 " delete folds
354 :46
355 " collapse fold
356 norm! V14jzC
357 " delete all folds recursively
358 norm! VzD
359 call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60))
360
361 " clean up
362 setl nofoldenable fdm=marker
363 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200364endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200365
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100366func Test_normal09_operatorfunc()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200367 " Test operatorfunc
368 call Setup_NewWindow()
369 " Add some spaces for counting
370 50,60s/$/ /
371 unlet! g:a
372 let g:a=0
373 nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@
374 vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
375 50
376 norm V2j,,
377 call assert_equal(6, g:a)
378 norm V,,
379 call assert_equal(2, g:a)
380 norm ,,l
381 call assert_equal(0, g:a)
382 50
383 exe "norm 0\<c-v>10j2l,,"
384 call assert_equal(11, g:a)
385 50
386 norm V10j,,
387 call assert_equal(22, g:a)
388
Yegappan Lakshmanan777175b2021-11-18 22:08:57 +0000389 " Use a lambda function for 'opfunc'
390 unmap <buffer> ,,
391 call cursor(1, 1)
392 let g:a=0
393 nmap <buffer><silent> ,, :set opfunc={type\ ->\ CountSpaces(type)}<CR>g@
394 vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
395 50
396 norm V2j,,
397 call assert_equal(6, g:a)
398 norm V,,
399 call assert_equal(2, g:a)
400 norm ,,l
401 call assert_equal(0, g:a)
402 50
403 exe "norm 0\<c-v>10j2l,,"
404 call assert_equal(11, g:a)
405 50
406 norm V10j,,
407 call assert_equal(22, g:a)
408
409 " use a partial function for 'opfunc'
410 let g:OpVal = 0
411 func! Test_opfunc1(x, y, type)
412 let g:OpVal = a:x + a:y
413 endfunc
414 set opfunc=function('Test_opfunc1',\ [5,\ 7])
415 normal! g@l
416 call assert_equal(12, g:OpVal)
417 " delete the function and try to use g@
418 delfunc Test_opfunc1
419 call test_garbagecollect_now()
420 call assert_fails('normal! g@l', 'E117:')
421 set opfunc=
422
423 " use a funcref for 'opfunc'
424 let g:OpVal = 0
425 func! Test_opfunc2(x, y, type)
426 let g:OpVal = a:x + a:y
427 endfunc
428 set opfunc=funcref('Test_opfunc2',\ [4,\ 3])
429 normal! g@l
430 call assert_equal(7, g:OpVal)
431 " delete the function and try to use g@
432 delfunc Test_opfunc2
433 call test_garbagecollect_now()
434 call assert_fails('normal! g@l', 'E933:')
435 set opfunc=
436
437 " Try to use a function with two arguments for 'operatorfunc'
438 let g:OpVal = 0
439 func! Test_opfunc3(x, y)
440 let g:OpVal = 4
441 endfunc
442 set opfunc=Test_opfunc3
443 call assert_fails('normal! g@l', 'E119:')
444 call assert_equal(0, g:OpVal)
445 set opfunc=
446 delfunc Test_opfunc3
447 unlet g:OpVal
448
449 " Try to use a lambda function with two arguments for 'operatorfunc'
450 set opfunc={x,\ y\ ->\ 'done'}
451 call assert_fails('normal! g@l', 'E119:')
452
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200453 " clean up
454 unmap <buffer> ,,
455 set opfunc=
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100456 unlet! g:a
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200457 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200458endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200459
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100460func Test_normal09a_operatorfunc()
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100461 " Test operatorfunc
462 call Setup_NewWindow()
463 " Add some spaces for counting
464 50,60s/$/ /
465 unlet! g:opt
466 set linebreak
467 nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@
468 50
469 norm ,,j
470 exe "bd!" g:bufnr
471 call assert_true(&linebreak)
472 call assert_equal(g:opt, &linebreak)
473 set nolinebreak
474 norm ,,j
475 exe "bd!" g:bufnr
476 call assert_false(&linebreak)
477 call assert_equal(g:opt, &linebreak)
478
479 " clean up
480 unmap <buffer> ,,
481 set opfunc=
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200482 call assert_fails('normal Vg@', 'E774:')
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100483 bw!
484 unlet! g:opt
485endfunc
486
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100487func Test_normal10_expand()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200488 " Test for expand()
489 10new
490 call setline(1, ['1', 'ifooar,,cbar'])
491 2
492 norm! $
Bram Moolenaar65f08472017-09-10 18:16:20 +0200493 call assert_equal('cbar', expand('<cword>'))
494 call assert_equal('ifooar,,cbar', expand('<cWORD>'))
495
496 call setline(1, ['prx = list[idx];'])
497 1
498 let expected = ['', 'prx', 'prx', 'prx',
499 \ 'list', 'list', 'list', 'list', 'list', 'list', 'list',
500 \ 'idx', 'idx', 'idx', 'idx',
501 \ 'list[idx]',
502 \ '];',
503 \ ]
504 for i in range(1, 16)
505 exe 'norm ' . i . '|'
506 call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i)
507 endfor
508
Bram Moolenaard7e5e942020-10-07 16:54:52 +0200509 " Test for <cexpr> in state.val and ptr->val
510 call setline(1, 'x = state.val;')
511 call cursor(1, 10)
512 call assert_equal('state.val', expand('<cexpr>'))
513 call setline(1, 'x = ptr->val;')
514 call cursor(1, 9)
515 call assert_equal('ptr->val', expand('<cexpr>'))
516
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100517 if executable('echo')
518 " Test expand(`...`) i.e. backticks command expansion.
Bram Moolenaar077ff432019-10-28 00:42:21 +0100519 call assert_equal('abcde', expand('`echo abcde`'))
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100520 endif
521
522 " Test expand(`=...`) i.e. backticks expression expansion
523 call assert_equal('5', expand('`=2+3`'))
Bram Moolenaar8b633132020-03-20 18:20:51 +0100524 call assert_equal('3.14', expand('`=3.14`'))
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100525
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200526 " clean up
527 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200528endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200529
Bram Moolenaard7e5e942020-10-07 16:54:52 +0200530" Test for expand() in latin1 encoding
531func Test_normal_expand_latin1()
532 new
533 let save_enc = &encoding
534 set encoding=latin1
535 call setline(1, 'val = item->color;')
536 call cursor(1, 11)
537 call assert_equal('color', expand("<cword>"))
538 call assert_equal('item->color', expand("<cexpr>"))
539 let &encoding = save_enc
540 bw!
541endfunc
542
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100543func Test_normal11_showcmd()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200544 " test for 'showcmd'
545 10new
546 exe "norm! ofoobar\<esc>"
547 call assert_equal(2, line('$'))
548 set showcmd
549 exe "norm! ofoobar2\<esc>"
550 call assert_equal(3, line('$'))
551 exe "norm! VAfoobar3\<esc>"
552 call assert_equal(3, line('$'))
553 exe "norm! 0d3\<del>2l"
554 call assert_equal('obar2foobar3', getline('.'))
Bram Moolenaard1ad99b2020-10-04 16:16:54 +0200555 " test for the visual block size displayed in the status line
556 call setline(1, ['aaaaa', 'bbbbb', 'ccccc'])
557 call feedkeys("ggl\<C-V>lljj", 'xt')
558 redraw!
559 call assert_match('3x3$', Screenline(&lines))
560 call feedkeys("\<C-V>", 'xt')
561 " test for visually selecting a multi-byte character
562 call setline(1, ["\U2206"])
563 call feedkeys("ggv", 'xt')
564 redraw!
565 call assert_match('1-3$', Screenline(&lines))
566 call feedkeys("v", 'xt')
Bram Moolenaard7e5e942020-10-07 16:54:52 +0200567 " test for visually selecting the end of line
568 call setline(1, ["foobar"])
569 call feedkeys("$vl", 'xt')
570 redraw!
571 call assert_match('2$', Screenline(&lines))
572 call feedkeys("y", 'xt')
573 call assert_equal("r\n", @")
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200574 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200575endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200576
Bram Moolenaar1671f442020-03-10 07:48:13 +0100577" Test for nv_error and normal command errors
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100578func Test_normal12_nv_error()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200579 10new
580 call setline(1, range(1,5))
581 " should not do anything, just beep
Bram Moolenaarf5f1e102020-03-08 05:13:15 +0100582 call assert_beeps('exe "norm! <c-k>"')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200583 call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +0100584 call assert_beeps('normal! G2dd')
585 call assert_beeps("normal! g\<C-A>")
586 call assert_beeps("normal! g\<C-X>")
587 call assert_beeps("normal! g\<C-B>")
Bram Moolenaar1671f442020-03-10 07:48:13 +0100588 call assert_beeps("normal! vQ\<Esc>")
589 call assert_beeps("normal! 2[[")
590 call assert_beeps("normal! 2]]")
591 call assert_beeps("normal! 2[]")
592 call assert_beeps("normal! 2][")
593 call assert_beeps("normal! 4[z")
594 call assert_beeps("normal! 4]z")
595 call assert_beeps("normal! 4[c")
596 call assert_beeps("normal! 4]c")
597 call assert_beeps("normal! 200%")
598 call assert_beeps("normal! %")
599 call assert_beeps("normal! 2{")
600 call assert_beeps("normal! 2}")
601 call assert_beeps("normal! r\<Right>")
602 call assert_beeps("normal! 8ry")
603 call assert_beeps('normal! "@')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200604 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200605endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200606
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100607func Test_normal13_help()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200608 " Test for F1
609 call assert_equal(1, winnr())
610 call feedkeys("\<f1>", 'txi')
611 call assert_match('help\.txt', bufname('%'))
612 call assert_equal(2, winnr('$'))
613 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200614endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200615
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100616func Test_normal14_page()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200617 " basic test for Ctrl-F and Ctrl-B
618 call Setup_NewWindow()
619 exe "norm! \<c-f>"
620 call assert_equal('9', getline('.'))
621 exe "norm! 2\<c-f>"
622 call assert_equal('25', getline('.'))
623 exe "norm! 2\<c-b>"
624 call assert_equal('18', getline('.'))
625 1
626 set scrolloff=5
627 exe "norm! 2\<c-f>"
628 call assert_equal('21', getline('.'))
629 exe "norm! \<c-b>"
630 call assert_equal('13', getline('.'))
631 1
632 set scrolloff=99
633 exe "norm! \<c-f>"
634 call assert_equal('13', getline('.'))
635 set scrolloff=0
636 100
637 exe "norm! $\<c-b>"
638 call assert_equal('92', getline('.'))
639 call assert_equal([0, 92, 1, 0, 1], getcurpos())
640 100
641 set nostartofline
642 exe "norm! $\<c-b>"
643 call assert_equal('92', getline('.'))
644 call assert_equal([0, 92, 2, 0, 2147483647], getcurpos())
645 " cleanup
646 set startofline
647 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200648endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200649
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100650func Test_normal14_page_eol()
Bram Moolenaarbc54f3f2016-09-04 14:34:28 +0200651 10new
652 norm oxxxxxxx
653 exe "norm 2\<c-f>"
654 " check with valgrind that cursor is put back in column 1
655 exe "norm 2\<c-b>"
656 bw!
657endfunc
658
Bram Moolenaar1671f442020-03-10 07:48:13 +0100659" Test for errors with z command
660func Test_normal_z_error()
661 call assert_beeps('normal! z2p')
Christian Brabandt2fa93842021-05-30 22:17:25 +0200662 call assert_beeps('normal! zq')
Bram Moolenaar1671f442020-03-10 07:48:13 +0100663endfunc
664
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100665func Test_normal15_z_scroll_vert()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200666 " basic test for z commands that scroll the window
667 call Setup_NewWindow()
668 100
669 norm! >>
670 " Test for z<cr>
671 exe "norm! z\<cr>"
672 call assert_equal(' 100', getline('.'))
673 call assert_equal(100, winsaveview()['topline'])
674 call assert_equal([0, 100, 2, 0, 9], getcurpos())
675
676 " Test for zt
677 21
678 norm! >>0zt
679 call assert_equal(' 21', getline('.'))
680 call assert_equal(21, winsaveview()['topline'])
681 call assert_equal([0, 21, 1, 0, 8], getcurpos())
682
683 " Test for zb
684 30
685 norm! >>$ztzb
686 call assert_equal(' 30', getline('.'))
687 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
688 call assert_equal([0, 30, 3, 0, 2147483647], getcurpos())
689
690 " Test for z-
691 1
692 30
693 norm! 0z-
694 call assert_equal(' 30', getline('.'))
695 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
696 call assert_equal([0, 30, 2, 0, 9], getcurpos())
697
698 " Test for z{height}<cr>
699 call assert_equal(10, winheight(0))
700 exe "norm! z12\<cr>"
701 call assert_equal(12, winheight(0))
702 exe "norm! z10\<cr>"
703 call assert_equal(10, winheight(0))
704
705 " Test for z.
706 1
707 21
708 norm! 0z.
709 call assert_equal(' 21', getline('.'))
710 call assert_equal(17, winsaveview()['topline'])
711 call assert_equal([0, 21, 2, 0, 9], getcurpos())
712
713 " Test for zz
714 1
715 21
716 norm! 0zz
717 call assert_equal(' 21', getline('.'))
718 call assert_equal(17, winsaveview()['topline'])
719 call assert_equal([0, 21, 1, 0, 8], getcurpos())
720
721 " Test for z+
722 11
723 norm! zt
724 norm! z+
725 call assert_equal(' 21', getline('.'))
726 call assert_equal(21, winsaveview()['topline'])
727 call assert_equal([0, 21, 2, 0, 9], getcurpos())
728
729 " Test for [count]z+
730 1
731 norm! 21z+
732 call assert_equal(' 21', getline('.'))
733 call assert_equal(21, winsaveview()['topline'])
734 call assert_equal([0, 21, 2, 0, 9], getcurpos())
735
Bram Moolenaar8a9bc952020-10-02 18:48:07 +0200736 " Test for z+ with [count] greater than buffer size
737 1
738 norm! 1000z+
739 call assert_equal(' 100', getline('.'))
740 call assert_equal(100, winsaveview()['topline'])
741 call assert_equal([0, 100, 2, 0, 9], getcurpos())
742
743 " Test for z+ from the last buffer line
744 norm! Gz.z+
745 call assert_equal(' 100', getline('.'))
746 call assert_equal(100, winsaveview()['topline'])
747 call assert_equal([0, 100, 2, 0, 9], getcurpos())
748
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200749 " Test for z^
750 norm! 22z+0
751 norm! z^
752 call assert_equal(' 21', getline('.'))
753 call assert_equal(12, winsaveview()['topline'])
754 call assert_equal([0, 21, 2, 0, 9], getcurpos())
755
Bram Moolenaar8a9bc952020-10-02 18:48:07 +0200756 " Test for z^ from first buffer line
757 norm! ggz^
758 call assert_equal('1', getline('.'))
759 call assert_equal(1, winsaveview()['topline'])
760 call assert_equal([0, 1, 1, 0, 1], getcurpos())
761
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200762 " Test for [count]z^
763 1
764 norm! 30z^
765 call assert_equal(' 21', getline('.'))
766 call assert_equal(12, winsaveview()['topline'])
767 call assert_equal([0, 21, 2, 0, 9], getcurpos())
768
769 " cleanup
770 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200771endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200772
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100773func Test_normal16_z_scroll_hor()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200774 " basic test for z commands that scroll the window
775 10new
776 15vsp
777 set nowrap listchars=
778 let lineA='abcdefghijklmnopqrstuvwxyz'
779 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
780 $put =lineA
781 $put =lineB
782 1d
783
Bram Moolenaar1671f442020-03-10 07:48:13 +0100784 " Test for zl and zh with a count
785 norm! 0z10l
786 call assert_equal([11, 1], [col('.'), wincol()])
787 norm! z4h
788 call assert_equal([11, 5], [col('.'), wincol()])
789 normal! 2gg
790
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200791 " Test for zl
792 1
793 norm! 5zl
794 call assert_equal(lineA, getline('.'))
795 call assert_equal(6, col('.'))
796 call assert_equal(5, winsaveview()['leftcol'])
797 norm! yl
798 call assert_equal('f', @0)
799
800 " Test for zh
801 norm! 2zh
802 call assert_equal(lineA, getline('.'))
803 call assert_equal(6, col('.'))
804 norm! yl
805 call assert_equal('f', @0)
806 call assert_equal(3, winsaveview()['leftcol'])
807
808 " Test for zL
809 norm! zL
810 call assert_equal(11, col('.'))
811 norm! yl
812 call assert_equal('k', @0)
813 call assert_equal(10, winsaveview()['leftcol'])
814 norm! 2zL
815 call assert_equal(25, col('.'))
816 norm! yl
817 call assert_equal('y', @0)
818 call assert_equal(24, winsaveview()['leftcol'])
819
820 " Test for zH
821 norm! 2zH
822 call assert_equal(25, col('.'))
823 call assert_equal(10, winsaveview()['leftcol'])
824 norm! yl
825 call assert_equal('y', @0)
826
827 " Test for zs
828 norm! $zs
829 call assert_equal(26, col('.'))
830 call assert_equal(25, winsaveview()['leftcol'])
831 norm! yl
832 call assert_equal('z', @0)
833
834 " Test for ze
835 norm! ze
836 call assert_equal(26, col('.'))
837 call assert_equal(11, winsaveview()['leftcol'])
838 norm! yl
839 call assert_equal('z', @0)
840
Bram Moolenaar8a9bc952020-10-02 18:48:07 +0200841 " Test for zs and ze with folds
842 %fold
843 norm! $zs
844 call assert_equal(26, col('.'))
845 call assert_equal(0, winsaveview()['leftcol'])
846 norm! yl
847 call assert_equal('z', @0)
848 norm! ze
849 call assert_equal(26, col('.'))
850 call assert_equal(0, winsaveview()['leftcol'])
851 norm! yl
852 call assert_equal('z', @0)
853
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200854 " cleanup
855 set wrap listchars=eol:$
856 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200857endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200858
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100859func Test_normal17_z_scroll_hor2()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200860 " basic test for z commands that scroll the window
861 " using 'sidescrolloff' setting
862 10new
863 20vsp
864 set nowrap listchars= sidescrolloff=5
865 let lineA='abcdefghijklmnopqrstuvwxyz'
866 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
867 $put =lineA
868 $put =lineB
869 1d
870
871 " Test for zl
872 1
873 norm! 5zl
874 call assert_equal(lineA, getline('.'))
875 call assert_equal(11, col('.'))
876 call assert_equal(5, winsaveview()['leftcol'])
877 norm! yl
878 call assert_equal('k', @0)
879
880 " Test for zh
881 norm! 2zh
882 call assert_equal(lineA, getline('.'))
883 call assert_equal(11, col('.'))
884 norm! yl
885 call assert_equal('k', @0)
886 call assert_equal(3, winsaveview()['leftcol'])
887
888 " Test for zL
889 norm! 0zL
890 call assert_equal(16, col('.'))
891 norm! yl
892 call assert_equal('p', @0)
893 call assert_equal(10, winsaveview()['leftcol'])
894 norm! 2zL
895 call assert_equal(26, col('.'))
896 norm! yl
897 call assert_equal('z', @0)
898 call assert_equal(15, winsaveview()['leftcol'])
899
900 " Test for zH
901 norm! 2zH
902 call assert_equal(15, col('.'))
903 call assert_equal(0, winsaveview()['leftcol'])
904 norm! yl
905 call assert_equal('o', @0)
906
907 " Test for zs
908 norm! $zs
909 call assert_equal(26, col('.'))
910 call assert_equal(20, winsaveview()['leftcol'])
911 norm! yl
912 call assert_equal('z', @0)
913
914 " Test for ze
915 norm! ze
916 call assert_equal(26, col('.'))
917 call assert_equal(11, winsaveview()['leftcol'])
918 norm! yl
919 call assert_equal('z', @0)
920
921 " cleanup
922 set wrap listchars=eol:$ sidescrolloff=0
923 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200924endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200925
Bram Moolenaarbdd2c292020-06-22 21:34:30 +0200926" Test for commands that scroll the window horizontally. Test with folds.
927" H, M, L, CTRL-E, CTRL-Y, CTRL-U, CTRL-D, PageUp, PageDown commands
928func Test_vert_scroll_cmds()
Bram Moolenaar1671f442020-03-10 07:48:13 +0100929 15new
930 call setline(1, range(1, 100))
931 exe "normal! 30ggz\<CR>"
932 set foldenable
933 33,36fold
934 40,43fold
935 46,49fold
936 let h = winheight(0)
Bram Moolenaarbdd2c292020-06-22 21:34:30 +0200937
938 " Test for H, M and L commands
Bram Moolenaar1671f442020-03-10 07:48:13 +0100939 " Top of the screen = 30
940 " Folded lines = 9
941 " Bottom of the screen = 30 + h + 9 - 1
942 normal! 4L
943 call assert_equal(35 + h, line('.'))
944 normal! 4H
945 call assert_equal(33, line('.'))
Bram Moolenaarbdd2c292020-06-22 21:34:30 +0200946
Bram Moolenaar8a9bc952020-10-02 18:48:07 +0200947 " Test for using a large count value
948 %d
949 call setline(1, range(1, 4))
950 norm! 6H
951 call assert_equal(4, line('.'))
952
953 " Test for 'M' with folded lines
954 %d
955 call setline(1, range(1, 20))
956 1,5fold
957 norm! LM
958 call assert_equal(12, line('.'))
959
Bram Moolenaarbdd2c292020-06-22 21:34:30 +0200960 " Test for the CTRL-E and CTRL-Y commands with folds
961 %d
962 call setline(1, range(1, 10))
963 3,5fold
964 exe "normal 6G3\<C-E>"
965 call assert_equal(6, line('w0'))
966 exe "normal 2\<C-Y>"
967 call assert_equal(2, line('w0'))
968
969 " Test for CTRL-Y on a folded line
970 %d
971 call setline(1, range(1, 100))
972 exe (h + 2) .. "," .. (h + 4) .. "fold"
973 exe h + 5
974 normal z-
975 exe "normal \<C-Y>\<C-Y>"
976 call assert_equal(h + 1, line('w$'))
977
Bram Moolenaard1ad99b2020-10-04 16:16:54 +0200978 " Test for CTRL-Y from the first line and CTRL-E from the last line
979 %d
980 set scrolloff=2
981 call setline(1, range(1, 4))
982 exe "normal gg\<C-Y>"
983 call assert_equal(1, line('w0'))
984 call assert_equal(1, line('.'))
985 exe "normal G4\<C-E>\<C-E>"
986 call assert_equal(4, line('w$'))
987 call assert_equal(4, line('.'))
988 set scrolloff&
989
Bram Moolenaarbdd2c292020-06-22 21:34:30 +0200990 " Using <PageUp> and <PageDown> in an empty buffer should beep
991 %d
992 call assert_beeps('exe "normal \<PageUp>"')
993 call assert_beeps('exe "normal \<C-B>"')
994 call assert_beeps('exe "normal \<PageDown>"')
995 call assert_beeps('exe "normal \<C-F>"')
996
997 " Test for <C-U> and <C-D> with fold
998 %d
999 call setline(1, range(1, 100))
1000 10,35fold
1001 set scroll=10
1002 exe "normal \<C-D>"
1003 call assert_equal(36, line('.'))
1004 exe "normal \<C-D>"
1005 call assert_equal(46, line('.'))
1006 exe "normal \<C-U>"
1007 call assert_equal(36, line('.'))
1008 exe "normal \<C-U>"
1009 call assert_equal(10, line('.'))
1010 exe "normal \<C-U>"
1011 call assert_equal(1, line('.'))
1012 set scroll&
1013
1014 " Test for scrolling to the top of the file with <C-U> and a fold
1015 10
1016 normal ztL
1017 exe "normal \<C-U>\<C-U>"
1018 call assert_equal(1, line('w0'))
1019
1020 " Test for CTRL-D on a folded line
1021 %d
1022 call setline(1, range(1, 100))
1023 50,100fold
1024 75
1025 normal z-
1026 exe "normal \<C-D>"
1027 call assert_equal(50, line('.'))
1028 call assert_equal(100, line('w$'))
1029 normal z.
1030 let lnum = winline()
1031 exe "normal \<C-D>"
1032 call assert_equal(lnum, winline())
1033 call assert_equal(50, line('.'))
1034 normal zt
1035 exe "normal \<C-D>"
1036 call assert_equal(50, line('w0'))
1037
Bram Moolenaard1ad99b2020-10-04 16:16:54 +02001038 " Test for <S-CR>. Page down.
1039 %d
1040 call setline(1, range(1, 100))
1041 call feedkeys("\<S-CR>", 'xt')
1042 call assert_equal(14, line('w0'))
1043 call assert_equal(28, line('w$'))
1044
1045 " Test for <S-->. Page up.
1046 call feedkeys("\<S-->", 'xt')
1047 call assert_equal(1, line('w0'))
1048 call assert_equal(15, line('w$'))
1049
Bram Moolenaar1671f442020-03-10 07:48:13 +01001050 set foldenable&
1051 close!
1052endfunc
1053
Bram Moolenaar777e7c22021-10-25 17:07:04 +01001054func Test_scroll_in_ex_mode()
1055 " This was using invalid memory because w_botline was invalid.
1056 let lines =<< trim END
1057 diffsplit
1058 norm os00(
1059 call writefile(['done'], 'Xdone')
1060 qa!
1061 END
1062 call writefile(lines, 'Xscript')
1063 call assert_equal(1, RunVim([], [], '--clean -X -Z -e -s -S Xscript'))
1064 call assert_equal(['done'], readfile('Xdone'))
1065
1066 call delete('Xscript')
1067 call delete('Xdone')
1068endfunc
1069
Bram Moolenaarbdd2c292020-06-22 21:34:30 +02001070" Test for the 'sidescroll' option
1071func Test_sidescroll_opt()
1072 new
1073 20vnew
1074
1075 " scroll by 2 characters horizontally
1076 set sidescroll=2 nowrap
1077 call setline(1, repeat('a', 40))
1078 normal g$l
1079 call assert_equal(19, screenpos(0, 1, 21).col)
1080 normal l
1081 call assert_equal(20, screenpos(0, 1, 22).col)
1082 normal g0h
1083 call assert_equal(2, screenpos(0, 1, 2).col)
1084 call assert_equal(20, screenpos(0, 1, 20).col)
1085
1086 " when 'sidescroll' is 0, cursor positioned at the center
1087 set sidescroll=0
1088 normal g$l
1089 call assert_equal(11, screenpos(0, 1, 21).col)
1090 normal g0h
1091 call assert_equal(10, screenpos(0, 1, 10).col)
1092
1093 %bw!
1094 set wrap& sidescroll&
1095endfunc
1096
Bram Moolenaar004a6782020-04-11 17:09:31 +02001097" basic tests for foldopen/folddelete
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001098func Test_normal18_z_fold()
Bram Moolenaar004a6782020-04-11 17:09:31 +02001099 CheckFeature folding
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001100 call Setup_NewWindow()
1101 50
1102 setl foldenable fdm=marker foldlevel=5
1103
Bram Moolenaar1671f442020-03-10 07:48:13 +01001104 call assert_beeps('normal! zj')
1105 call assert_beeps('normal! zk')
1106
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001107 " Test for zF
1108 " First fold
1109 norm! 4zF
1110 " check that folds have been created
1111 call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53))
1112
1113 " Test for zd
1114 51
1115 norm! 2zF
1116 call assert_equal(2, foldlevel('.'))
1117 norm! kzd
1118 call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53))
1119 norm! j
1120 call assert_equal(1, foldlevel('.'))
1121
1122 " Test for zD
1123 " also deletes partially selected folds recursively
1124 51
1125 norm! zF
1126 call assert_equal(2, foldlevel('.'))
1127 norm! kV2jzD
1128 call assert_equal(['50', '51', '52', '53'], getline(50,53))
1129
1130 " Test for zE
1131 85
1132 norm! 4zF
1133 86
1134 norm! 2zF
1135 90
1136 norm! 4zF
1137 call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93))
1138 norm! zE
1139 call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93))
1140
1141 " Test for zn
1142 50
1143 set foldlevel=0
1144 norm! 2zF
1145 norm! zn
1146 norm! k
1147 call assert_equal('49', getline('.'))
1148 norm! j
1149 call assert_equal('50/*{{{*/', getline('.'))
1150 norm! j
1151 call assert_equal('51/*}}}*/', getline('.'))
1152 norm! j
1153 call assert_equal('52', getline('.'))
1154 call assert_equal(0, &foldenable)
1155
1156 " Test for zN
1157 49
1158 norm! zN
1159 call assert_equal('49', getline('.'))
1160 norm! j
1161 call assert_equal('50/*{{{*/', getline('.'))
1162 norm! j
1163 call assert_equal('52', getline('.'))
1164 call assert_equal(1, &foldenable)
1165
1166 " Test for zi
1167 norm! zi
1168 call assert_equal(0, &foldenable)
1169 norm! zi
1170 call assert_equal(1, &foldenable)
1171 norm! zi
1172 call assert_equal(0, &foldenable)
1173 norm! zi
1174 call assert_equal(1, &foldenable)
1175
1176 " Test for za
1177 50
1178 norm! za
1179 norm! k
1180 call assert_equal('49', getline('.'))
1181 norm! j
1182 call assert_equal('50/*{{{*/', getline('.'))
1183 norm! j
1184 call assert_equal('51/*}}}*/', getline('.'))
1185 norm! j
1186 call assert_equal('52', getline('.'))
1187 50
1188 norm! za
1189 norm! k
1190 call assert_equal('49', getline('.'))
1191 norm! j
1192 call assert_equal('50/*{{{*/', getline('.'))
1193 norm! j
1194 call assert_equal('52', getline('.'))
1195
1196 49
1197 norm! 5zF
1198 norm! k
1199 call assert_equal('48', getline('.'))
1200 norm! j
1201 call assert_equal('49/*{{{*/', getline('.'))
1202 norm! j
1203 call assert_equal('55', getline('.'))
1204 49
1205 norm! za
1206 call assert_equal('49/*{{{*/', getline('.'))
1207 norm! j
1208 call assert_equal('50/*{{{*/', getline('.'))
1209 norm! j
1210 call assert_equal('52', getline('.'))
1211 set nofoldenable
1212 " close fold and set foldenable
1213 norm! za
1214 call assert_equal(1, &foldenable)
1215
1216 50
1217 " have to use {count}za to open all folds and make the cursor visible
1218 norm! 2za
1219 norm! 2k
1220 call assert_equal('48', getline('.'))
1221 norm! j
1222 call assert_equal('49/*{{{*/', getline('.'))
1223 norm! j
1224 call assert_equal('50/*{{{*/', getline('.'))
1225 norm! j
1226 call assert_equal('51/*}}}*/', getline('.'))
1227 norm! j
1228 call assert_equal('52', getline('.'))
1229
1230 " Test for zA
1231 49
1232 set foldlevel=0
1233 50
1234 norm! zA
1235 norm! 2k
1236 call assert_equal('48', getline('.'))
1237 norm! j
1238 call assert_equal('49/*{{{*/', getline('.'))
1239 norm! j
1240 call assert_equal('50/*{{{*/', getline('.'))
1241 norm! j
1242 call assert_equal('51/*}}}*/', getline('.'))
1243 norm! j
1244 call assert_equal('52', getline('.'))
1245
Dominique Pelle923dce22021-11-21 11:36:04 +00001246 " zA on an opened fold when foldenable is not set
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001247 50
1248 set nofoldenable
1249 norm! zA
1250 call assert_equal(1, &foldenable)
1251 norm! k
1252 call assert_equal('48', getline('.'))
1253 norm! j
1254 call assert_equal('49/*{{{*/', getline('.'))
1255 norm! j
1256 call assert_equal('55', getline('.'))
1257
1258 " Test for zc
1259 norm! zE
1260 50
1261 norm! 2zF
1262 49
1263 norm! 5zF
1264 set nofoldenable
1265 50
1266 " There most likely is a bug somewhere:
1267 " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ
1268 " TODO: Should this only close the inner most fold or both folds?
1269 norm! zc
1270 call assert_equal(1, &foldenable)
1271 norm! k
1272 call assert_equal('48', getline('.'))
1273 norm! j
1274 call assert_equal('49/*{{{*/', getline('.'))
1275 norm! j
1276 call assert_equal('55', getline('.'))
1277 set nofoldenable
1278 50
1279 norm! Vjzc
1280 norm! k
1281 call assert_equal('48', getline('.'))
1282 norm! j
1283 call assert_equal('49/*{{{*/', getline('.'))
1284 norm! j
1285 call assert_equal('55', getline('.'))
1286
1287 " Test for zC
1288 set nofoldenable
1289 50
1290 norm! zCk
1291 call assert_equal('48', getline('.'))
1292 norm! j
1293 call assert_equal('49/*{{{*/', getline('.'))
1294 norm! j
1295 call assert_equal('55', getline('.'))
1296
1297 " Test for zx
1298 " 1) close folds at line 49-54
1299 set nofoldenable
1300 48
1301 norm! zx
1302 call assert_equal(1, &foldenable)
1303 norm! j
1304 call assert_equal('49/*{{{*/', getline('.'))
1305 norm! j
1306 call assert_equal('55', getline('.'))
1307
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001308 " 2) do not close fold under cursor
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001309 51
1310 set nofoldenable
1311 norm! zx
1312 call assert_equal(1, &foldenable)
1313 norm! 3k
1314 call assert_equal('48', getline('.'))
1315 norm! j
1316 call assert_equal('49/*{{{*/', getline('.'))
1317 norm! j
1318 call assert_equal('50/*{{{*/', getline('.'))
1319 norm! j
1320 call assert_equal('51/*}}}*/', getline('.'))
1321 norm! j
1322 call assert_equal('52', getline('.'))
1323 norm! j
1324 call assert_equal('53', getline('.'))
1325 norm! j
1326 call assert_equal('54/*}}}*/', getline('.'))
1327 norm! j
1328 call assert_equal('55', getline('.'))
1329
1330 " 3) close one level of folds
1331 48
1332 set nofoldenable
1333 set foldlevel=1
1334 norm! zx
1335 call assert_equal(1, &foldenable)
1336 call assert_equal('48', getline('.'))
1337 norm! j
1338 call assert_equal('49/*{{{*/', getline('.'))
1339 norm! j
1340 call assert_equal('50/*{{{*/', getline('.'))
1341 norm! j
1342 call assert_equal('52', getline('.'))
1343 norm! j
1344 call assert_equal('53', getline('.'))
1345 norm! j
1346 call assert_equal('54/*}}}*/', getline('.'))
1347 norm! j
1348 call assert_equal('55', getline('.'))
1349
1350 " Test for zX
1351 " Close all folds
1352 set foldlevel=0 nofoldenable
1353 50
1354 norm! zX
1355 call assert_equal(1, &foldenable)
1356 norm! k
1357 call assert_equal('48', getline('.'))
1358 norm! j
1359 call assert_equal('49/*{{{*/', getline('.'))
1360 norm! j
1361 call assert_equal('55', getline('.'))
1362
1363 " Test for zm
1364 50
1365 set nofoldenable foldlevel=2
1366 norm! zm
1367 call assert_equal(1, &foldenable)
1368 call assert_equal(1, &foldlevel)
1369 norm! zm
1370 call assert_equal(0, &foldlevel)
1371 norm! zm
1372 call assert_equal(0, &foldlevel)
1373 norm! k
1374 call assert_equal('48', getline('.'))
1375 norm! j
1376 call assert_equal('49/*{{{*/', getline('.'))
1377 norm! j
1378 call assert_equal('55', getline('.'))
1379
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02001380 " Test for zm with a count
1381 50
1382 set foldlevel=2
1383 norm! 3zm
1384 call assert_equal(0, &foldlevel)
1385 call assert_equal(49, foldclosed(line('.')))
1386
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001387 " Test for zM
1388 48
1389 set nofoldenable foldlevel=99
1390 norm! zM
1391 call assert_equal(1, &foldenable)
1392 call assert_equal(0, &foldlevel)
1393 call assert_equal('48', getline('.'))
1394 norm! j
1395 call assert_equal('49/*{{{*/', getline('.'))
1396 norm! j
1397 call assert_equal('55', getline('.'))
1398
1399 " Test for zr
1400 48
1401 set nofoldenable foldlevel=0
1402 norm! zr
1403 call assert_equal(0, &foldenable)
1404 call assert_equal(1, &foldlevel)
1405 set foldlevel=0 foldenable
1406 norm! zr
1407 call assert_equal(1, &foldenable)
1408 call assert_equal(1, &foldlevel)
1409 norm! zr
1410 call assert_equal(2, &foldlevel)
1411 call assert_equal('48', getline('.'))
1412 norm! j
1413 call assert_equal('49/*{{{*/', getline('.'))
1414 norm! j
1415 call assert_equal('50/*{{{*/', getline('.'))
1416 norm! j
1417 call assert_equal('51/*}}}*/', getline('.'))
1418 norm! j
1419 call assert_equal('52', getline('.'))
1420
1421 " Test for zR
1422 48
1423 set nofoldenable foldlevel=0
1424 norm! zR
1425 call assert_equal(0, &foldenable)
1426 call assert_equal(2, &foldlevel)
1427 set foldenable foldlevel=0
1428 norm! zR
1429 call assert_equal(1, &foldenable)
1430 call assert_equal(2, &foldlevel)
1431 call assert_equal('48', getline('.'))
1432 norm! j
1433 call assert_equal('49/*{{{*/', getline('.'))
1434 norm! j
1435 call assert_equal('50/*{{{*/', getline('.'))
1436 norm! j
1437 call assert_equal('51/*}}}*/', getline('.'))
1438 norm! j
1439 call assert_equal('52', getline('.'))
1440 call append(50, ['a /*{{{*/', 'b /*}}}*/'])
1441 48
1442 call assert_equal('48', getline('.'))
1443 norm! j
1444 call assert_equal('49/*{{{*/', getline('.'))
1445 norm! j
1446 call assert_equal('50/*{{{*/', getline('.'))
1447 norm! j
1448 call assert_equal('a /*{{{*/', getline('.'))
1449 norm! j
1450 call assert_equal('51/*}}}*/', getline('.'))
1451 norm! j
1452 call assert_equal('52', getline('.'))
1453 48
1454 norm! zR
1455 call assert_equal(1, &foldenable)
1456 call assert_equal(3, &foldlevel)
1457 call assert_equal('48', getline('.'))
1458 norm! j
1459 call assert_equal('49/*{{{*/', getline('.'))
1460 norm! j
1461 call assert_equal('50/*{{{*/', getline('.'))
1462 norm! j
1463 call assert_equal('a /*{{{*/', getline('.'))
1464 norm! j
1465 call assert_equal('b /*}}}*/', getline('.'))
1466 norm! j
1467 call assert_equal('51/*}}}*/', getline('.'))
1468 norm! j
1469 call assert_equal('52', getline('.'))
1470
1471 " clean up
1472 setl nofoldenable fdm=marker foldlevel=0
1473 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001474endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001475
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001476func Test_normal20_exmode()
Bram Moolenaar004a6782020-04-11 17:09:31 +02001477 " Reading from redirected file doesn't work on MS-Windows
1478 CheckNotMSWindows
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001479 call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript')
1480 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001481 call system(GetVimCommand() .. ' -e -s < Xscript Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001482 let a=readfile('Xfile2')
1483 call assert_equal(['1', 'foo', 'bar', '2'], a)
1484
1485 " clean up
1486 for file in ['Xfile', 'Xfile2', 'Xscript']
1487 call delete(file)
1488 endfor
1489 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001490endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001491
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001492func Test_normal21_nv_hat()
1493
1494 " Edit a fresh file and wipe the buffer list so that there is no alternate
1495 " file present. Next, check for the expected command failures.
1496 edit Xfoo | %bw
Bram Moolenaare2e40752020-09-04 21:18:46 +02001497 call assert_fails(':buffer #', 'E86:')
1498 call assert_fails(':execute "normal! \<C-^>"', 'E23:')
Bram Moolenaarb7e24832020-06-24 13:37:35 +02001499 call assert_fails("normal i\<C-R>#", 'E23:')
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001500
1501 " Test for the expected behavior when switching between two named buffers.
1502 edit Xfoo | edit Xbar
1503 call feedkeys("\<C-^>", 'tx')
1504 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1505 call feedkeys("\<C-^>", 'tx')
1506 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1507
1508 " Test for the expected behavior when only one buffer is named.
1509 enew | let l:nr = bufnr('%')
1510 call feedkeys("\<C-^>", 'tx')
1511 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1512 call feedkeys("\<C-^>", 'tx')
1513 call assert_equal('', bufname('%'))
1514 call assert_equal(l:nr, bufnr('%'))
1515
1516 " Test that no action is taken by "<C-^>" when an operator is pending.
1517 edit Xfoo
1518 call feedkeys("ci\<C-^>", 'tx')
1519 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1520
1521 %bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001522endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001523
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001524func Test_normal22_zet()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001525 " Test for ZZ
Bram Moolenaar0913a102016-09-03 19:11:59 +02001526 " let shell = &shell
1527 " let &shell = 'sh'
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001528 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001529 let args = ' -N -i NONE --noplugins -X --not-a-term'
1530 call system(GetVimCommand() .. args .. ' -c "%d" -c ":norm! ZZ" Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001531 let a = readfile('Xfile')
1532 call assert_equal([], a)
1533 " Test for ZQ
1534 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001535 call system(GetVimCommand() . args . ' -c "%d" -c ":norm! ZQ" Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001536 let a = readfile('Xfile')
1537 call assert_equal(['1', '2'], a)
1538
Bram Moolenaar1671f442020-03-10 07:48:13 +01001539 " Unsupported Z command
1540 call assert_beeps('normal! ZW')
1541
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001542 " clean up
1543 for file in ['Xfile']
1544 call delete(file)
1545 endfor
Bram Moolenaar0913a102016-09-03 19:11:59 +02001546 " let &shell = shell
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001547endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001548
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001549func Test_normal23_K()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001550 " Test for K command
1551 new
Bram Moolenaar426f3752016-11-04 21:22:37 +01001552 call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd'])
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001553 let k = &keywordprg
1554 set keywordprg=:help
1555 1
1556 norm! VK
1557 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1558 call assert_equal('help', &ft)
1559 call assert_match('\*version8.txt\*', getline('.'))
1560 helpclose
1561 norm! 0K
1562 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1563 call assert_equal('help', &ft)
Bram Moolenaarb1c91982018-05-17 17:04:55 +02001564 call assert_match('\*version8\.\d\*', getline('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001565 helpclose
1566
Bram Moolenaar426f3752016-11-04 21:22:37 +01001567 set keywordprg=:new
1568 set iskeyword+=%
1569 set iskeyword+=\|
1570 2
1571 norm! K
1572 call assert_equal('man', fnamemodify(bufname('%'), ':t'))
1573 bwipe!
1574 3
1575 norm! K
1576 call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t'))
1577 bwipe!
Bram Moolenaareb828d02016-11-05 19:54:01 +01001578 if !has('win32')
1579 4
1580 norm! K
1581 call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t'))
1582 bwipe!
1583 endif
Bram Moolenaar426f3752016-11-04 21:22:37 +01001584 set iskeyword-=%
1585 set iskeyword-=\|
1586
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02001587 " Test for specifying a count to K
1588 1
1589 com! -nargs=* Kprog let g:Kprog_Args = <q-args>
1590 set keywordprg=:Kprog
1591 norm! 3K
1592 call assert_equal('3 version8', g:Kprog_Args)
1593 delcom Kprog
1594
Bram Moolenaar0913a102016-09-03 19:11:59 +02001595 " Only expect "man" to work on Unix
1596 if !has("unix")
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001597 let &keywordprg = k
1598 bw!
1599 return
1600 endif
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001601
Bram Moolenaar9134f1e2019-11-29 20:26:13 +01001602 let not_gnu_man = has('mac') || has('bsd')
1603 if not_gnu_man
Dominique Pelle923dce22021-11-21 11:36:04 +00001604 " In macOS and BSD, the option for specifying a pager is different
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001605 set keywordprg=man\ -P\ cat
1606 else
1607 set keywordprg=man\ --pager=cat
1608 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001609 " Test for using man
1610 2
1611 let a = execute('unsilent norm! K')
Bram Moolenaar9134f1e2019-11-29 20:26:13 +01001612 if not_gnu_man
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001613 call assert_match("man -P cat 'man'", a)
1614 else
1615 call assert_match("man --pager=cat 'man'", a)
1616 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001617
Bram Moolenaar1671f442020-03-10 07:48:13 +01001618 " Error cases
1619 call setline(1, '#$#')
1620 call assert_fails('normal! ggK', 'E349:')
1621 call setline(1, '---')
1622 call assert_fails('normal! ggv2lK', 'E349:')
1623 call setline(1, ['abc', 'xyz'])
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001624 call assert_fails("normal! gg2lv2h\<C-]>", 'E433:')
Bram Moolenaar1671f442020-03-10 07:48:13 +01001625 call assert_beeps("normal! ggVjK")
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02001626 norm! V
1627 call assert_beeps("norm! cK")
Bram Moolenaar1671f442020-03-10 07:48:13 +01001628
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001629 " clean up
1630 let &keywordprg = k
1631 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001632endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001633
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001634func Test_normal24_rot13()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001635 " Testing for g?? g?g?
1636 new
1637 call append(0, 'abcdefghijklmnopqrstuvwxyzäüö')
1638 1
1639 norm! g??
1640 call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.'))
1641 norm! g?g?
1642 call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.'))
1643
1644 " clean up
1645 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001646endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001647
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001648func Test_normal25_tag()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01001649 CheckFeature quickfix
1650
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001651 " Testing for CTRL-] g CTRL-] g]
1652 " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-]
1653 h
1654 " Test for CTRL-]
1655 call search('\<x\>$')
1656 exe "norm! \<c-]>"
1657 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1658 norm! yiW
1659 call assert_equal("*x*", @0)
1660 exe ":norm \<c-o>"
1661
1662 " Test for g_CTRL-]
1663 call search('\<v_u\>$')
1664 exe "norm! g\<c-]>"
1665 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1666 norm! yiW
1667 call assert_equal("*v_u*", @0)
1668 exe ":norm \<c-o>"
1669
1670 " Test for g]
1671 call search('\<i_<Esc>$')
1672 let a = execute(":norm! g]")
1673 call assert_match('i_<Esc>.*insert.txt', a)
1674
1675 if !empty(exepath('cscope')) && has('cscope')
1676 " setting cscopetag changes how g] works
1677 set cst
1678 exe "norm! g]"
1679 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1680 norm! yiW
1681 call assert_equal("*i_<Esc>*", @0)
1682 exe ":norm \<c-o>"
1683 " Test for CTRL-W g]
1684 exe "norm! \<C-W>g]"
1685 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1686 norm! yiW
1687 call assert_equal("*i_<Esc>*", @0)
1688 call assert_equal(3, winnr('$'))
1689 helpclose
1690 set nocst
1691 endif
1692
1693 " Test for CTRL-W g]
1694 let a = execute("norm! \<C-W>g]")
1695 call assert_match('i_<Esc>.*insert.txt', a)
1696
1697 " Test for CTRL-W CTRL-]
1698 exe "norm! \<C-W>\<C-]>"
1699 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1700 norm! yiW
1701 call assert_equal("*i_<Esc>*", @0)
1702 call assert_equal(3, winnr('$'))
1703 helpclose
1704
1705 " Test for CTRL-W g CTRL-]
1706 exe "norm! \<C-W>g\<C-]>"
1707 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1708 norm! yiW
1709 call assert_equal("*i_<Esc>*", @0)
1710 call assert_equal(3, winnr('$'))
1711 helpclose
1712
1713 " clean up
1714 helpclose
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001715endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001716
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001717func Test_normal26_put()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001718 " Test for ]p ]P [p and [P
1719 new
1720 call append(0, ['while read LINE', 'do', ' ((count++))', ' if [ $? -ne 0 ]; then', " echo 'Error writing file'", ' fi', 'done'])
1721 1
1722 /Error/y a
1723 2
1724 norm! "a]pj"a[p
1725 call assert_equal(['do', "echo 'Error writing file'", " echo 'Error writing file'", ' ((count++))'], getline(2,5))
1726 1
1727 /^\s\{4}/
1728 exe "norm! \"a]P3Eldt'"
1729 exe "norm! j\"a[P2Eldt'"
1730 call assert_equal([' if [ $? -ne 0 ]; then', " echo 'Error writing'", " echo 'Error'", " echo 'Error writing file'", ' fi'], getline(6,10))
1731
1732 " clean up
1733 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001734endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001735
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001736func Test_normal27_bracket()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001737 " Test for [' [` ]' ]`
1738 call Setup_NewWindow()
1739 1,21s/.\+/ & b/
1740 1
1741 norm! $ma
1742 5
1743 norm! $mb
1744 10
1745 norm! $mc
1746 15
1747 norm! $md
1748 20
1749 norm! $me
1750
1751 " Test for ['
1752 9
1753 norm! 2['
1754 call assert_equal(' 1 b', getline('.'))
1755 call assert_equal(1, line('.'))
1756 call assert_equal(3, col('.'))
1757
1758 " Test for ]'
1759 norm! ]'
1760 call assert_equal(' 5 b', getline('.'))
1761 call assert_equal(5, line('.'))
1762 call assert_equal(3, col('.'))
1763
1764 " No mark after line 21, cursor moves to first non blank on current line
1765 21
1766 norm! $]'
1767 call assert_equal(' 21 b', getline('.'))
1768 call assert_equal(21, line('.'))
1769 call assert_equal(3, col('.'))
1770
1771 " Test for [`
1772 norm! 2[`
1773 call assert_equal(' 15 b', getline('.'))
1774 call assert_equal(15, line('.'))
1775 call assert_equal(8, col('.'))
1776
1777 " Test for ]`
1778 norm! ]`
1779 call assert_equal(' 20 b', getline('.'))
1780 call assert_equal(20, line('.'))
1781 call assert_equal(8, col('.'))
1782
1783 " clean up
1784 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001785endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001786
Bram Moolenaar1671f442020-03-10 07:48:13 +01001787" Test for ( and ) sentence movements
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001788func Test_normal28_parenthesis()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001789 new
1790 call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
1791
1792 $
1793 norm! d(
1794 call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$'))
1795 norm! 2d(
1796 call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$'))
1797 1
1798 norm! 0d)
1799 call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$'))
1800
1801 call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. '])
1802 $
1803 norm! $d(
1804 call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$'))
1805
Bram Moolenaar224a5f12020-04-28 20:29:07 +02001806 " Move to the next sentence from a paragraph macro
1807 %d
1808 call setline(1, ['.LP', 'blue sky!. blue sky.', 'blue sky. blue sky.'])
1809 call cursor(1, 1)
1810 normal )
1811 call assert_equal([2, 1], [line('.'), col('.')])
1812 normal )
1813 call assert_equal([2, 12], [line('.'), col('.')])
1814 normal ((
1815 call assert_equal([1, 1], [line('.'), col('.')])
1816
Bram Moolenaar1671f442020-03-10 07:48:13 +01001817 " It is an error if a next sentence is not found
1818 %d
1819 call setline(1, '.SH')
1820 call assert_beeps('normal )')
1821
Bram Moolenaar224a5f12020-04-28 20:29:07 +02001822 " If only dot is present, don't treat that as a sentence
1823 call setline(1, '. This is a sentence.')
1824 normal $((
1825 call assert_equal(3, col('.'))
1826
Bram Moolenaar1671f442020-03-10 07:48:13 +01001827 " Jumping to a fold should open the fold
1828 call setline(1, ['', '', 'one', 'two', 'three'])
1829 set foldenable
1830 2,$fold
1831 call feedkeys(')', 'xt')
1832 call assert_equal(3, line('.'))
1833 call assert_equal(1, foldlevel('.'))
1834 call assert_equal(-1, foldclosed('.'))
1835 set foldenable&
1836
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001837 " clean up
1838 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001839endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001840
Bram Moolenaar1671f442020-03-10 07:48:13 +01001841" Test for { and } paragraph movements
1842func Test_normal29_brace()
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001843 let text =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001844 A paragraph begins after each empty line, and also at each of a set of
1845 paragraph macros, specified by the pairs of characters in the 'paragraphs'
1846 option. The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to
1847 the macros ".IP", ".LP", etc. (These are nroff macros, so the dot must be in
1848 the first column). A section boundary is also a paragraph boundary.
1849 Note that a blank line (only containing white space) is NOT a paragraph
1850 boundary.
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001851
1852
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001853 Also note that this does not include a '{' or '}' in the first column. When
1854 the '{' flag is in 'cpoptions' then '{' in the first column is used as a
1855 paragraph boundary |posix|.
1856 {
1857 This is no paragraph
1858 unless the '{' is set
1859 in 'cpoptions'
1860 }
1861 .IP
1862 The nroff macros IP separates a paragraph
1863 That means, it must be a '.'
1864 followed by IP
1865 .LPIt does not matter, if afterwards some
1866 more characters follow.
1867 .SHAlso section boundaries from the nroff
1868 macros terminate a paragraph. That means
1869 a character like this:
1870 .NH
1871 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001872 [DATA]
1873
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001874 new
1875 call append(0, text)
1876 1
1877 norm! 0d2}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001878
1879 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001880 .IP
1881 The nroff macros IP separates a paragraph
1882 That means, it must be a '.'
1883 followed by IP
1884 .LPIt does not matter, if afterwards some
1885 more characters follow.
1886 .SHAlso section boundaries from the nroff
1887 macros terminate a paragraph. That means
1888 a character like this:
1889 .NH
1890 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001891
1892 [DATA]
1893 call assert_equal(expected, getline(1, '$'))
1894
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001895 norm! 0d}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001896
1897 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001898 .LPIt does not matter, if afterwards some
1899 more characters follow.
1900 .SHAlso section boundaries from the nroff
1901 macros terminate a paragraph. That means
1902 a character like this:
1903 .NH
1904 End of text here
1905
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001906 [DATA]
1907 call assert_equal(expected, getline(1, '$'))
1908
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001909 $
1910 norm! d{
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001911
1912 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001913 .LPIt does not matter, if afterwards some
1914 more characters follow.
1915 .SHAlso section boundaries from the nroff
1916 macros terminate a paragraph. That means
1917 a character like this:
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001918
1919 [DATA]
1920 call assert_equal(expected, getline(1, '$'))
1921
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001922 norm! d{
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001923
1924 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001925 .LPIt does not matter, if afterwards some
1926 more characters follow.
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001927
1928 [DATA]
1929 call assert_equal(expected, getline(1, '$'))
1930
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001931 " Test with { in cpooptions
1932 %d
1933 call append(0, text)
1934 set cpo+={
1935 1
1936 norm! 0d2}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001937
1938 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001939 {
1940 This is no paragraph
1941 unless the '{' is set
1942 in 'cpoptions'
1943 }
1944 .IP
1945 The nroff macros IP separates a paragraph
1946 That means, it must be a '.'
1947 followed by IP
1948 .LPIt does not matter, if afterwards some
1949 more characters follow.
1950 .SHAlso section boundaries from the nroff
1951 macros terminate a paragraph. That means
1952 a character like this:
1953 .NH
1954 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001955
1956 [DATA]
1957 call assert_equal(expected, getline(1, '$'))
1958
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001959 $
1960 norm! d}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001961
1962 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001963 {
1964 This is no paragraph
1965 unless the '{' is set
1966 in 'cpoptions'
1967 }
1968 .IP
1969 The nroff macros IP separates a paragraph
1970 That means, it must be a '.'
1971 followed by IP
1972 .LPIt does not matter, if afterwards some
1973 more characters follow.
1974 .SHAlso section boundaries from the nroff
1975 macros terminate a paragraph. That means
1976 a character like this:
1977 .NH
1978 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001979
1980 [DATA]
1981 call assert_equal(expected, getline(1, '$'))
1982
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001983 norm! gg}
1984 norm! d5}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001985
1986 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02001987 {
1988 This is no paragraph
1989 unless the '{' is set
1990 in 'cpoptions'
1991 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +02001992
1993 [DATA]
1994 call assert_equal(expected, getline(1, '$'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001995
Bram Moolenaar1671f442020-03-10 07:48:13 +01001996 " Jumping to a fold should open the fold
1997 %d
1998 call setline(1, ['', 'one', 'two', ''])
1999 set foldenable
2000 2,$fold
2001 call feedkeys('}', 'xt')
2002 call assert_equal(4, line('.'))
2003 call assert_equal(1, foldlevel('.'))
2004 call assert_equal(-1, foldclosed('.'))
2005 set foldenable&
2006
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002007 " clean up
2008 set cpo-={
2009 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002010endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002011
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02002012" Test for section movements
2013func Test_normal_section()
2014 new
2015 let lines =<< trim [END]
2016 int foo()
2017 {
2018 if (1)
2019 {
2020 a = 1;
2021 }
2022 }
2023 [END]
2024 call setline(1, lines)
2025
2026 " jumping to a folded line using [[ should open the fold
2027 2,3fold
2028 call cursor(5, 1)
2029 call feedkeys("[[", 'xt')
2030 call assert_equal(2, line('.'))
2031 call assert_equal(-1, foldclosedend(line('.')))
2032
2033 close!
2034endfunc
2035
Bram Moolenaard1ad99b2020-10-04 16:16:54 +02002036" Test for changing case using u, U, gu, gU and ~ (tilde) commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01002037func Test_normal30_changecase()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002038 new
2039 call append(0, 'This is a simple test: äüöß')
2040 norm! 1ggVu
2041 call assert_equal('this is a simple test: äüöß', getline('.'))
2042 norm! VU
2043 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
2044 norm! guu
2045 call assert_equal('this is a simple test: äüöss', getline('.'))
2046 norm! gUgU
2047 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
2048 norm! gugu
2049 call assert_equal('this is a simple test: äüöss', getline('.'))
2050 norm! gUU
2051 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
2052 norm! 010~
2053 call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.'))
2054 norm! V~
2055 call assert_equal('THIS IS A simple test: äüöss', getline('.'))
Bram Moolenaard1ad99b2020-10-04 16:16:54 +02002056 call assert_beeps('norm! c~')
2057 %d
2058 call assert_beeps('norm! ~')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002059
Bram Moolenaar1671f442020-03-10 07:48:13 +01002060 " Test for changing case across lines using 'whichwrap'
2061 call setline(1, ['aaaaaa', 'aaaaaa'])
2062 normal! gg10~
2063 call assert_equal(['AAAAAA', 'aaaaaa'], getline(1, 2))
2064 set whichwrap+=~
2065 normal! gg10~
2066 call assert_equal(['aaaaaa', 'AAAAaa'], getline(1, 2))
2067 set whichwrap&
2068
Bram Moolenaar3e72dca2021-05-29 16:30:12 +02002069 " try changing the case with a double byte encoding (DBCS)
2070 %bw!
2071 let enc = &enc
2072 set encoding=cp932
2073 call setline(1, "\u8470")
2074 normal ~
2075 normal gU$gu$gUgUg~g~gugu
2076 call assert_equal("\u8470", getline(1))
2077 let &encoding = enc
2078
Bram Moolenaar1671f442020-03-10 07:48:13 +01002079 " clean up
2080 bw!
2081endfunc
2082
2083" Turkish ASCII turns to multi-byte. On some systems Turkish locale
2084" is available but toupper()/tolower() don't do the right thing.
2085func Test_normal_changecase_turkish()
2086 new
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02002087 try
2088 lang tr_TR.UTF-8
2089 set casemap=
2090 let iupper = toupper('i')
2091 if iupper == "\u0130"
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02002092 call setline(1, 'iI')
2093 1normal gUU
2094 call assert_equal("\u0130I", getline(1))
2095 call assert_equal("\u0130I", toupper("iI"))
Bram Moolenaar3317d5e2017-04-08 19:12:06 +02002096
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02002097 call setline(1, 'iI')
2098 1normal guu
2099 call assert_equal("i\u0131", getline(1))
2100 call assert_equal("i\u0131", tolower("iI"))
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02002101 elseif iupper == "I"
Bram Moolenaar1cc48202017-04-09 13:41:59 +02002102 call setline(1, 'iI')
2103 1normal gUU
2104 call assert_equal("II", getline(1))
2105 call assert_equal("II", toupper("iI"))
2106
2107 call setline(1, 'iI')
2108 1normal guu
2109 call assert_equal("ii", getline(1))
2110 call assert_equal("ii", tolower("iI"))
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02002111 else
2112 call assert_true(false, "expected toupper('i') to be either 'I' or '\u0130'")
2113 endif
2114 set casemap&
2115 call setline(1, 'iI')
2116 1normal gUU
2117 call assert_equal("II", getline(1))
2118 call assert_equal("II", toupper("iI"))
Bram Moolenaar1cc48202017-04-09 13:41:59 +02002119
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02002120 call setline(1, 'iI')
2121 1normal guu
2122 call assert_equal("ii", getline(1))
2123 call assert_equal("ii", tolower("iI"))
2124
2125 lang en_US.UTF-8
2126 catch /E197:/
2127 " can't use Turkish locale
2128 throw 'Skipped: Turkish locale not available'
2129 endtry
Bram Moolenaar1671f442020-03-10 07:48:13 +01002130 close!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002131endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002132
Bram Moolenaar1671f442020-03-10 07:48:13 +01002133" Test for r (replace) command
2134func Test_normal31_r_cmd()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002135 new
2136 call append(0, 'This is a simple test: abcd')
2137 exe "norm! 1gg$r\<cr>"
2138 call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$'))
2139 exe "norm! 1gg2wlr\<cr>"
2140 call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$'))
2141 exe "norm! 2gg0W5r\<cr>"
2142 call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$'))
2143 set autoindent
2144 call setline(2, ['simple test: abc', ''])
2145 exe "norm! 2gg0W5r\<cr>"
2146 call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$'))
2147 exe "norm! 1ggVr\<cr>"
2148 call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1)))
2149 call setline(1, 'This is a')
2150 exe "norm! 1gg05rf"
2151 call assert_equal('fffffis a', getline(1))
2152
Bram Moolenaar1671f442020-03-10 07:48:13 +01002153 " When replacing characters, copy characters from above and below lines
2154 " using CTRL-Y and CTRL-E.
2155 " Different code paths are used for utf-8 and latin1 encodings
2156 set showmatch
2157 for enc in ['latin1', 'utf-8']
2158 enew!
2159 let &encoding = enc
2160 call setline(1, [' {a}', 'xxxxxxxxxx', ' [b]'])
2161 exe "norm! 2gg5r\<C-Y>l5r\<C-E>"
2162 call assert_equal(' {a}x [b]x', getline(2))
2163 endfor
2164 set showmatch&
2165
2166 " r command should fail in operator pending mode
2167 call assert_beeps('normal! cr')
2168
Bram Moolenaar004a6782020-04-11 17:09:31 +02002169 " replace a tab character in visual mode
2170 %d
2171 call setline(1, ["a\tb", "c\td", "e\tf"])
2172 normal gglvjjrx
2173 call assert_equal(['axx', 'xxx', 'xxf'], getline(1, '$'))
2174
Bram Moolenaard7e5e942020-10-07 16:54:52 +02002175 " replace with a multibyte character (with multiple composing characters)
2176 %d
2177 new
2178 call setline(1, 'aaa')
2179 exe "normal $ra\u0328\u0301"
2180 call assert_equal("aaa\u0328\u0301", getline(1))
2181
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002182 " clean up
2183 set noautoindent
2184 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002185endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002186
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002187" Test for g*, g#
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002188func Test_normal32_g_cmd1()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002189 new
2190 call append(0, ['abc.x_foo', 'x_foobar.abc'])
2191 1
2192 norm! $g*
2193 call assert_equal('x_foo', @/)
2194 call assert_equal('x_foobar.abc', getline('.'))
2195 norm! $g#
2196 call assert_equal('abc', @/)
2197 call assert_equal('abc.x_foo', getline('.'))
2198
2199 " clean up
2200 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002201endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002202
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002203" Test for g`, g;, g,, g&, gv, gk, gj, gJ, g0, g^, g_, gm, g$, gM, g CTRL-G,
2204" gi and gI commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01002205func Test_normal33_g_cmd2()
Bram Moolenaar004a6782020-04-11 17:09:31 +02002206 CheckFeature jumplist
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002207 call Setup_NewWindow()
2208 " Test for g`
2209 clearjumps
2210 norm! ma10j
2211 let a=execute(':jumps')
2212 " empty jumplist
2213 call assert_equal('>', a[-1:])
2214 norm! g`a
2215 call assert_equal('>', a[-1:])
2216 call assert_equal(1, line('.'))
2217 call assert_equal('1', getline('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002218 call cursor(10, 1)
2219 norm! g'a
2220 call assert_equal('>', a[-1:])
2221 call assert_equal(1, line('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002222
2223 " Test for g; and g,
2224 norm! g;
2225 " there is only one change in the changelist
2226 " currently, when we setup the window
2227 call assert_equal(2, line('.'))
Bram Moolenaare2e40752020-09-04 21:18:46 +02002228 call assert_fails(':norm! g;', 'E662:')
2229 call assert_fails(':norm! g,', 'E663:')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002230 let &ul=&ul
2231 call append('$', ['a', 'b', 'c', 'd'])
2232 let &ul=&ul
2233 call append('$', ['Z', 'Y', 'X', 'W'])
2234 let a = execute(':changes')
2235 call assert_match('2\s\+0\s\+2', a)
2236 call assert_match('101\s\+0\s\+a', a)
2237 call assert_match('105\s\+0\s\+Z', a)
2238 norm! 3g;
2239 call assert_equal(2, line('.'))
2240 norm! 2g,
2241 call assert_equal(105, line('.'))
2242
2243 " Test for g& - global substitute
2244 %d
2245 call setline(1, range(1,10))
2246 call append('$', ['a', 'b', 'c', 'd'])
2247 $s/\w/&&/g
2248 exe "norm! /[1-8]\<cr>"
2249 norm! g&
2250 call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$'))
2251
Bram Moolenaar1671f442020-03-10 07:48:13 +01002252 " Jumping to a fold using gg should open the fold
2253 set foldenable
2254 set foldopen+=jump
2255 5,8fold
2256 call feedkeys('6gg', 'xt')
2257 call assert_equal(1, foldlevel('.'))
2258 call assert_equal(-1, foldclosed('.'))
2259 set foldopen-=jump
2260 set foldenable&
2261
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002262 " Test for gv
2263 %d
2264 call append('$', repeat(['abcdefgh'], 8))
2265 exe "norm! 2gg02l\<c-v>2j2ly"
2266 call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1))
2267 " in visual mode, gv swaps current and last selected region
2268 exe "norm! G0\<c-v>4k4lgvd"
2269 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$'))
2270 exe "norm! G0\<c-v>4k4ly"
2271 exe "norm! gvood"
2272 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002273 " gv cannot be used in operator pending mode
2274 call assert_beeps('normal! cgv')
2275 " gv should beep without a previously selected visual area
2276 new
2277 call assert_beeps('normal! gv')
2278 close
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002279
2280 " Test for gk/gj
2281 %d
2282 15vsp
2283 set wrap listchars= sbr=
Bram Moolenaar74ede802021-05-29 19:18:01 +02002284 let lineA = 'abcdefghijklmnopqrstuvwxyz'
2285 let lineB = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
2286 let lineC = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002287 $put =lineA
2288 $put =lineB
2289
2290 norm! 3gg0dgk
2291 call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$'))
2292 set nu
2293 norm! 3gg0gjdgj
2294 call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
2295
2296 " Test for gJ
2297 norm! 2gggJ
2298 call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
2299 call assert_equal(16, col('.'))
2300 " shouldn't do anything
2301 norm! 10gJ
2302 call assert_equal(1, col('.'))
2303
2304 " Test for g0 g^ gm g$
2305 exe "norm! 2gg0gji "
2306 call assert_equal(['', 'abcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
2307 norm! g0yl
2308 call assert_equal(12, col('.'))
2309 call assert_equal(' ', getreg(0))
2310 norm! g$yl
2311 call assert_equal(22, col('.'))
2312 call assert_equal('3', getreg(0))
2313 norm! gmyl
2314 call assert_equal(17, col('.'))
2315 call assert_equal('n', getreg(0))
2316 norm! g^yl
2317 call assert_equal(15, col('.'))
2318 call assert_equal('l', getreg(0))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002319 call assert_beeps('normal 5g$')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002320
Bram Moolenaar74ede802021-05-29 19:18:01 +02002321 " Test for g$ with double-width character half displayed
2322 vsplit
2323 9wincmd |
2324 setlocal nowrap nonumber
2325 call setline(2, 'asdfasdfヨ')
2326 2
2327 normal 0g$
2328 call assert_equal(8, col('.'))
2329 10wincmd |
2330 normal 0g$
2331 call assert_equal(9, col('.'))
2332
2333 setlocal signcolumn=yes
2334 11wincmd |
2335 normal 0g$
2336 call assert_equal(8, col('.'))
2337 12wincmd |
2338 normal 0g$
2339 call assert_equal(9, col('.'))
2340
2341 close
2342
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002343 " Test for g_
2344 call assert_beeps('normal! 100g_')
2345 call setline(2, [' foo ', ' foobar '])
2346 normal! 2ggg_
2347 call assert_equal(5, col('.'))
2348 normal! 2g_
2349 call assert_equal(8, col('.'))
2350
2351 norm! 2ggdG
Bram Moolenaar8b530c12019-10-28 02:13:05 +01002352 $put =lineC
2353
2354 " Test for gM
2355 norm! gMyl
2356 call assert_equal(73, col('.'))
2357 call assert_equal('0', getreg(0))
2358 " Test for 20gM
2359 norm! 20gMyl
2360 call assert_equal(29, col('.'))
2361 call assert_equal('S', getreg(0))
2362 " Test for 60gM
2363 norm! 60gMyl
2364 call assert_equal(87, col('.'))
2365 call assert_equal('E', getreg(0))
2366
2367 " Test for g Ctrl-G
2368 set ff=unix
2369 let a=execute(":norm! g\<c-g>")
2370 call assert_match('Col 87 of 144; Line 2 of 2; Word 1 of 1; Byte 88 of 146', a)
2371
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002372 " Test for gI
2373 norm! gIfoo
Bram Moolenaar8b530c12019-10-28 02:13:05 +01002374 call assert_equal(['', 'foo0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'], getline(1,'$'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002375
2376 " Test for gi
2377 wincmd c
2378 %d
2379 set tw=0
2380 call setline(1, ['foobar', 'new line'])
2381 norm! A next word
2382 $put ='third line'
2383 norm! gi another word
2384 call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002385 call setline(1, 'foobar')
2386 normal! Ggifirst line
2387 call assert_equal('foobarfirst line', getline(1))
2388 " Test gi in 'virtualedit' mode with cursor after the end of the line
2389 set virtualedit=all
2390 call setline(1, 'foo')
2391 exe "normal! Abar\<Right>\<Right>\<Right>\<Right>"
2392 call setline(1, 'foo')
2393 normal! Ggifirst line
2394 call assert_equal('foo first line', getline(1))
2395 set virtualedit&
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002396
Dominique Pelle923dce22021-11-21 11:36:04 +00002397 " Test for aborting a g command using CTRL-\ CTRL-G
Bram Moolenaar1671f442020-03-10 07:48:13 +01002398 exe "normal! g\<C-\>\<C-G>"
2399 call assert_equal('foo first line', getline('.'))
2400
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002401 " clean up
2402 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002403endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002404
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002405" Test for g CTRL-G
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002406func Test_g_ctrl_g()
Bram Moolenaar05295832018-08-24 22:07:58 +02002407 new
2408
2409 let a = execute(":norm! g\<c-g>")
2410 call assert_equal("\n--No lines in buffer--", a)
2411
Bram Moolenaar1671f442020-03-10 07:48:13 +01002412 " Test for CTRL-G (same as :file)
2413 let a = execute(":norm! \<c-g>")
2414 call assert_equal("\n\n\"[No Name]\" --No lines in buffer--", a)
2415
Bram Moolenaar05295832018-08-24 22:07:58 +02002416 call setline(1, ['first line', 'second line'])
2417
2418 " Test g CTRL-g with dos, mac and unix file type.
2419 norm! gojll
2420 set ff=dos
2421 let a = execute(":norm! g\<c-g>")
2422 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 15 of 25", a)
2423
2424 set ff=mac
2425 let a = execute(":norm! g\<c-g>")
2426 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
2427
2428 set ff=unix
2429 let a = execute(":norm! g\<c-g>")
2430 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
2431
2432 " Test g CTRL-g in visual mode (v)
2433 let a = execute(":norm! gojllvlg\<c-g>")
2434 call assert_equal("\nSelected 1 of 2 Lines; 1 of 4 Words; 2 of 23 Bytes", a)
2435
2436 " Test g CTRL-g in visual mode (CTRL-V) with end col > start col
2437 let a = execute(":norm! \<Esc>gojll\<C-V>kllg\<c-g>")
2438 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
2439
2440 " Test g_CTRL-g in visual mode (CTRL-V) with end col < start col
2441 let a = execute(":norm! \<Esc>goll\<C-V>jhhg\<c-g>")
2442 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
2443
2444 " Test g CTRL-g in visual mode (CTRL-V) with end_vcol being MAXCOL
2445 let a = execute(":norm! \<Esc>gojll\<C-V>k$g\<c-g>")
2446 call assert_equal("\nSelected 2 of 2 Lines; 4 of 4 Words; 17 of 23 Bytes", a)
2447
2448 " There should be one byte less with noeol
2449 set bin noeol
2450 let a = execute(":norm! \<Esc>gog\<c-g>")
2451 call assert_equal("\nCol 1 of 10; Line 1 of 2; Word 1 of 4; Char 1 of 23; Byte 1 of 22", a)
2452 set bin & eol&
2453
Bram Moolenaar30276f22019-01-24 17:59:39 +01002454 call setline(1, ['Français', '日本語'])
Bram Moolenaar05295832018-08-24 22:07:58 +02002455
Bram Moolenaar30276f22019-01-24 17:59:39 +01002456 let a = execute(":norm! \<Esc>gojlg\<c-g>")
2457 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 +02002458
Bram Moolenaar30276f22019-01-24 17:59:39 +01002459 let a = execute(":norm! \<Esc>gojvlg\<c-g>")
2460 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 +02002461
Bram Moolenaar30276f22019-01-24 17:59:39 +01002462 let a = execute(":norm! \<Esc>goll\<c-v>jlg\<c-g>")
2463 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 +02002464
Bram Moolenaar30276f22019-01-24 17:59:39 +01002465 set fenc=utf8 bomb
2466 let a = execute(":norm! \<Esc>gojlg\<c-g>")
2467 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 +02002468
Bram Moolenaar30276f22019-01-24 17:59:39 +01002469 set fenc=utf16 bomb
2470 let a = execute(":norm! g\<c-g>")
2471 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 +02002472
Bram Moolenaar30276f22019-01-24 17:59:39 +01002473 set fenc=utf32 bomb
2474 let a = execute(":norm! g\<c-g>")
2475 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 +02002476
Bram Moolenaar30276f22019-01-24 17:59:39 +01002477 set fenc& bomb&
Bram Moolenaar05295832018-08-24 22:07:58 +02002478
2479 set ff&
2480 bwipe!
2481endfunc
2482
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002483" Test for g8
Bram Moolenaar1671f442020-03-10 07:48:13 +01002484func Test_normal34_g_cmd3()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002485 new
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002486 let a=execute(':norm! 1G0g8')
2487 call assert_equal("\nNUL", a)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002488
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002489 call setline(1, 'abcdefghijklmnopqrstuvwxyzäüö')
2490 let a=execute(':norm! 1G$g8')
2491 call assert_equal("\nc3 b6 ", a)
2492
2493 call setline(1, "a\u0302")
2494 let a=execute(':norm! 1G0g8')
2495 call assert_equal("\n61 + cc 82 ", a)
2496
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002497 " clean up
2498 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002499endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002500
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002501" Test 8g8 which finds invalid utf8 at or after the cursor.
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002502func Test_normal_8g8()
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002503 new
2504
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002505 " With invalid byte.
2506 call setline(1, "___\xff___")
2507 norm! 1G08g8g
2508 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2509
2510 " With invalid byte before the cursor.
2511 call setline(1, "___\xff___")
2512 norm! 1G$h8g8g
2513 call assert_equal([0, 1, 6, 0, 9], getcurpos())
2514
2515 " With truncated sequence.
2516 call setline(1, "___\xE2\x82___")
2517 norm! 1G08g8g
2518 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2519
2520 " With overlong sequence.
2521 call setline(1, "___\xF0\x82\x82\xAC___")
2522 norm! 1G08g8g
2523 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2524
2525 " With valid utf8.
2526 call setline(1, "café")
2527 norm! 1G08g8
2528 call assert_equal([0, 1, 1, 0, 1], getcurpos())
2529
2530 bw!
2531endfunc
2532
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002533" Test for g<
Bram Moolenaar1671f442020-03-10 07:48:13 +01002534func Test_normal35_g_cmd4()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002535 " Cannot capture its output,
2536 " probably a bug, therefore, test disabled:
Bram Moolenaar31845092016-09-05 22:58:31 +02002537 throw "Skipped: output of g< can't be tested currently"
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002538 echo "a\nb\nc\nd"
2539 let b=execute(':norm! g<')
2540 call assert_true(!empty(b), 'failed `execute(g<)`')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002541endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002542
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002543" Test for gp gP go
Bram Moolenaar1671f442020-03-10 07:48:13 +01002544func Test_normal36_g_cmd5()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002545 new
2546 call append(0, 'abcdefghijklmnopqrstuvwxyz')
Bram Moolenaar0913a102016-09-03 19:11:59 +02002547 set ff=unix
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002548 " Test for gp gP
2549 call append(1, range(1,10))
2550 1
2551 norm! 1yy
2552 3
2553 norm! gp
2554 call assert_equal([0, 5, 1, 0, 1], getcurpos())
2555 $
2556 norm! gP
2557 call assert_equal([0, 14, 1, 0, 1], getcurpos())
2558
2559 " Test for go
2560 norm! 26go
2561 call assert_equal([0, 1, 26, 0, 26], getcurpos())
2562 norm! 27go
2563 call assert_equal([0, 1, 26, 0, 26], getcurpos())
2564 norm! 28go
2565 call assert_equal([0, 2, 1, 0, 1], getcurpos())
2566 set ff=dos
2567 norm! 29go
2568 call assert_equal([0, 2, 1, 0, 1], getcurpos())
2569 set ff=unix
2570 norm! gg0
2571 norm! 101go
2572 call assert_equal([0, 13, 26, 0, 26], getcurpos())
2573 norm! 103go
2574 call assert_equal([0, 14, 1, 0, 1], getcurpos())
2575 " count > buffer content
2576 norm! 120go
2577 call assert_equal([0, 14, 1, 0, 2147483647], getcurpos())
2578 " clean up
2579 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002580endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002581
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002582" Test for gt and gT
Bram Moolenaar1671f442020-03-10 07:48:13 +01002583func Test_normal37_g_cmd6()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002584 tabnew 1.txt
2585 tabnew 2.txt
2586 tabnew 3.txt
2587 norm! 1gt
2588 call assert_equal(1, tabpagenr())
2589 norm! 3gt
2590 call assert_equal(3, tabpagenr())
2591 norm! 1gT
2592 " count gT goes not to the absolute tabpagenumber
2593 " but, but goes to the count previous tabpagenumber
2594 call assert_equal(2, tabpagenr())
2595 " wrap around
2596 norm! 3gT
2597 call assert_equal(3, tabpagenr())
2598 " gt does not wrap around
2599 norm! 5gt
2600 call assert_equal(3, tabpagenr())
2601
2602 for i in range(3)
2603 tabclose
2604 endfor
2605 " clean up
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +01002606 call assert_fails(':tabclose', 'E784:')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002607endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002608
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002609" Test for <Home> and <C-Home> key
Bram Moolenaar1671f442020-03-10 07:48:13 +01002610func Test_normal38_nvhome()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002611 new
2612 call setline(1, range(10))
2613 $
2614 setl et sw=2
2615 norm! V10>$
2616 " count is ignored
2617 exe "norm! 10\<home>"
2618 call assert_equal(1, col('.'))
2619 exe "norm! \<home>"
2620 call assert_equal([0, 10, 1, 0, 1], getcurpos())
2621 exe "norm! 5\<c-home>"
2622 call assert_equal([0, 5, 1, 0, 1], getcurpos())
2623 exe "norm! \<c-home>"
2624 call assert_equal([0, 1, 1, 0, 1], getcurpos())
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002625 exe "norm! G\<c-kHome>"
2626 call assert_equal([0, 1, 1, 0, 1], getcurpos())
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002627
2628 " clean up
2629 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002630endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002631
Bram Moolenaar1671f442020-03-10 07:48:13 +01002632" Test for <End> and <C-End> keys
2633func Test_normal_nvend()
2634 new
2635 call setline(1, map(range(1, 10), '"line" .. v:val'))
2636 exe "normal! \<End>"
2637 call assert_equal(5, col('.'))
2638 exe "normal! 4\<End>"
2639 call assert_equal([4, 5], [line('.'), col('.')])
2640 exe "normal! \<C-End>"
2641 call assert_equal([10, 6], [line('.'), col('.')])
2642 close!
2643endfunc
2644
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002645" Test for cw cW ce
Bram Moolenaar1671f442020-03-10 07:48:13 +01002646func Test_normal39_cw()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002647 " Test for cw and cW on whitespace
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002648 new
2649 set tw=0
2650 call append(0, 'here are some words')
2651 norm! 1gg0elcwZZZ
2652 call assert_equal('hereZZZare some words', getline('.'))
2653 norm! 1gg0elcWYYY
2654 call assert_equal('hereZZZareYYYsome words', getline('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002655 norm! 2gg0cwfoo
2656 call assert_equal('foo', getline('.'))
2657
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002658 call setline(1, 'one; two')
2659 call cursor(1, 1)
2660 call feedkeys('cwvim', 'xt')
2661 call assert_equal('vim; two', getline(1))
2662 call feedkeys('0cWone', 'xt')
2663 call assert_equal('one two', getline(1))
2664 "When cursor is at the end of a word 'ce' will change until the end of the
2665 "next word, but 'cw' will change only one character
2666 call setline(1, 'one two')
2667 call feedkeys('0ecwce', 'xt')
2668 call assert_equal('once two', getline(1))
2669 call setline(1, 'one two')
2670 call feedkeys('0ecely', 'xt')
2671 call assert_equal('only', getline(1))
2672
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002673 " clean up
2674 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002675endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002676
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002677" Test for CTRL-\ commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01002678func Test_normal40_ctrl_bsl()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002679 new
2680 call append(0, 'here are some words')
2681 exe "norm! 1gg0a\<C-\>\<C-N>"
2682 call assert_equal('n', mode())
2683 call assert_equal(1, col('.'))
2684 call assert_equal('', visualmode())
2685 exe "norm! 1gg0viw\<C-\>\<C-N>"
2686 call assert_equal('n', mode())
2687 call assert_equal(4, col('.'))
2688 exe "norm! 1gg0a\<C-\>\<C-G>"
2689 call assert_equal('n', mode())
2690 call assert_equal(1, col('.'))
2691 "imap <buffer> , <c-\><c-n>
2692 set im
2693 exe ":norm! \<c-\>\<c-n>dw"
2694 set noim
2695 call assert_equal('are some words', getline(1))
2696 call assert_false(&insertmode)
Yegappan Lakshmanan1a71d312021-07-15 12:49:58 +02002697 call assert_beeps("normal! \<C-\>\<C-A>")
Bram Moolenaar1671f442020-03-10 07:48:13 +01002698
Bram Moolenaar21829c52021-01-26 22:42:21 +01002699 if has('cmdwin')
2700 " Using CTRL-\ CTRL-N in cmd window should close the window
2701 call feedkeys("q:\<C-\>\<C-N>", 'xt')
2702 call assert_equal('', getcmdwintype())
2703 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002704
2705 " clean up
2706 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002707endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002708
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002709" Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>= in insert mode
Bram Moolenaar1671f442020-03-10 07:48:13 +01002710func Test_normal41_insert_reg()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002711 new
2712 set sts=2 sw=2 ts=8 tw=0
2713 call append(0, ["aaa\tbbb\tccc", '', '', ''])
2714 let a=getline(1)
2715 norm! 2gg0
2716 exe "norm! a\<c-r>=a\<cr>"
2717 norm! 3gg0
2718 exe "norm! a\<c-r>\<c-r>=a\<cr>"
2719 norm! 4gg0
2720 exe "norm! a\<c-r>\<c-o>=a\<cr>"
2721 call assert_equal(['aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', ''], getline(1, '$'))
2722
2723 " clean up
2724 set sts=0 sw=8 ts=8
Bram Moolenaar31845092016-09-05 22:58:31 +02002725 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002726endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002727
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002728" Test for Ctrl-D and Ctrl-U
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002729func Test_normal42_halfpage()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002730 call Setup_NewWindow()
2731 call assert_equal(5, &scroll)
2732 exe "norm! \<c-d>"
2733 call assert_equal('6', getline('.'))
2734 exe "norm! 2\<c-d>"
2735 call assert_equal('8', getline('.'))
2736 call assert_equal(2, &scroll)
2737 set scroll=5
2738 exe "norm! \<c-u>"
2739 call assert_equal('3', getline('.'))
2740 1
2741 set scrolloff=5
2742 exe "norm! \<c-d>"
2743 call assert_equal('10', getline('.'))
2744 exe "norm! \<c-u>"
2745 call assert_equal('5', getline('.'))
2746 1
2747 set scrolloff=99
2748 exe "norm! \<c-d>"
2749 call assert_equal('10', getline('.'))
2750 set scrolloff=0
2751 100
2752 exe "norm! $\<c-u>"
2753 call assert_equal('95', getline('.'))
2754 call assert_equal([0, 95, 1, 0, 1], getcurpos())
2755 100
2756 set nostartofline
2757 exe "norm! $\<c-u>"
2758 call assert_equal('95', getline('.'))
2759 call assert_equal([0, 95, 2, 0, 2147483647], getcurpos())
2760 " cleanup
2761 set startofline
2762 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002763endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002764
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002765func Test_normal45_drop()
Bram Moolenaar29495952018-02-12 22:49:00 +01002766 if !has('dnd')
Bram Moolenaarb48e96f2018-02-13 12:26:14 +01002767 " The ~ register does not exist
2768 call assert_beeps('norm! "~')
Bram Moolenaar29495952018-02-12 22:49:00 +01002769 return
2770 endif
2771
2772 " basic test for drag-n-drop
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002773 " unfortunately, without a gui, we can't really test much here,
2774 " so simply test that ~p fails (which uses the drop register)
2775 new
Bram Moolenaare2e40752020-09-04 21:18:46 +02002776 call assert_fails(':norm! "~p', 'E353:')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002777 call assert_equal([], getreg('~', 1, 1))
2778 " the ~ register is read only
Bram Moolenaare2e40752020-09-04 21:18:46 +02002779 call assert_fails(':let @~="1"', 'E354:')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002780 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002781endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002782
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002783func Test_normal46_ignore()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002784 new
2785 " How to test this?
2786 " let's just for now test, that the buffer
2787 " does not change
2788 call feedkeys("\<c-s>", 't')
2789 call assert_equal([''], getline(1,'$'))
2790
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002791 " no valid commands
2792 exe "norm! \<char-0x100>"
2793 call assert_equal([''], getline(1,'$'))
2794
2795 exe "norm! ä"
2796 call assert_equal([''], getline(1,'$'))
2797
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002798 " clean up
2799 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002800endfunc
Bram Moolenaarc4a908e2016-09-08 23:35:30 +02002801
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002802func Test_normal47_visual_buf_wipe()
Bram Moolenaarc4a908e2016-09-08 23:35:30 +02002803 " This was causing a crash or ml_get error.
2804 enew!
2805 call setline(1,'xxx')
2806 normal $
2807 new
2808 call setline(1, range(1,2))
2809 2
2810 exe "norm \<C-V>$"
2811 bw!
2812 norm yp
2813 set nomodified
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002814endfunc
2815
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002816func Test_normal48_wincmd()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002817 new
2818 exe "norm! \<c-w>c"
2819 call assert_equal(1, winnr('$'))
Bram Moolenaare2e40752020-09-04 21:18:46 +02002820 call assert_fails(":norm! \<c-w>c", 'E444:')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002821endfunc
2822
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002823func Test_normal49_counts()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002824 new
2825 call setline(1, 'one two three four five six seven eight nine ten')
2826 1
2827 norm! 3d2w
2828 call assert_equal('seven eight nine ten', getline(1))
2829 bw!
2830endfunc
2831
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002832func Test_normal50_commandline()
Bram Moolenaar004a6782020-04-11 17:09:31 +02002833 CheckFeature timers
2834 CheckFeature cmdline_hist
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002835 func! DoTimerWork(id)
2836 call assert_equal('[Command Line]', bufname(''))
2837 " should fail, with E11, but does fail with E23?
2838 "call feedkeys("\<c-^>", 'tm')
2839
2840 " should also fail with E11
Bram Moolenaare2e40752020-09-04 21:18:46 +02002841 call assert_fails(":wincmd p", 'E11:')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002842 " return from commandline window
2843 call feedkeys("\<cr>")
2844 endfunc
2845
2846 let oldlang=v:lang
2847 lang C
2848 set updatetime=20
2849 call timer_start(100, 'DoTimerWork')
2850 try
2851 " throws E23, for whatever reason...
2852 call feedkeys('q:', 'x!')
2853 catch /E23/
2854 " no-op
2855 endtry
2856 " clean up
2857 set updatetime=4000
2858 exe "lang" oldlang
2859 bw!
2860endfunc
2861
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002862func Test_normal51_FileChangedRO()
Bram Moolenaar004a6782020-04-11 17:09:31 +02002863 CheckFeature autocmd
Bram Moolenaare5f2a072017-02-01 22:31:49 +01002864 " Don't sleep after the warning message.
2865 call test_settime(1)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002866 call writefile(['foo'], 'Xreadonly.log')
2867 new Xreadonly.log
2868 setl ro
2869 au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix')
Bram Moolenaare2e40752020-09-04 21:18:46 +02002870 call assert_fails(":norm! Af", 'E788:')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002871 call assert_equal(['foo'], getline(1,'$'))
2872 call assert_equal('Xreadonly.log', bufname(''))
2873
2874 " cleanup
Bram Moolenaare5f2a072017-02-01 22:31:49 +01002875 call test_settime(0)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002876 bw!
2877 call delete("Xreadonly.log")
2878endfunc
2879
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002880func Test_normal52_rl()
Bram Moolenaar004a6782020-04-11 17:09:31 +02002881 CheckFeature rightleft
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002882 new
2883 call setline(1, 'abcde fghij klmnopq')
2884 norm! 1gg$
2885 set rl
2886 call assert_equal(19, col('.'))
2887 call feedkeys('l', 'tx')
2888 call assert_equal(18, col('.'))
2889 call feedkeys('h', 'tx')
2890 call assert_equal(19, col('.'))
2891 call feedkeys("\<right>", 'tx')
2892 call assert_equal(18, col('.'))
Bram Moolenaar1671f442020-03-10 07:48:13 +01002893 call feedkeys("\<left>", 'tx')
2894 call assert_equal(19, col('.'))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002895 call feedkeys("\<s-right>", 'tx')
2896 call assert_equal(13, col('.'))
2897 call feedkeys("\<c-right>", 'tx')
2898 call assert_equal(7, col('.'))
2899 call feedkeys("\<c-left>", 'tx')
2900 call assert_equal(13, col('.'))
2901 call feedkeys("\<s-left>", 'tx')
2902 call assert_equal(19, col('.'))
2903 call feedkeys("<<", 'tx')
2904 call assert_equal(' abcde fghij klmnopq',getline(1))
2905 call feedkeys(">>", 'tx')
2906 call assert_equal('abcde fghij klmnopq',getline(1))
2907
2908 " cleanup
2909 set norl
2910 bw!
2911endfunc
2912
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002913func Test_normal54_Ctrl_bsl()
2914 new
2915 call setline(1, 'abcdefghijklmn')
2916 exe "norm! df\<c-\>\<c-n>"
2917 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2918 exe "norm! df\<c-\>\<c-g>"
2919 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
2920 exe "norm! df\<c-\>m"
2921 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
Bram Moolenaar30276f22019-01-24 17:59:39 +01002922
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002923 call setline(2, 'abcdefghijklmnāf')
2924 norm! 2gg0
2925 exe "norm! df\<Char-0x101>"
2926 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
2927 norm! 1gg0
2928 exe "norm! df\<esc>"
2929 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002930
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02002931 " clean up
2932 bw!
2933endfunc
2934
2935func Test_normal_large_count()
2936 " This may fail with 32bit long, how do we detect that?
2937 new
2938 normal o
2939 normal 6666666666dL
2940 bwipe!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002941endfunc
Bram Moolenaarbf3d5802017-03-29 19:48:11 +02002942
2943func Test_delete_until_paragraph()
Bram Moolenaarbf3d5802017-03-29 19:48:11 +02002944 new
2945 normal grádv}
2946 call assert_equal('á', getline(1))
2947 normal grád}
2948 call assert_equal('', getline(1))
2949 bwipe!
2950endfunc
Bram Moolenaarfb094e12017-11-05 20:59:28 +01002951
2952" Test for the gr (virtual replace) command
2953" Test for the bug fixed by 7.4.387
2954func Test_gr_command()
2955 enew!
2956 let save_cpo = &cpo
2957 call append(0, ['First line', 'Second line', 'Third line'])
2958 exe "normal i\<C-G>u"
2959 call cursor(2, 1)
2960 set cpo-=X
2961 normal 4gro
2962 call assert_equal('oooond line', getline(2))
2963 undo
2964 set cpo+=X
2965 normal 4gro
2966 call assert_equal('ooooecond line', getline(2))
2967 let &cpo = save_cpo
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002968 normal! ggvegrx
2969 call assert_equal('xxxxx line', getline(1))
2970 exe "normal! gggr\<C-V>122"
2971 call assert_equal('zxxxx line', getline(1))
2972 set virtualedit=all
2973 normal! 15|grl
2974 call assert_equal('zxxxx line l', getline(1))
2975 set virtualedit&
2976 set nomodifiable
2977 call assert_fails('normal! grx', 'E21:')
2978 call assert_fails('normal! gRx', 'E21:')
2979 set modifiable&
Bram Moolenaarfb094e12017-11-05 20:59:28 +01002980 enew!
2981endfunc
2982
2983" When splitting a window the changelist position is wrong.
2984" Test the changelist position after splitting a window.
2985" Test for the bug fixed by 7.4.386
2986func Test_changelist()
2987 let save_ul = &ul
2988 enew!
2989 call append('$', ['1', '2'])
2990 exe "normal i\<C-G>u"
2991 exe "normal Gkylpa\<C-G>u"
2992 set ul=100
2993 exe "normal Gylpa\<C-G>u"
2994 set ul=100
2995 normal gg
2996 vsplit
2997 normal g;
2998 call assert_equal([3, 2], [line('.'), col('.')])
2999 normal g;
3000 call assert_equal([2, 2], [line('.'), col('.')])
3001 call assert_fails('normal g;', 'E662:')
Bram Moolenaar1671f442020-03-10 07:48:13 +01003002 new
3003 call assert_fails('normal g;', 'E664:')
Bram Moolenaarfb094e12017-11-05 20:59:28 +01003004 %bwipe!
3005 let &ul = save_ul
3006endfunc
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003007
3008func Test_nv_hat_count()
3009 %bwipeout!
3010 let l:nr = bufnr('%') + 1
Bram Moolenaare2e40752020-09-04 21:18:46 +02003011 call assert_fails(':execute "normal! ' . l:nr . '\<C-^>"', 'E92:')
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003012
3013 edit Xfoo
3014 let l:foo_nr = bufnr('Xfoo')
3015
3016 edit Xbar
3017 let l:bar_nr = bufnr('Xbar')
3018
3019 " Make sure we are not just using the alternate file.
3020 edit Xbaz
3021
3022 call feedkeys(l:foo_nr . "\<C-^>", 'tx')
3023 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
3024
3025 call feedkeys(l:bar_nr . "\<C-^>", 'tx')
3026 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
3027
3028 %bwipeout!
3029endfunc
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01003030
3031func Test_message_when_using_ctrl_c()
Bram Moolenaar553e5a52019-03-25 23:16:34 +01003032 " Make sure no buffers are changed.
3033 %bwipe!
3034
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01003035 exe "normal \<C-C>"
3036 call assert_match("Type :qa and press <Enter> to exit Vim", Screenline(&lines))
Bram Moolenaar553e5a52019-03-25 23:16:34 +01003037
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01003038 new
3039 cal setline(1, 'hi!')
3040 exe "normal \<C-C>"
3041 call assert_match("Type :qa! and press <Enter> to abandon all changes and exit Vim", Screenline(&lines))
Bram Moolenaar553e5a52019-03-25 23:16:34 +01003042
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01003043 bwipe!
3044endfunc
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02003045
3046" Test for '[m', ']m', '[M' and ']M'
3047" Jumping to beginning and end of methods in Java-like languages
3048func Test_java_motion()
3049 new
Bram Moolenaar1671f442020-03-10 07:48:13 +01003050 call assert_beeps('normal! [m')
3051 call assert_beeps('normal! ]m')
3052 call assert_beeps('normal! [M')
3053 call assert_beeps('normal! ]M')
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003054 let lines =<< trim [CODE]
3055 Piece of Java
3056 {
3057 tt m1 {
3058 t1;
3059 } e1
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02003060
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003061 tt m2 {
3062 t2;
3063 } e2
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02003064
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003065 tt m3 {
3066 if (x)
3067 {
3068 t3;
3069 }
3070 } e3
3071 }
3072 [CODE]
3073 call setline(1, lines)
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02003074
3075 normal gg
3076
3077 normal 2]maA
3078 call assert_equal("\ttt m1 {A", getline('.'))
3079 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
3080
3081 normal j]maB
3082 call assert_equal("\ttt m2 {B", getline('.'))
3083 call assert_equal([7, 9, 16], [line('.'), col('.'), virtcol('.')])
3084
3085 normal ]maC
3086 call assert_equal("\ttt m3 {C", getline('.'))
3087 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
3088
3089 normal [maD
3090 call assert_equal("\ttt m3 {DC", getline('.'))
3091 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
3092
3093 normal k2[maE
3094 call assert_equal("\ttt m1 {EA", getline('.'))
3095 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
3096
3097 normal 3[maF
3098 call assert_equal("{F", getline('.'))
3099 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
3100
3101 normal ]MaG
3102 call assert_equal("\t}G e1", getline('.'))
3103 call assert_equal([5, 3, 10], [line('.'), col('.'), virtcol('.')])
3104
3105 normal j2]MaH
3106 call assert_equal("\t}H e3", getline('.'))
3107 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
3108
3109 normal ]M]M
3110 normal aI
3111 call assert_equal("}I", getline('.'))
3112 call assert_equal([17, 2, 2], [line('.'), col('.'), virtcol('.')])
3113
3114 normal 2[MaJ
3115 call assert_equal("\t}JH e3", getline('.'))
3116 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
3117
3118 normal k[MaK
3119 call assert_equal("\t}K e2", getline('.'))
3120 call assert_equal([9, 3, 10], [line('.'), col('.'), virtcol('.')])
3121
3122 normal 3[MaL
3123 call assert_equal("{LF", getline('.'))
3124 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
3125
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003126 call cursor(2, 1)
3127 call assert_beeps('norm! 5]m')
3128
3129 " jumping to a method in a fold should open the fold
3130 6,10fold
3131 call feedkeys("gg3]m", 'xt')
3132 call assert_equal([7, 8, 15], [line('.'), col('.'), virtcol('.')])
3133 call assert_equal(-1, foldclosedend(7))
3134
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02003135 close!
3136endfunc
Bram Moolenaard5c82342019-07-27 18:44:57 +02003137
Bram Moolenaar004a6782020-04-11 17:09:31 +02003138" Tests for g cmds
Bram Moolenaar1671f442020-03-10 07:48:13 +01003139func Test_normal_gdollar_cmd()
Bram Moolenaar004a6782020-04-11 17:09:31 +02003140 CheckFeature jumplist
Bram Moolenaard5c82342019-07-27 18:44:57 +02003141 call Setup_NewWindow()
3142 " Make long lines that will wrap
3143 %s/$/\=repeat(' foobar', 10)/
3144 20vsp
3145 set wrap
3146 " Test for g$ with count
3147 norm! gg
3148 norm! 0vg$y
3149 call assert_equal(20, col("'>"))
3150 call assert_equal('1 foobar foobar foob', getreg(0))
3151 norm! gg
3152 norm! 0v4g$y
3153 call assert_equal(72, col("'>"))
3154 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.."\n", getreg(0))
3155 norm! gg
3156 norm! 0v6g$y
3157 call assert_equal(40, col("'>"))
3158 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3159 \ '2 foobar foobar foobar foobar foobar foo', getreg(0))
3160 set nowrap
3161 " clean up
3162 norm! gg
3163 norm! 0vg$y
3164 call assert_equal(20, col("'>"))
3165 call assert_equal('1 foobar foobar foob', getreg(0))
3166 norm! gg
3167 norm! 0v4g$y
3168 call assert_equal(20, col("'>"))
3169 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3170 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3171 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3172 \ '4 foobar foobar foob', getreg(0))
3173 norm! gg
3174 norm! 0v6g$y
3175 call assert_equal(20, col("'>"))
3176 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3177 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3178 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3179 \ '4 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3180 \ '5 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3181 \ '6 foobar foobar foob', getreg(0))
3182 " Move to last line, also down movement is not possible, should still move
3183 " the cursor to the last visible char
3184 norm! G
3185 norm! 0v6g$y
3186 call assert_equal(20, col("'>"))
3187 call assert_equal('100 foobar foobar fo', getreg(0))
3188 bw!
3189endfunc
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02003190
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003191func Test_normal_gk_gj()
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02003192 " needs 80 column new window
3193 new
3194 vert 80new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003195 call assert_beeps('normal gk')
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02003196 put =[repeat('x',90)..' {{{1', 'x {{{1']
3197 norm! gk
3198 " In a 80 column wide terminal the window will be only 78 char
3199 " (because Vim will leave space for the other window),
3200 " but if the terminal is larger, it will be 80 chars, so verify the
3201 " cursor column correctly.
3202 call assert_equal(winwidth(0)+1, col('.'))
3203 call assert_equal(winwidth(0)+1, virtcol('.'))
3204 norm! j
3205 call assert_equal(6, col('.'))
3206 call assert_equal(6, virtcol('.'))
3207 norm! gk
3208 call assert_equal(95, col('.'))
3209 call assert_equal(95, virtcol('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003210 %bw!
Bram Moolenaarceba3dd2019-10-12 16:12:54 +02003211
3212 " needs 80 column new window
3213 new
3214 vert 80new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003215 call assert_beeps('normal gj')
Bram Moolenaarceba3dd2019-10-12 16:12:54 +02003216 set number
3217 set numberwidth=10
3218 set cpoptions+=n
3219 put =[repeat('0',90), repeat('1',90)]
3220 norm! 075l
3221 call assert_equal(76, col('.'))
3222 norm! gk
3223 call assert_equal(1, col('.'))
3224 norm! gk
3225 call assert_equal(76, col('.'))
3226 norm! gk
3227 call assert_equal(1, col('.'))
3228 norm! gj
3229 call assert_equal(76, col('.'))
3230 norm! gj
3231 call assert_equal(1, col('.'))
3232 norm! gj
3233 call assert_equal(76, col('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003234 " When 'nowrap' is set, gk and gj behave like k and j
3235 set nowrap
3236 normal! gk
3237 call assert_equal([2, 76], [line('.'), col('.')])
3238 normal! gj
3239 call assert_equal([3, 76], [line('.'), col('.')])
3240 %bw!
3241 set cpoptions& number& numberwidth& wrap&
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02003242endfunc
Bram Moolenaarf0cee192020-02-16 13:33:56 +01003243
Bram Moolenaar818fc9a2020-02-21 17:54:45 +01003244" Test for using : to run a multi-line Ex command in operator pending mode
3245func Test_normal_yank_with_excmd()
3246 new
3247 call setline(1, ['foo', 'bar', 'baz'])
3248 let @a = ''
3249 call feedkeys("\"ay:if v:true\<CR>normal l\<CR>endif\<CR>", 'xt')
3250 call assert_equal('f', @a)
3251 close!
3252endfunc
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003253
3254" Test for supplying a count to a normal-mode command across a cursorhold call
3255func Test_normal_cursorhold_with_count()
3256 func s:cHold()
3257 let g:cHold_Called += 1
3258 endfunc
3259 new
3260 augroup normalcHoldTest
3261 au!
3262 au CursorHold <buffer> call s:cHold()
3263 augroup END
3264 let g:cHold_Called = 0
3265 call feedkeys("3\<CursorHold>2ix", 'xt')
3266 call assert_equal(1, g:cHold_Called)
3267 call assert_equal(repeat('x', 32), getline(1))
3268 augroup normalcHoldTest
3269 au!
3270 augroup END
3271 au! normalcHoldTest
3272 close!
3273 delfunc s:cHold
3274endfunc
3275
3276" Test for using a count and a command with CTRL-W
3277func Test_wincmd_with_count()
3278 call feedkeys("\<C-W>12n", 'xt')
3279 call assert_equal(12, winheight(0))
3280endfunc
3281
3282" Test for 'b', 'B' 'ge' and 'gE' commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01003283func Test_horiz_motion()
3284 new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003285 normal! gg
3286 call assert_beeps('normal! b')
3287 call assert_beeps('normal! B')
3288 call assert_beeps('normal! gE')
3289 call assert_beeps('normal! ge')
Bram Moolenaar1671f442020-03-10 07:48:13 +01003290 " <S-Backspace> moves one word left and <C-Backspace> moves one WORD left
3291 call setline(1, 'one ,two ,three')
3292 exe "normal! $\<S-BS>"
3293 call assert_equal(11, col('.'))
3294 exe "normal! $\<C-BS>"
3295 call assert_equal(10, col('.'))
3296 close!
3297endfunc
3298
3299" Test for using a : command in operator pending mode
3300func Test_normal_colon_op()
3301 new
3302 call setline(1, ['one', 'two'])
3303 call assert_beeps("normal! Gc:d\<CR>")
3304 close!
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003305endfunc
3306
Bram Moolenaar004a6782020-04-11 17:09:31 +02003307" Test for d and D commands
3308func Test_normal_delete_cmd()
3309 new
3310 " D in an empty line
3311 call setline(1, '')
3312 normal D
3313 call assert_equal('', getline(1))
3314 " D in an empty line in virtualedit mode
3315 set virtualedit=all
3316 normal D
3317 call assert_equal('', getline(1))
3318 set virtualedit&
3319 " delete to a readonly register
3320 call setline(1, ['abcd'])
3321 call assert_beeps('normal ":d2l')
Bram Moolenaar6fd367a2021-03-13 13:14:04 +01003322
3323 " D and d with 'nomodifiable'
3324 call setline(1, ['abcd'])
3325 setlocal nomodifiable
3326 call assert_fails('normal D', 'E21:')
3327 call assert_fails('normal d$', 'E21:')
3328
Bram Moolenaar004a6782020-04-11 17:09:31 +02003329 close!
3330endfunc
3331
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003332" Test for deleting or changing characters across lines with 'whichwrap'
3333" containing 's'. Should count <EOL> as one character.
3334func Test_normal_op_across_lines()
3335 new
3336 set whichwrap&
3337 call setline(1, ['one two', 'three four'])
3338 exe "norm! $3d\<Space>"
3339 call assert_equal(['one twhree four'], getline(1, '$'))
3340
3341 call setline(1, ['one two', 'three four'])
3342 exe "norm! $3c\<Space>x"
3343 call assert_equal(['one twxhree four'], getline(1, '$'))
3344
3345 set whichwrap+=l
3346 call setline(1, ['one two', 'three four'])
3347 exe "norm! $3x"
3348 call assert_equal(['one twhree four'], getline(1, '$'))
3349 close!
3350 set whichwrap&
3351endfunc
3352
Bram Moolenaar224a5f12020-04-28 20:29:07 +02003353" Test for 'w' and 'b' commands
3354func Test_normal_word_move()
3355 new
3356 call setline(1, ['foo bar a', '', 'foo bar b'])
3357 " copy a single character word at the end of a line
3358 normal 1G$yw
3359 call assert_equal('a', @")
3360 " copy a single character word at the end of a file
3361 normal G$yw
3362 call assert_equal('b', @")
3363 " check for a word movement handling an empty line properly
3364 normal 1G$vwy
3365 call assert_equal("a\n\n", @")
3366
3367 " copy using 'b' command
3368 %d
3369 " non-empty blank line at the start of file
3370 call setline(1, [' ', 'foo bar'])
3371 normal 2Gyb
3372 call assert_equal(" \n", @")
3373 " try to copy backwards from the start of the file
3374 call setline(1, ['one two', 'foo bar'])
3375 call assert_beeps('normal ggyb')
3376 " 'b' command should stop at an empty line
3377 call setline(1, ['one two', '', 'foo bar'])
3378 normal 3Gyb
3379 call assert_equal("\n", @")
3380 normal 3Gy2b
3381 call assert_equal("two\n", @")
3382 " 'b' command should not stop at a non-empty blank line
3383 call setline(1, ['one two', ' ', 'foo bar'])
3384 normal 3Gyb
3385 call assert_equal("two\n ", @")
3386
3387 close!
3388endfunc
3389
Bram Moolenaarbdd2c292020-06-22 21:34:30 +02003390" Test for 'scrolloff' with a long line that doesn't fit in the screen
3391func Test_normal_scroloff()
3392 10new
3393 80vnew
3394 call setline(1, repeat('a', 1000))
3395 set scrolloff=10
3396 normal gg10gj
3397 call assert_equal(8, winline())
3398 normal 10gj
3399 call assert_equal(10, winline())
3400 normal 10gk
3401 call assert_equal(3, winline())
3402 set scrolloff&
3403 close!
3404endfunc
3405
3406" Test for vertical scrolling with CTRL-F and CTRL-B with a long line
3407func Test_normal_vert_scroll_longline()
3408 10new
3409 80vnew
3410 call setline(1, range(1, 10))
3411 call append(5, repeat('a', 1000))
3412 exe "normal gg\<C-F>"
3413 call assert_equal(6, line('.'))
3414 exe "normal \<C-F>\<C-F>"
3415 call assert_equal(11, line('.'))
3416 call assert_equal(1, winline())
3417 exe "normal \<C-B>"
3418 call assert_equal(10, line('.'))
3419 call assert_equal(3, winline())
3420 exe "normal \<C-B>\<C-B>"
3421 call assert_equal(5, line('.'))
3422 call assert_equal(5, winline())
3423 close!
3424endfunc
3425
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003426" Test for jumping in a file using %
3427func Test_normal_percent_jump()
3428 new
3429 call setline(1, range(1, 100))
3430
3431 " jumping to a folded line should open the fold
3432 25,75fold
3433 call feedkeys('50%', 'xt')
3434 call assert_equal(50, line('.'))
3435 call assert_equal(-1, foldclosedend(50))
3436 close!
3437endfunc
3438
Bram Moolenaar3e72dca2021-05-29 16:30:12 +02003439" Test for << and >> commands to shift text by 'shiftwidth'
3440func Test_normal_shift_rightleft()
3441 new
3442 call setline(1, ['one', '', "\t", ' two', "\tthree", ' four'])
3443 set shiftwidth=2 tabstop=8
3444 normal gg6>>
3445 call assert_equal([' one', '', "\t ", ' two', "\t three", "\tfour"],
3446 \ getline(1, '$'))
3447 normal ggVG2>>
3448 call assert_equal([' one', '', "\t ", "\ttwo",
3449 \ "\t three", "\t four"], getline(1, '$'))
3450 normal gg6<<
3451 call assert_equal([' one', '', "\t ", ' two', "\t three",
3452 \ "\t four"], getline(1, '$'))
3453 normal ggVG2<<
3454 call assert_equal(['one', '', "\t", ' two', "\tthree", ' four'],
3455 \ getline(1, '$'))
3456 set shiftwidth& tabstop&
3457 bw!
3458endfunc
3459
Yegappan Lakshmanan2ac71842021-05-31 19:23:01 +02003460" Some commands like yy, cc, dd, >>, << and !! accept a count after
3461" typing the first letter of the command.
3462func Test_normal_count_after_operator()
3463 new
3464 setlocal shiftwidth=4 tabstop=8 autoindent
3465 call setline(1, ['one', 'two', 'three', 'four', 'five'])
3466 let @a = ''
3467 normal! j"ay4y
3468 call assert_equal("two\nthree\nfour\nfive\n", @a)
3469 normal! 3G>2>
3470 call assert_equal(['one', 'two', ' three', ' four', 'five'],
3471 \ getline(1, '$'))
3472 exe "normal! 3G0c2cred\nblue"
3473 call assert_equal(['one', 'two', ' red', ' blue', 'five'],
3474 \ getline(1, '$'))
3475 exe "normal! gg<8<"
3476 call assert_equal(['one', 'two', 'red', 'blue', 'five'],
3477 \ getline(1, '$'))
3478 exe "normal! ggd3d"
3479 call assert_equal(['blue', 'five'], getline(1, '$'))
3480 call setline(1, range(1, 4))
3481 call feedkeys("gg!3!\<C-B>\"\<CR>", 'xt')
3482 call assert_equal('".,.+2!', @:)
3483 call feedkeys("gg!1!\<C-B>\"\<CR>", 'xt')
3484 call assert_equal('".!', @:)
3485 call feedkeys("gg!9!\<C-B>\"\<CR>", 'xt')
3486 call assert_equal('".,$!', @:)
3487 bw!
3488endfunc
3489
Christian Brabandtaaec1d42021-11-04 13:28:29 +00003490func Test_normal_gj_on_extra_wide_char()
3491 new | 25vsp
3492 let text='1 foooooooo ar e ins‍zwe1 foooooooo ins‍zwei' .
3493 \ ' i drei vier fünf sechs sieben acht un zehn elf zwöfl' .
3494 \ ' dreizehn v ierzehn fünfzehn'
3495 put =text
3496 call cursor(2,1)
3497 norm! gj
3498 call assert_equal([0,2,25,0], getpos('.'))
3499 bw!
3500endfunc
3501
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003502" vim: shiftwidth=2 sts=2 expandtab