blob: 50c0d5d274666df61f78e83ccf74f14a3a4801bc [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 Moolenaar62aec932022-01-29 21:45:34 +00006import './vim9.vim' as v9
Bram Moolenaar7a1d3282022-06-16 13:04:45 +01007source screendump.vim
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01008
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01009func Setup_NewWindow()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020010 10new
11 call setline(1, range(1,100))
12endfunc
13
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010014func MyFormatExpr()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020015 " Adds '->$' at lines having numbers followed by trailing whitespace
16 for ln in range(v:lnum, v:lnum+v:count-1)
17 let line = getline(ln)
18 if getline(ln) =~# '\d\s\+$'
19 call setline(ln, substitute(line, '\s\+$', '', '') . '->$')
20 endif
21 endfor
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020022endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020023
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010024func CountSpaces(type, ...)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020025 " for testing operatorfunc
26 " will count the number of spaces
27 " and return the result in g:a
28 let sel_save = &selection
29 let &selection = "inclusive"
30 let reg_save = @@
31
32 if a:0 " Invoked from Visual mode, use gv command.
33 silent exe "normal! gvy"
34 elseif a:type == 'line'
35 silent exe "normal! '[V']y"
36 else
37 silent exe "normal! `[v`]y"
38 endif
Bram Moolenaar777e7c22021-10-25 17:07:04 +010039 let g:a = strlen(substitute(@@, '[^ ]', '', 'g'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020040 let &selection = sel_save
41 let @@ = reg_save
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020042endfunc
43
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010044func OpfuncDummy(type, ...)
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +010045 " for testing operatorfunc
Bram Moolenaar777e7c22021-10-25 17:07:04 +010046 let g:opt = &linebreak
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +010047
48 if a:0 " Invoked from Visual mode, use gv command.
49 silent exe "normal! gvy"
50 elseif a:type == 'line'
51 silent exe "normal! '[V']y"
52 else
53 silent exe "normal! `[v`]y"
54 endif
55 " Create a new dummy window
56 new
Bram Moolenaar777e7c22021-10-25 17:07:04 +010057 let g:bufnr = bufnr('%')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020058endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020059
Bram Moolenaar1671f442020-03-10 07:48:13 +010060func Test_normal00_optrans()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020061 new
62 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
63 1
64 exe "norm! Sfoobar\<esc>"
65 call assert_equal(['foobar', '2 This is the second line', '3 this is the third line', ''], getline(1,'$'))
66 2
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020067 exe "norm! $vbsone"
68 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 +020069 norm! VS Second line here
70 call assert_equal(['foobar', ' Second line here', '3 this is the third line', ''], getline(1, '$'))
71 %d
72 call append(0, ['4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line'])
73 call append(0, ['1 This is a simple test: abcd', '2 This is the second line', '3 this is the third line'])
74
75 1
76 norm! 2D
77 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,'$'))
78 set cpo+=#
79 norm! 4D
80 call assert_equal(['', '4 This is a simple test: abcd', '5 This is the second line', '6 this is the third line', ''], getline(1,'$'))
81
82 " clean up
83 set cpo-=#
84 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020085endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020086
Bram Moolenaar1bbb6192018-11-10 16:02:01 +010087func Test_normal01_keymodel()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020088 call Setup_NewWindow()
89 " Test 1: depending on 'keymodel' <s-down> does something different
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020090 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020091 call feedkeys("V\<S-Up>y", 'tx')
92 call assert_equal(['47', '48', '49', '50'], getline("'<", "'>"))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020093 set keymodel=startsel
94 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020095 call feedkeys("V\<S-Up>y", 'tx')
96 call assert_equal(['49', '50'], getline("'<", "'>"))
97 " Start visual mode when keymodel = startsel
Bram Moolenaar2931f2a2016-09-09 16:59:08 +020098 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +020099 call feedkeys("\<S-Up>y", 'tx')
100 call assert_equal(['49', '5'], getreg(0, 0, 1))
Bram Moolenaar1671f442020-03-10 07:48:13 +0100101 " Use the different Shift special keys
102 50
103 call feedkeys("\<S-Right>\<S-Left>\<S-Up>\<S-Down>\<S-Home>\<S-End>y", 'tx')
104 call assert_equal(['50'], getline("'<", "'>"))
105 call assert_equal(['50', ''], getreg(0, 0, 1))
106
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200107 " Do not start visual mode when keymodel=
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200108 set keymodel=
109 50
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200110 call feedkeys("\<S-Up>y$", 'tx')
111 call assert_equal(['42'], getreg(0, 0, 1))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200112 " Stop visual mode when keymodel=stopsel
113 set keymodel=stopsel
114 50
115 call feedkeys("Vkk\<Up>yy", 'tx')
116 call assert_equal(['47'], getreg(0, 0, 1))
117
118 set keymodel=
119 50
120 call feedkeys("Vkk\<Up>yy", 'tx')
121 call assert_equal(['47', '48', '49', '50'], getreg(0, 0, 1))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200122
Bram Moolenaard7e5e942020-10-07 16:54:52 +0200123 " Test for using special keys to start visual selection
124 %d
125 call setline(1, ['red fox tail', 'red fox tail', 'red fox tail'])
126 set keymodel=startsel
127 " Test for <S-PageUp> and <S-PageDown>
128 call cursor(1, 1)
129 call feedkeys("\<S-PageDown>y", 'xt')
130 call assert_equal([0, 1, 1, 0], getpos("'<"))
131 call assert_equal([0, 3, 1, 0], getpos("'>"))
132 call feedkeys("Gz\<CR>8|\<S-PageUp>y", 'xt')
133 call assert_equal([0, 2, 1, 0], getpos("'<"))
134 call assert_equal([0, 3, 8, 0], getpos("'>"))
135 " Test for <S-C-Home> and <S-C-End>
136 call cursor(2, 12)
137 call feedkeys("\<S-C-Home>y", 'xt')
138 call assert_equal([0, 1, 1, 0], getpos("'<"))
139 call assert_equal([0, 2, 12, 0], getpos("'>"))
140 call cursor(1, 4)
141 call feedkeys("\<S-C-End>y", 'xt')
142 call assert_equal([0, 1, 4, 0], getpos("'<"))
143 call assert_equal([0, 3, 13, 0], getpos("'>"))
144 " Test for <S-C-Left> and <S-C-Right>
145 call cursor(2, 5)
146 call feedkeys("\<S-C-Right>y", 'xt')
147 call assert_equal([0, 2, 5, 0], getpos("'<"))
148 call assert_equal([0, 2, 9, 0], getpos("'>"))
149 call cursor(2, 9)
150 call feedkeys("\<S-C-Left>y", 'xt')
151 call assert_equal([0, 2, 5, 0], getpos("'<"))
152 call assert_equal([0, 2, 9, 0], getpos("'>"))
153
154 set keymodel&
155
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200156 " clean up
157 bw!
158endfunc
159
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100160func Test_normal03_join()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200161 " basic join test
162 call Setup_NewWindow()
163 50
164 norm! VJ
165 call assert_equal('50 51', getline('.'))
166 $
167 norm! J
168 call assert_equal('100', getline('.'))
169 $
170 norm! V9-gJ
171 call assert_equal('919293949596979899100', getline('.'))
172 call setline(1, range(1,100))
173 $
174 :j 10
175 call assert_equal('100', getline('.'))
Bram Moolenaar004a6782020-04-11 17:09:31 +0200176 call assert_beeps('normal GVJ')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200177 " clean up
178 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200179endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200180
Bram Moolenaar004a6782020-04-11 17:09:31 +0200181" basic filter test
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100182func Test_normal04_filter()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200183 " only test on non windows platform
Bram Moolenaar004a6782020-04-11 17:09:31 +0200184 CheckNotMSWindows
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200185 call Setup_NewWindow()
186 1
187 call feedkeys("!!sed -e 's/^/| /'\n", 'tx')
188 call assert_equal('| 1', getline('.'))
189 90
190 :sil :!echo one
191 call feedkeys('.', 'tx')
192 call assert_equal('| 90', getline('.'))
193 95
194 set cpo+=!
195 " 2 <CR>, 1: for executing the command,
196 " 2: clear hit-enter-prompt
197 call feedkeys("!!\n", 'tx')
198 call feedkeys(":!echo one\n\n", 'tx')
199 call feedkeys(".", 'tx')
200 call assert_equal('one', getline('.'))
201 set cpo-=!
202 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200203endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200204
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100205func Test_normal05_formatexpr()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200206 " basic formatexpr test
207 call Setup_NewWindow()
208 %d_
209 call setline(1, ['here: 1 ', '2', 'here: 3 ', '4', 'not here: '])
210 1
211 set formatexpr=MyFormatExpr()
212 norm! gqG
213 call assert_equal(['here: 1->$', '2', 'here: 3->$', '4', 'not here: '], getline(1,'$'))
214 set formatexpr=
215 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200216endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200217
Bram Moolenaard77f9d52016-09-04 15:13:39 +0200218func Test_normal05_formatexpr_newbuf()
219 " Edit another buffer in the 'formatexpr' function
220 new
221 func! Format()
222 edit another
223 endfunc
224 set formatexpr=Format()
225 norm gqG
226 bw!
227 set formatexpr=
228endfunc
229
230func Test_normal05_formatexpr_setopt()
231 " Change the 'formatexpr' value in the function
232 new
233 func! Format()
234 set formatexpr=
235 endfunc
236 set formatexpr=Format()
237 norm gqG
238 bw!
239 set formatexpr=
240endfunc
241
Bram Moolenaar2eaeaf32020-05-03 16:04:43 +0200242" When 'formatexpr' returns non-zero, internal formatting is used.
243func Test_normal_formatexpr_returns_nonzero()
244 new
245 call setline(1, ['one', 'two'])
246 func! Format()
247 return 1
248 endfunc
249 setlocal formatexpr=Format()
250 normal VGgq
251 call assert_equal(['one two'], getline(1, '$'))
252 setlocal formatexpr=
253 delfunc Format
254 close!
255endfunc
256
Yegappan Lakshmanan8bb65f22021-12-26 10:51:39 +0000257" Test for using a script-local function for 'formatexpr'
258func Test_formatexpr_scriptlocal_func()
259 func! s:Format()
260 let g:FormatArgs = [v:lnum, v:count]
261 endfunc
262 set formatexpr=s:Format()
263 call assert_equal(expand('<SID>') .. 'Format()', &formatexpr)
264 new | only
265 call setline(1, range(1, 40))
266 let g:FormatArgs = []
267 normal! 2GVjgq
268 call assert_equal([2, 2], g:FormatArgs)
269 bw!
270 set formatexpr=<SID>Format()
271 call assert_equal(expand('<SID>') .. 'Format()', &formatexpr)
272 new | only
273 call setline(1, range(1, 40))
274 let g:FormatArgs = []
275 normal! 4GVjgq
276 call assert_equal([4, 2], g:FormatArgs)
277 bw!
278 let &formatexpr = 's:Format()'
279 new | only
280 call setline(1, range(1, 40))
281 let g:FormatArgs = []
282 normal! 6GVjgq
283 call assert_equal([6, 2], g:FormatArgs)
284 bw!
285 let &formatexpr = '<SID>Format()'
286 new | only
287 call setline(1, range(1, 40))
288 let g:FormatArgs = []
289 normal! 8GVjgq
290 call assert_equal([8, 2], g:FormatArgs)
291 setlocal formatexpr=
292 delfunc s:Format
293 bw!
294endfunc
295
Bram Moolenaar004a6782020-04-11 17:09:31 +0200296" basic test for formatprg
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100297func Test_normal06_formatprg()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200298 " only test on non windows platform
Bram Moolenaar004a6782020-04-11 17:09:31 +0200299 CheckNotMSWindows
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100300
301 " uses sed to number non-empty lines
302 call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/ /', '}'''], 'Xsed_format.sh')
303 call system('chmod +x ./Xsed_format.sh')
304 let text = ['a', '', 'c', '', ' ', 'd', 'e']
305 let expected = ['1 a', '', '3 c', '', '5 ', '6 d', '7 e']
306
307 10new
308 call setline(1, text)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200309 set formatprg=./Xsed_format.sh
310 norm! gggqG
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100311 call assert_equal(expected, getline(1, '$'))
Bram Moolenaar004a6782020-04-11 17:09:31 +0200312 %d
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100313
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100314 call setline(1, text)
315 set formatprg=donothing
316 setlocal formatprg=./Xsed_format.sh
317 norm! gggqG
318 call assert_equal(expected, getline(1, '$'))
Bram Moolenaar004a6782020-04-11 17:09:31 +0200319 %d
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100320
Bram Moolenaar004a6782020-04-11 17:09:31 +0200321 " Check for the command-line ranges added to 'formatprg'
322 set formatprg=cat
323 call setline(1, ['one', 'two', 'three', 'four', 'five'])
324 call feedkeys('gggqG', 'xt')
325 call assert_equal('.,$!cat', @:)
326 call feedkeys('2Ggq2j', 'xt')
327 call assert_equal('.,.+2!cat', @:)
328
329 bw!
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200330 " clean up
331 set formatprg=
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100332 setlocal formatprg=
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200333 call delete('Xsed_format.sh')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200334endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200335
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100336func Test_normal07_internalfmt()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200337 " basic test for internal formmatter to textwidth of 12
338 let list=range(1,11)
339 call map(list, 'v:val." "')
340 10new
341 call setline(1, list)
342 set tw=12
Bram Moolenaar004a6782020-04-11 17:09:31 +0200343 norm! ggVGgq
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200344 call assert_equal(['1 2 3', '4 5 6', '7 8 9', '10 11 '], getline(1, '$'))
345 " clean up
Bram Moolenaar9be7c042017-01-14 14:28:30 +0100346 set tw=0
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200347 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200348endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200349
Bram Moolenaar004a6782020-04-11 17:09:31 +0200350" basic tests for foldopen/folddelete
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100351func Test_normal08_fold()
Bram Moolenaar004a6782020-04-11 17:09:31 +0200352 CheckFeature folding
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200353 call Setup_NewWindow()
354 50
355 setl foldenable fdm=marker
356 " First fold
357 norm! V4jzf
358 " check that folds have been created
359 call assert_equal(['50/*{{{*/', '51', '52', '53', '54/*}}}*/'], getline(50,54))
360 " Second fold
361 46
362 norm! V10jzf
363 " check that folds have been created
364 call assert_equal('46/*{{{*/', getline(46))
365 call assert_equal('60/*}}}*/', getline(60))
366 norm! k
367 call assert_equal('45', getline('.'))
368 norm! j
369 call assert_equal('46/*{{{*/', getline('.'))
370 norm! j
371 call assert_equal('61', getline('.'))
372 norm! k
373 " open a fold
374 norm! Vzo
375 norm! k
376 call assert_equal('45', getline('.'))
377 norm! j
378 call assert_equal('46/*{{{*/', getline('.'))
379 norm! j
380 call assert_equal('47', getline('.'))
381 norm! k
382 norm! zcVzO
383 call assert_equal('46/*{{{*/', getline('.'))
384 norm! j
385 call assert_equal('47', getline('.'))
386 norm! j
387 call assert_equal('48', getline('.'))
388 norm! j
389 call assert_equal('49', getline('.'))
390 norm! j
391 call assert_equal('50/*{{{*/', getline('.'))
392 norm! j
393 call assert_equal('51', getline('.'))
394 " delete folds
395 :46
396 " collapse fold
397 norm! V14jzC
398 " delete all folds recursively
399 norm! VzD
400 call assert_equal(['46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60'], getline(46,60))
401
402 " clean up
403 setl nofoldenable fdm=marker
404 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200405endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200406
Bram Moolenaar2228cd72021-11-22 14:16:08 +0000407func Test_normal09a_operatorfunc()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200408 " Test operatorfunc
409 call Setup_NewWindow()
410 " Add some spaces for counting
411 50,60s/$/ /
412 unlet! g:a
413 let g:a=0
414 nmap <buffer><silent> ,, :set opfunc=CountSpaces<CR>g@
415 vmap <buffer><silent> ,, :<C-U>call CountSpaces(visualmode(), 1)<CR>
416 50
417 norm V2j,,
418 call assert_equal(6, g:a)
419 norm V,,
420 call assert_equal(2, g:a)
421 norm ,,l
422 call assert_equal(0, g:a)
423 50
424 exe "norm 0\<c-v>10j2l,,"
425 call assert_equal(11, g:a)
426 50
427 norm V10j,,
428 call assert_equal(22, g:a)
429
430 " clean up
431 unmap <buffer> ,,
432 set opfunc=
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100433 unlet! g:a
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200434 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200435endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200436
Bram Moolenaar2228cd72021-11-22 14:16:08 +0000437func Test_normal09b_operatorfunc()
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100438 " Test operatorfunc
439 call Setup_NewWindow()
440 " Add some spaces for counting
441 50,60s/$/ /
442 unlet! g:opt
443 set linebreak
444 nmap <buffer><silent> ,, :set opfunc=OpfuncDummy<CR>g@
445 50
446 norm ,,j
447 exe "bd!" g:bufnr
448 call assert_true(&linebreak)
449 call assert_equal(g:opt, &linebreak)
450 set nolinebreak
451 norm ,,j
452 exe "bd!" g:bufnr
453 call assert_false(&linebreak)
454 call assert_equal(g:opt, &linebreak)
455
456 " clean up
457 unmap <buffer> ,,
458 set opfunc=
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200459 call assert_fails('normal Vg@', 'E774:')
Bram Moolenaar4a08b0d2016-11-05 21:55:13 +0100460 bw!
461 unlet! g:opt
462endfunc
463
Bram Moolenaar2228cd72021-11-22 14:16:08 +0000464func OperatorfuncRedo(_)
465 let g:opfunc_count = v:count
466endfunc
467
Bram Moolenaarb3bd1d32022-01-02 13:05:45 +0000468func Underscorize(_)
469 normal! '[V']r_
470endfunc
471
Bram Moolenaar2228cd72021-11-22 14:16:08 +0000472func Test_normal09c_operatorfunc()
473 " Test redoing operatorfunc
474 new
475 call setline(1, 'some text')
476 set operatorfunc=OperatorfuncRedo
477 normal v3g@
478 call assert_equal(3, g:opfunc_count)
479 let g:opfunc_count = 0
480 normal .
481 call assert_equal(3, g:opfunc_count)
482
483 bw!
484 unlet g:opfunc_count
Bram Moolenaarb3bd1d32022-01-02 13:05:45 +0000485
486 " Test redoing Visual mode
487 set operatorfunc=Underscorize
488 new
489 call setline(1, ['first', 'first', 'third', 'third', 'second'])
naohiro ono5c75eed2022-01-03 11:15:47 +0000490 normal! 1GVjg@
Bram Moolenaarb3bd1d32022-01-02 13:05:45 +0000491 normal! 5G.
492 normal! 3G.
493 call assert_equal(['_____', '_____', '_____', '_____', '______'], getline(1, '$'))
494 bwipe!
Bram Moolenaar2228cd72021-11-22 14:16:08 +0000495 set operatorfunc=
496endfunc
497
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000498" Test for different ways of setting the 'operatorfunc' option
499func Test_opfunc_callback()
500 new
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000501 func OpFunc1(callnr, type)
502 let g:OpFunc1Args = [a:callnr, a:type]
503 endfunc
504 func OpFunc2(type)
505 let g:OpFunc2Args = [a:type]
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000506 endfunc
507
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000508 let lines =<< trim END
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000509 #" Test for using a function name
510 LET &opfunc = 'g:OpFunc2'
511 LET g:OpFunc2Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000512 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000513 call assert_equal(['char'], g:OpFunc2Args)
514
515 #" Test for using a function()
516 set opfunc=function('g:OpFunc1',\ [10])
517 LET g:OpFunc1Args = []
518 normal! g@l
519 call assert_equal([10, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000520
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000521 #" Using a funcref variable to set 'operatorfunc'
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000522 VAR Fn = function('g:OpFunc1', [11])
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000523 LET &opfunc = Fn
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000524 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000525 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000526 call assert_equal([11, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000527
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000528 #" Using a string(funcref_variable) to set 'operatorfunc'
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000529 LET Fn = function('g:OpFunc1', [12])
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000530 LET &operatorfunc = string(Fn)
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000531 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000532 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000533 call assert_equal([12, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000534
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000535 #" Test for using a funcref()
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000536 set operatorfunc=funcref('g:OpFunc1',\ [13])
537 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000538 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000539 call assert_equal([13, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000540
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000541 #" Using a funcref variable to set 'operatorfunc'
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000542 LET Fn = funcref('g:OpFunc1', [14])
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000543 LET &opfunc = Fn
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000544 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000545 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000546 call assert_equal([14, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000547
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000548 #" Using a string(funcref_variable) to set 'operatorfunc'
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000549 LET Fn = funcref('g:OpFunc1', [15])
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000550 LET &opfunc = string(Fn)
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000551 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000552 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000553 call assert_equal([15, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000554
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000555 #" Test for using a lambda function using set
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000556 VAR optval = "LSTART a LMIDDLE OpFunc1(16, a) LEND"
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000557 LET optval = substitute(optval, ' ', '\\ ', 'g')
558 exe "set opfunc=" .. optval
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000559 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000560 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000561 call assert_equal([16, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000562
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000563 #" Test for using a lambda function using LET
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000564 LET &opfunc = LSTART a LMIDDLE OpFunc1(17, a) LEND
565 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000566 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000567 call assert_equal([17, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000568
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000569 #" Set 'operatorfunc' to a string(lambda expression)
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000570 LET &opfunc = 'LSTART a LMIDDLE OpFunc1(18, a) LEND'
571 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000572 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000573 call assert_equal([18, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000574
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000575 #" Set 'operatorfunc' to a variable with a lambda expression
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000576 VAR Lambda = LSTART a LMIDDLE OpFunc1(19, a) LEND
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000577 LET &opfunc = Lambda
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000578 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000579 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000580 call assert_equal([19, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000581
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000582 #" Set 'operatorfunc' to a string(variable with a lambda expression)
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000583 LET Lambda = LSTART a LMIDDLE OpFunc1(20, a) LEND
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000584 LET &opfunc = string(Lambda)
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000585 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000586 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000587 call assert_equal([20, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000588
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000589 #" Try to use 'operatorfunc' after the function is deleted
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000590 func g:TmpOpFunc1(type)
591 let g:TmpOpFunc1Args = [21, a:type]
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000592 endfunc
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000593 LET &opfunc = function('g:TmpOpFunc1')
594 delfunc g:TmpOpFunc1
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000595 call test_garbagecollect_now()
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000596 LET g:TmpOpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000597 call assert_fails('normal! g@l', 'E117:')
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000598 call assert_equal([], g:TmpOpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000599
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000600 #" Try to use a function with two arguments for 'operatorfunc'
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000601 func g:TmpOpFunc2(x, y)
602 let g:TmpOpFunc2Args = [a:x, a:y]
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000603 endfunc
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000604 set opfunc=TmpOpFunc2
605 LET g:TmpOpFunc2Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000606 call assert_fails('normal! g@l', 'E119:')
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000607 call assert_equal([], g:TmpOpFunc2Args)
608 delfunc TmpOpFunc2
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000609
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000610 #" Try to use a lambda function with two arguments for 'operatorfunc'
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000611 LET &opfunc = LSTART a, b LMIDDLE OpFunc1(22, b) LEND
612 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000613 call assert_fails('normal! g@l', 'E119:')
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000614 call assert_equal([], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000615
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000616 #" Test for clearing the 'operatorfunc' option
617 set opfunc=''
618 set opfunc&
619 call assert_fails("set opfunc=function('abc')", "E700:")
620 call assert_fails("set opfunc=funcref('abc')", "E700:")
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000621
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000622 #" set 'operatorfunc' to a non-existing function
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000623 LET &opfunc = function('g:OpFunc1', [23])
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000624 call assert_fails("set opfunc=function('NonExistingFunc')", 'E700:')
625 call assert_fails("LET &opfunc = function('NonExistingFunc')", 'E700:')
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000626 LET g:OpFunc1Args = []
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000627 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000628 call assert_equal([23, 'char'], g:OpFunc1Args)
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000629 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000630 call v9.CheckTransLegacySuccess(lines)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000631
Yegappan Lakshmanandb1a4102021-12-17 16:21:20 +0000632 " Test for using a script-local function name
633 func s:OpFunc3(type)
634 let g:OpFunc3Args = [a:type]
635 endfunc
636 set opfunc=s:OpFunc3
637 let g:OpFunc3Args = []
638 normal! g@l
639 call assert_equal(['char'], g:OpFunc3Args)
640
641 let &opfunc = 's:OpFunc3'
642 let g:OpFunc3Args = []
643 normal! g@l
644 call assert_equal(['char'], g:OpFunc3Args)
645 delfunc s:OpFunc3
646
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000647 " Using Vim9 lambda expression in legacy context should fail
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000648 set opfunc=(a)\ =>\ OpFunc1(24,\ a)
649 let g:OpFunc1Args = []
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000650 call assert_fails('normal! g@l', 'E117:')
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000651 call assert_equal([], g:OpFunc1Args)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000652
Yegappan Lakshmanan6ae8fae2021-12-12 16:26:44 +0000653 " set 'operatorfunc' to a partial with dict. This used to cause a crash.
654 func SetOpFunc()
655 let operator = {'execute': function('OperatorExecute')}
656 let &opfunc = operator.execute
657 endfunc
658 func OperatorExecute(_) dict
659 endfunc
660 call SetOpFunc()
661 call test_garbagecollect_now()
662 set operatorfunc=
663 delfunc SetOpFunc
664 delfunc OperatorExecute
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000665
666 " Vim9 tests
667 let lines =<< trim END
668 vim9script
669
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000670 def g:Vim9opFunc(val: number, type: string): void
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000671 g:OpFunc1Args = [val, type]
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000672 enddef
Yegappan Lakshmanandb1a4102021-12-17 16:21:20 +0000673
674 # Test for using a def function with opfunc
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000675 set opfunc=function('g:Vim9opFunc',\ [60])
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000676 g:OpFunc1Args = []
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000677 normal! g@l
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000678 assert_equal([60, 'char'], g:OpFunc1Args)
Yegappan Lakshmanandb1a4102021-12-17 16:21:20 +0000679
680 # Test for using a global function name
681 &opfunc = g:OpFunc2
682 g:OpFunc2Args = []
683 normal! g@l
684 assert_equal(['char'], g:OpFunc2Args)
685 bw!
686
687 # Test for using a script-local function name
Bram Moolenaar62b191c2022-02-12 20:34:50 +0000688 def LocalOpFunc(type: string): void
Yegappan Lakshmanandb1a4102021-12-17 16:21:20 +0000689 g:LocalOpFuncArgs = [type]
690 enddef
Bram Moolenaar62b191c2022-02-12 20:34:50 +0000691 &opfunc = LocalOpFunc
Yegappan Lakshmanandb1a4102021-12-17 16:21:20 +0000692 g:LocalOpFuncArgs = []
693 normal! g@l
694 assert_equal(['char'], g:LocalOpFuncArgs)
695 bw!
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000696 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000697 call v9.CheckScriptSuccess(lines)
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000698
Yegappan Lakshmanane7f4abd2021-12-24 20:47:38 +0000699 " setting 'opfunc' to a script local function outside of a script context
700 " should fail
701 let cleanup =<< trim END
702 call writefile([execute('messages')], 'Xtest.out')
703 qall
704 END
705 call writefile(cleanup, 'Xverify.vim')
706 call RunVim([], [], "-c \"set opfunc=s:abc\" -S Xverify.vim")
707 call assert_match('E81: Using <SID> not in a', readfile('Xtest.out')[0])
708 call delete('Xtest.out')
709 call delete('Xverify.vim')
710
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000711 " cleanup
712 set opfunc&
Yegappan Lakshmanan04ef1fb2021-12-12 20:08:05 +0000713 delfunc OpFunc1
714 delfunc OpFunc2
715 unlet g:OpFunc1Args g:OpFunc2Args
Yegappan Lakshmanan2172bff2021-12-08 10:46:21 +0000716 %bw!
717endfunc
718
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100719func Test_normal10_expand()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200720 " Test for expand()
721 10new
722 call setline(1, ['1', 'ifooar,,cbar'])
723 2
724 norm! $
Bram Moolenaar65f08472017-09-10 18:16:20 +0200725 call assert_equal('cbar', expand('<cword>'))
726 call assert_equal('ifooar,,cbar', expand('<cWORD>'))
727
728 call setline(1, ['prx = list[idx];'])
729 1
730 let expected = ['', 'prx', 'prx', 'prx',
731 \ 'list', 'list', 'list', 'list', 'list', 'list', 'list',
732 \ 'idx', 'idx', 'idx', 'idx',
733 \ 'list[idx]',
734 \ '];',
735 \ ]
736 for i in range(1, 16)
737 exe 'norm ' . i . '|'
738 call assert_equal(expected[i], expand('<cexpr>'), 'i == ' . i)
739 endfor
740
Bram Moolenaard7e5e942020-10-07 16:54:52 +0200741 " Test for <cexpr> in state.val and ptr->val
742 call setline(1, 'x = state.val;')
743 call cursor(1, 10)
744 call assert_equal('state.val', expand('<cexpr>'))
745 call setline(1, 'x = ptr->val;')
746 call cursor(1, 9)
747 call assert_equal('ptr->val', expand('<cexpr>'))
748
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100749 if executable('echo')
750 " Test expand(`...`) i.e. backticks command expansion.
Bram Moolenaar077ff432019-10-28 00:42:21 +0100751 call assert_equal('abcde', expand('`echo abcde`'))
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100752 endif
753
754 " Test expand(`=...`) i.e. backticks expression expansion
755 call assert_equal('5', expand('`=2+3`'))
Bram Moolenaar8b633132020-03-20 18:20:51 +0100756 call assert_equal('3.14', expand('`=3.14`'))
Bram Moolenaarae6f8652017-12-20 22:32:20 +0100757
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200758 " clean up
759 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200760endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200761
Bram Moolenaard7e5e942020-10-07 16:54:52 +0200762" Test for expand() in latin1 encoding
763func Test_normal_expand_latin1()
764 new
765 let save_enc = &encoding
766 set encoding=latin1
767 call setline(1, 'val = item->color;')
768 call cursor(1, 11)
769 call assert_equal('color', expand("<cword>"))
770 call assert_equal('item->color', expand("<cexpr>"))
771 let &encoding = save_enc
772 bw!
773endfunc
774
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100775func Test_normal11_showcmd()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200776 " test for 'showcmd'
777 10new
778 exe "norm! ofoobar\<esc>"
779 call assert_equal(2, line('$'))
780 set showcmd
781 exe "norm! ofoobar2\<esc>"
782 call assert_equal(3, line('$'))
783 exe "norm! VAfoobar3\<esc>"
784 call assert_equal(3, line('$'))
785 exe "norm! 0d3\<del>2l"
786 call assert_equal('obar2foobar3', getline('.'))
Bram Moolenaard1ad99b2020-10-04 16:16:54 +0200787 " test for the visual block size displayed in the status line
788 call setline(1, ['aaaaa', 'bbbbb', 'ccccc'])
789 call feedkeys("ggl\<C-V>lljj", 'xt')
790 redraw!
791 call assert_match('3x3$', Screenline(&lines))
792 call feedkeys("\<C-V>", 'xt')
793 " test for visually selecting a multi-byte character
794 call setline(1, ["\U2206"])
795 call feedkeys("ggv", 'xt')
796 redraw!
797 call assert_match('1-3$', Screenline(&lines))
798 call feedkeys("v", 'xt')
Bram Moolenaard7e5e942020-10-07 16:54:52 +0200799 " test for visually selecting the end of line
800 call setline(1, ["foobar"])
801 call feedkeys("$vl", 'xt')
802 redraw!
803 call assert_match('2$', Screenline(&lines))
804 call feedkeys("y", 'xt')
805 call assert_equal("r\n", @")
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200806 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200807endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200808
Bram Moolenaar1671f442020-03-10 07:48:13 +0100809" Test for nv_error and normal command errors
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100810func Test_normal12_nv_error()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200811 10new
812 call setline(1, range(1,5))
813 " should not do anything, just beep
Bram Moolenaarf5f1e102020-03-08 05:13:15 +0100814 call assert_beeps('exe "norm! <c-k>"')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200815 call assert_equal(map(range(1,5), 'string(v:val)'), getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +0100816 call assert_beeps('normal! G2dd')
817 call assert_beeps("normal! g\<C-A>")
818 call assert_beeps("normal! g\<C-X>")
819 call assert_beeps("normal! g\<C-B>")
Bram Moolenaar1671f442020-03-10 07:48:13 +0100820 call assert_beeps("normal! vQ\<Esc>")
821 call assert_beeps("normal! 2[[")
822 call assert_beeps("normal! 2]]")
823 call assert_beeps("normal! 2[]")
824 call assert_beeps("normal! 2][")
825 call assert_beeps("normal! 4[z")
826 call assert_beeps("normal! 4]z")
827 call assert_beeps("normal! 4[c")
828 call assert_beeps("normal! 4]c")
829 call assert_beeps("normal! 200%")
830 call assert_beeps("normal! %")
831 call assert_beeps("normal! 2{")
832 call assert_beeps("normal! 2}")
833 call assert_beeps("normal! r\<Right>")
834 call assert_beeps("normal! 8ry")
835 call assert_beeps('normal! "@')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200836 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200837endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200838
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100839func Test_normal13_help()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200840 " Test for F1
841 call assert_equal(1, winnr())
842 call feedkeys("\<f1>", 'txi')
843 call assert_match('help\.txt', bufname('%'))
844 call assert_equal(2, winnr('$'))
845 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200846endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200847
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100848func Test_normal14_page()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200849 " basic test for Ctrl-F and Ctrl-B
850 call Setup_NewWindow()
851 exe "norm! \<c-f>"
852 call assert_equal('9', getline('.'))
853 exe "norm! 2\<c-f>"
854 call assert_equal('25', getline('.'))
855 exe "norm! 2\<c-b>"
856 call assert_equal('18', getline('.'))
857 1
858 set scrolloff=5
859 exe "norm! 2\<c-f>"
860 call assert_equal('21', getline('.'))
861 exe "norm! \<c-b>"
862 call assert_equal('13', getline('.'))
863 1
864 set scrolloff=99
865 exe "norm! \<c-f>"
866 call assert_equal('13', getline('.'))
867 set scrolloff=0
868 100
869 exe "norm! $\<c-b>"
870 call assert_equal('92', getline('.'))
871 call assert_equal([0, 92, 1, 0, 1], getcurpos())
872 100
873 set nostartofline
874 exe "norm! $\<c-b>"
875 call assert_equal('92', getline('.'))
naohiro ono56200ee2022-01-01 14:59:44 +0000876 call assert_equal([0, 92, 2, 0, v:maxcol], getcurpos())
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200877 " cleanup
878 set startofline
879 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +0200880endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200881
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100882func Test_normal14_page_eol()
Bram Moolenaarbc54f3f2016-09-04 14:34:28 +0200883 10new
884 norm oxxxxxxx
885 exe "norm 2\<c-f>"
886 " check with valgrind that cursor is put back in column 1
887 exe "norm 2\<c-b>"
888 bw!
889endfunc
890
Bram Moolenaar1671f442020-03-10 07:48:13 +0100891" Test for errors with z command
892func Test_normal_z_error()
893 call assert_beeps('normal! z2p')
Christian Brabandt2fa93842021-05-30 22:17:25 +0200894 call assert_beeps('normal! zq')
Yegappan Lakshmananb0ad2d92022-01-27 13:16:59 +0000895 call assert_beeps('normal! cz1')
Bram Moolenaar1671f442020-03-10 07:48:13 +0100896endfunc
897
Bram Moolenaar1bbb6192018-11-10 16:02:01 +0100898func Test_normal15_z_scroll_vert()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200899 " basic test for z commands that scroll the window
900 call Setup_NewWindow()
901 100
902 norm! >>
903 " Test for z<cr>
904 exe "norm! z\<cr>"
905 call assert_equal(' 100', getline('.'))
906 call assert_equal(100, winsaveview()['topline'])
907 call assert_equal([0, 100, 2, 0, 9], getcurpos())
908
909 " Test for zt
910 21
911 norm! >>0zt
912 call assert_equal(' 21', getline('.'))
913 call assert_equal(21, winsaveview()['topline'])
914 call assert_equal([0, 21, 1, 0, 8], getcurpos())
915
916 " Test for zb
917 30
918 norm! >>$ztzb
919 call assert_equal(' 30', getline('.'))
920 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
naohiro ono56200ee2022-01-01 14:59:44 +0000921 call assert_equal([0, 30, 3, 0, v:maxcol], getcurpos())
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200922
923 " Test for z-
924 1
925 30
926 norm! 0z-
927 call assert_equal(' 30', getline('.'))
928 call assert_equal(30, winsaveview()['topline']+winheight(0)-1)
929 call assert_equal([0, 30, 2, 0, 9], getcurpos())
930
931 " Test for z{height}<cr>
932 call assert_equal(10, winheight(0))
933 exe "norm! z12\<cr>"
934 call assert_equal(12, winheight(0))
Yegappan Lakshmananb0ad2d92022-01-27 13:16:59 +0000935 exe "norm! z15\<Del>0\<cr>"
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200936 call assert_equal(10, winheight(0))
937
938 " Test for z.
939 1
940 21
941 norm! 0z.
942 call assert_equal(' 21', getline('.'))
943 call assert_equal(17, winsaveview()['topline'])
944 call assert_equal([0, 21, 2, 0, 9], getcurpos())
945
946 " Test for zz
947 1
948 21
949 norm! 0zz
950 call assert_equal(' 21', getline('.'))
951 call assert_equal(17, winsaveview()['topline'])
952 call assert_equal([0, 21, 1, 0, 8], getcurpos())
953
954 " Test for z+
955 11
956 norm! zt
957 norm! z+
958 call assert_equal(' 21', getline('.'))
959 call assert_equal(21, winsaveview()['topline'])
960 call assert_equal([0, 21, 2, 0, 9], getcurpos())
961
962 " Test for [count]z+
963 1
964 norm! 21z+
965 call assert_equal(' 21', getline('.'))
966 call assert_equal(21, winsaveview()['topline'])
967 call assert_equal([0, 21, 2, 0, 9], getcurpos())
968
Bram Moolenaar8a9bc952020-10-02 18:48:07 +0200969 " Test for z+ with [count] greater than buffer size
970 1
971 norm! 1000z+
972 call assert_equal(' 100', getline('.'))
973 call assert_equal(100, winsaveview()['topline'])
974 call assert_equal([0, 100, 2, 0, 9], getcurpos())
975
976 " Test for z+ from the last buffer line
977 norm! Gz.z+
978 call assert_equal(' 100', getline('.'))
979 call assert_equal(100, winsaveview()['topline'])
980 call assert_equal([0, 100, 2, 0, 9], getcurpos())
981
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200982 " Test for z^
983 norm! 22z+0
984 norm! z^
985 call assert_equal(' 21', getline('.'))
986 call assert_equal(12, winsaveview()['topline'])
987 call assert_equal([0, 21, 2, 0, 9], getcurpos())
988
Bram Moolenaar8a9bc952020-10-02 18:48:07 +0200989 " Test for z^ from first buffer line
990 norm! ggz^
991 call assert_equal('1', getline('.'))
992 call assert_equal(1, winsaveview()['topline'])
993 call assert_equal([0, 1, 1, 0, 1], getcurpos())
994
Bram Moolenaar87bc3f72016-09-03 17:33:54 +0200995 " Test for [count]z^
996 1
997 norm! 30z^
998 call assert_equal(' 21', getline('.'))
999 call assert_equal(12, winsaveview()['topline'])
1000 call assert_equal([0, 21, 2, 0, 9], getcurpos())
1001
1002 " cleanup
1003 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001004endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001005
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001006func Test_normal16_z_scroll_hor()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001007 " basic test for z commands that scroll the window
1008 10new
1009 15vsp
1010 set nowrap listchars=
1011 let lineA='abcdefghijklmnopqrstuvwxyz'
1012 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
1013 $put =lineA
1014 $put =lineB
1015 1d
1016
Bram Moolenaar1671f442020-03-10 07:48:13 +01001017 " Test for zl and zh with a count
1018 norm! 0z10l
1019 call assert_equal([11, 1], [col('.'), wincol()])
1020 norm! z4h
1021 call assert_equal([11, 5], [col('.'), wincol()])
1022 normal! 2gg
1023
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001024 " Test for zl
1025 1
1026 norm! 5zl
1027 call assert_equal(lineA, getline('.'))
1028 call assert_equal(6, col('.'))
1029 call assert_equal(5, winsaveview()['leftcol'])
1030 norm! yl
1031 call assert_equal('f', @0)
1032
1033 " Test for zh
1034 norm! 2zh
1035 call assert_equal(lineA, getline('.'))
1036 call assert_equal(6, col('.'))
1037 norm! yl
1038 call assert_equal('f', @0)
1039 call assert_equal(3, winsaveview()['leftcol'])
1040
1041 " Test for zL
1042 norm! zL
1043 call assert_equal(11, col('.'))
1044 norm! yl
1045 call assert_equal('k', @0)
1046 call assert_equal(10, winsaveview()['leftcol'])
1047 norm! 2zL
1048 call assert_equal(25, col('.'))
1049 norm! yl
1050 call assert_equal('y', @0)
1051 call assert_equal(24, winsaveview()['leftcol'])
1052
1053 " Test for zH
1054 norm! 2zH
1055 call assert_equal(25, col('.'))
1056 call assert_equal(10, winsaveview()['leftcol'])
1057 norm! yl
1058 call assert_equal('y', @0)
1059
1060 " Test for zs
1061 norm! $zs
1062 call assert_equal(26, col('.'))
1063 call assert_equal(25, winsaveview()['leftcol'])
1064 norm! yl
1065 call assert_equal('z', @0)
1066
1067 " Test for ze
1068 norm! ze
1069 call assert_equal(26, col('.'))
1070 call assert_equal(11, winsaveview()['leftcol'])
1071 norm! yl
1072 call assert_equal('z', @0)
1073
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02001074 " Test for zs and ze with folds
1075 %fold
1076 norm! $zs
1077 call assert_equal(26, col('.'))
1078 call assert_equal(0, winsaveview()['leftcol'])
1079 norm! yl
1080 call assert_equal('z', @0)
1081 norm! ze
1082 call assert_equal(26, col('.'))
1083 call assert_equal(0, winsaveview()['leftcol'])
1084 norm! yl
1085 call assert_equal('z', @0)
1086
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001087 " cleanup
1088 set wrap listchars=eol:$
1089 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001090endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001091
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001092func Test_normal17_z_scroll_hor2()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001093 " basic test for z commands that scroll the window
1094 " using 'sidescrolloff' setting
1095 10new
1096 20vsp
1097 set nowrap listchars= sidescrolloff=5
1098 let lineA='abcdefghijklmnopqrstuvwxyz'
1099 let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
1100 $put =lineA
1101 $put =lineB
1102 1d
1103
1104 " Test for zl
1105 1
1106 norm! 5zl
1107 call assert_equal(lineA, getline('.'))
1108 call assert_equal(11, col('.'))
1109 call assert_equal(5, winsaveview()['leftcol'])
1110 norm! yl
1111 call assert_equal('k', @0)
1112
1113 " Test for zh
1114 norm! 2zh
1115 call assert_equal(lineA, getline('.'))
1116 call assert_equal(11, col('.'))
1117 norm! yl
1118 call assert_equal('k', @0)
1119 call assert_equal(3, winsaveview()['leftcol'])
1120
1121 " Test for zL
1122 norm! 0zL
1123 call assert_equal(16, col('.'))
1124 norm! yl
1125 call assert_equal('p', @0)
1126 call assert_equal(10, winsaveview()['leftcol'])
1127 norm! 2zL
1128 call assert_equal(26, col('.'))
1129 norm! yl
1130 call assert_equal('z', @0)
1131 call assert_equal(15, winsaveview()['leftcol'])
1132
1133 " Test for zH
1134 norm! 2zH
1135 call assert_equal(15, col('.'))
1136 call assert_equal(0, winsaveview()['leftcol'])
1137 norm! yl
1138 call assert_equal('o', @0)
1139
1140 " Test for zs
1141 norm! $zs
1142 call assert_equal(26, col('.'))
1143 call assert_equal(20, winsaveview()['leftcol'])
1144 norm! yl
1145 call assert_equal('z', @0)
1146
1147 " Test for ze
1148 norm! ze
1149 call assert_equal(26, col('.'))
1150 call assert_equal(11, winsaveview()['leftcol'])
1151 norm! yl
1152 call assert_equal('z', @0)
1153
1154 " cleanup
1155 set wrap listchars=eol:$ sidescrolloff=0
1156 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001157endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001158
Bram Moolenaarbdd2c292020-06-22 21:34:30 +02001159" Test for commands that scroll the window horizontally. Test with folds.
1160" H, M, L, CTRL-E, CTRL-Y, CTRL-U, CTRL-D, PageUp, PageDown commands
1161func Test_vert_scroll_cmds()
Bram Moolenaar1671f442020-03-10 07:48:13 +01001162 15new
1163 call setline(1, range(1, 100))
1164 exe "normal! 30ggz\<CR>"
1165 set foldenable
1166 33,36fold
1167 40,43fold
1168 46,49fold
1169 let h = winheight(0)
Bram Moolenaarbdd2c292020-06-22 21:34:30 +02001170
1171 " Test for H, M and L commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01001172 " Top of the screen = 30
1173 " Folded lines = 9
1174 " Bottom of the screen = 30 + h + 9 - 1
1175 normal! 4L
1176 call assert_equal(35 + h, line('.'))
1177 normal! 4H
1178 call assert_equal(33, line('.'))
Bram Moolenaarbdd2c292020-06-22 21:34:30 +02001179
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02001180 " Test for using a large count value
1181 %d
1182 call setline(1, range(1, 4))
1183 norm! 6H
1184 call assert_equal(4, line('.'))
1185
1186 " Test for 'M' with folded lines
1187 %d
1188 call setline(1, range(1, 20))
1189 1,5fold
1190 norm! LM
1191 call assert_equal(12, line('.'))
1192
Bram Moolenaarbdd2c292020-06-22 21:34:30 +02001193 " Test for the CTRL-E and CTRL-Y commands with folds
1194 %d
1195 call setline(1, range(1, 10))
1196 3,5fold
1197 exe "normal 6G3\<C-E>"
1198 call assert_equal(6, line('w0'))
1199 exe "normal 2\<C-Y>"
1200 call assert_equal(2, line('w0'))
1201
1202 " Test for CTRL-Y on a folded line
1203 %d
1204 call setline(1, range(1, 100))
1205 exe (h + 2) .. "," .. (h + 4) .. "fold"
1206 exe h + 5
1207 normal z-
1208 exe "normal \<C-Y>\<C-Y>"
1209 call assert_equal(h + 1, line('w$'))
1210
Bram Moolenaard1ad99b2020-10-04 16:16:54 +02001211 " Test for CTRL-Y from the first line and CTRL-E from the last line
1212 %d
1213 set scrolloff=2
1214 call setline(1, range(1, 4))
1215 exe "normal gg\<C-Y>"
1216 call assert_equal(1, line('w0'))
1217 call assert_equal(1, line('.'))
1218 exe "normal G4\<C-E>\<C-E>"
1219 call assert_equal(4, line('w$'))
1220 call assert_equal(4, line('.'))
1221 set scrolloff&
1222
Bram Moolenaarbdd2c292020-06-22 21:34:30 +02001223 " Using <PageUp> and <PageDown> in an empty buffer should beep
1224 %d
1225 call assert_beeps('exe "normal \<PageUp>"')
1226 call assert_beeps('exe "normal \<C-B>"')
1227 call assert_beeps('exe "normal \<PageDown>"')
1228 call assert_beeps('exe "normal \<C-F>"')
1229
1230 " Test for <C-U> and <C-D> with fold
1231 %d
1232 call setline(1, range(1, 100))
1233 10,35fold
1234 set scroll=10
1235 exe "normal \<C-D>"
1236 call assert_equal(36, line('.'))
1237 exe "normal \<C-D>"
1238 call assert_equal(46, line('.'))
1239 exe "normal \<C-U>"
1240 call assert_equal(36, line('.'))
1241 exe "normal \<C-U>"
1242 call assert_equal(10, line('.'))
1243 exe "normal \<C-U>"
1244 call assert_equal(1, line('.'))
1245 set scroll&
1246
1247 " Test for scrolling to the top of the file with <C-U> and a fold
1248 10
1249 normal ztL
1250 exe "normal \<C-U>\<C-U>"
1251 call assert_equal(1, line('w0'))
1252
1253 " Test for CTRL-D on a folded line
1254 %d
1255 call setline(1, range(1, 100))
1256 50,100fold
1257 75
1258 normal z-
1259 exe "normal \<C-D>"
1260 call assert_equal(50, line('.'))
1261 call assert_equal(100, line('w$'))
1262 normal z.
1263 let lnum = winline()
1264 exe "normal \<C-D>"
1265 call assert_equal(lnum, winline())
1266 call assert_equal(50, line('.'))
1267 normal zt
1268 exe "normal \<C-D>"
1269 call assert_equal(50, line('w0'))
1270
Bram Moolenaard1ad99b2020-10-04 16:16:54 +02001271 " Test for <S-CR>. Page down.
1272 %d
1273 call setline(1, range(1, 100))
1274 call feedkeys("\<S-CR>", 'xt')
1275 call assert_equal(14, line('w0'))
1276 call assert_equal(28, line('w$'))
1277
1278 " Test for <S-->. Page up.
1279 call feedkeys("\<S-->", 'xt')
1280 call assert_equal(1, line('w0'))
1281 call assert_equal(15, line('w$'))
1282
Bram Moolenaar1671f442020-03-10 07:48:13 +01001283 set foldenable&
1284 close!
1285endfunc
1286
Bram Moolenaar777e7c22021-10-25 17:07:04 +01001287func Test_scroll_in_ex_mode()
1288 " This was using invalid memory because w_botline was invalid.
1289 let lines =<< trim END
1290 diffsplit
1291 norm os00(
1292 call writefile(['done'], 'Xdone')
1293 qa!
1294 END
1295 call writefile(lines, 'Xscript')
1296 call assert_equal(1, RunVim([], [], '--clean -X -Z -e -s -S Xscript'))
1297 call assert_equal(['done'], readfile('Xdone'))
1298
1299 call delete('Xscript')
1300 call delete('Xdone')
1301endfunc
1302
Bram Moolenaarbdd2c292020-06-22 21:34:30 +02001303" Test for the 'sidescroll' option
1304func Test_sidescroll_opt()
1305 new
1306 20vnew
1307
1308 " scroll by 2 characters horizontally
1309 set sidescroll=2 nowrap
1310 call setline(1, repeat('a', 40))
1311 normal g$l
1312 call assert_equal(19, screenpos(0, 1, 21).col)
1313 normal l
1314 call assert_equal(20, screenpos(0, 1, 22).col)
1315 normal g0h
1316 call assert_equal(2, screenpos(0, 1, 2).col)
1317 call assert_equal(20, screenpos(0, 1, 20).col)
1318
1319 " when 'sidescroll' is 0, cursor positioned at the center
1320 set sidescroll=0
1321 normal g$l
1322 call assert_equal(11, screenpos(0, 1, 21).col)
1323 normal g0h
1324 call assert_equal(10, screenpos(0, 1, 10).col)
1325
1326 %bw!
1327 set wrap& sidescroll&
1328endfunc
1329
Bram Moolenaar004a6782020-04-11 17:09:31 +02001330" basic tests for foldopen/folddelete
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001331func Test_normal18_z_fold()
Bram Moolenaar004a6782020-04-11 17:09:31 +02001332 CheckFeature folding
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001333 call Setup_NewWindow()
1334 50
1335 setl foldenable fdm=marker foldlevel=5
1336
Bram Moolenaar1671f442020-03-10 07:48:13 +01001337 call assert_beeps('normal! zj')
1338 call assert_beeps('normal! zk')
1339
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001340 " Test for zF
1341 " First fold
1342 norm! 4zF
1343 " check that folds have been created
1344 call assert_equal(['50/*{{{*/', '51', '52', '53/*}}}*/'], getline(50,53))
1345
1346 " Test for zd
1347 51
1348 norm! 2zF
1349 call assert_equal(2, foldlevel('.'))
1350 norm! kzd
1351 call assert_equal(['50', '51/*{{{*/', '52/*}}}*/', '53'], getline(50,53))
1352 norm! j
1353 call assert_equal(1, foldlevel('.'))
1354
1355 " Test for zD
1356 " also deletes partially selected folds recursively
1357 51
1358 norm! zF
1359 call assert_equal(2, foldlevel('.'))
1360 norm! kV2jzD
1361 call assert_equal(['50', '51', '52', '53'], getline(50,53))
1362
1363 " Test for zE
1364 85
1365 norm! 4zF
1366 86
1367 norm! 2zF
1368 90
1369 norm! 4zF
1370 call assert_equal(['85/*{{{*/', '86/*{{{*/', '87/*}}}*/', '88/*}}}*/', '89', '90/*{{{*/', '91', '92', '93/*}}}*/'], getline(85,93))
1371 norm! zE
1372 call assert_equal(['85', '86', '87', '88', '89', '90', '91', '92', '93'], getline(85,93))
1373
1374 " Test for zn
1375 50
1376 set foldlevel=0
1377 norm! 2zF
1378 norm! zn
1379 norm! k
1380 call assert_equal('49', getline('.'))
1381 norm! j
1382 call assert_equal('50/*{{{*/', getline('.'))
1383 norm! j
1384 call assert_equal('51/*}}}*/', getline('.'))
1385 norm! j
1386 call assert_equal('52', getline('.'))
1387 call assert_equal(0, &foldenable)
1388
1389 " Test for zN
1390 49
1391 norm! zN
1392 call assert_equal('49', getline('.'))
1393 norm! j
1394 call assert_equal('50/*{{{*/', getline('.'))
1395 norm! j
1396 call assert_equal('52', getline('.'))
1397 call assert_equal(1, &foldenable)
1398
1399 " Test for zi
1400 norm! zi
1401 call assert_equal(0, &foldenable)
1402 norm! zi
1403 call assert_equal(1, &foldenable)
1404 norm! zi
1405 call assert_equal(0, &foldenable)
1406 norm! zi
1407 call assert_equal(1, &foldenable)
1408
1409 " Test for za
1410 50
1411 norm! za
1412 norm! k
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 50
1421 norm! za
1422 norm! k
1423 call assert_equal('49', getline('.'))
1424 norm! j
1425 call assert_equal('50/*{{{*/', getline('.'))
1426 norm! j
1427 call assert_equal('52', getline('.'))
1428
1429 49
1430 norm! 5zF
1431 norm! k
1432 call assert_equal('48', getline('.'))
1433 norm! j
1434 call assert_equal('49/*{{{*/', getline('.'))
1435 norm! j
1436 call assert_equal('55', getline('.'))
1437 49
1438 norm! za
1439 call assert_equal('49/*{{{*/', getline('.'))
1440 norm! j
1441 call assert_equal('50/*{{{*/', getline('.'))
1442 norm! j
1443 call assert_equal('52', getline('.'))
1444 set nofoldenable
1445 " close fold and set foldenable
1446 norm! za
1447 call assert_equal(1, &foldenable)
1448
1449 50
1450 " have to use {count}za to open all folds and make the cursor visible
1451 norm! 2za
1452 norm! 2k
1453 call assert_equal('48', getline('.'))
1454 norm! j
1455 call assert_equal('49/*{{{*/', getline('.'))
1456 norm! j
1457 call assert_equal('50/*{{{*/', getline('.'))
1458 norm! j
1459 call assert_equal('51/*}}}*/', getline('.'))
1460 norm! j
1461 call assert_equal('52', getline('.'))
1462
1463 " Test for zA
1464 49
1465 set foldlevel=0
1466 50
1467 norm! zA
1468 norm! 2k
1469 call assert_equal('48', getline('.'))
1470 norm! j
1471 call assert_equal('49/*{{{*/', getline('.'))
1472 norm! j
1473 call assert_equal('50/*{{{*/', getline('.'))
1474 norm! j
1475 call assert_equal('51/*}}}*/', getline('.'))
1476 norm! j
1477 call assert_equal('52', getline('.'))
1478
Dominique Pelle923dce22021-11-21 11:36:04 +00001479 " zA on an opened fold when foldenable is not set
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001480 50
1481 set nofoldenable
1482 norm! zA
1483 call assert_equal(1, &foldenable)
1484 norm! k
1485 call assert_equal('48', getline('.'))
1486 norm! j
1487 call assert_equal('49/*{{{*/', getline('.'))
1488 norm! j
1489 call assert_equal('55', getline('.'))
1490
1491 " Test for zc
1492 norm! zE
1493 50
1494 norm! 2zF
1495 49
1496 norm! 5zF
1497 set nofoldenable
1498 50
1499 " There most likely is a bug somewhere:
1500 " https://groups.google.com/d/msg/vim_dev/v2EkfJ_KQjI/u-Cvv94uCAAJ
1501 " TODO: Should this only close the inner most fold or both folds?
1502 norm! zc
1503 call assert_equal(1, &foldenable)
1504 norm! k
1505 call assert_equal('48', getline('.'))
1506 norm! j
1507 call assert_equal('49/*{{{*/', getline('.'))
1508 norm! j
1509 call assert_equal('55', getline('.'))
1510 set nofoldenable
1511 50
1512 norm! Vjzc
1513 norm! k
1514 call assert_equal('48', getline('.'))
1515 norm! j
1516 call assert_equal('49/*{{{*/', getline('.'))
1517 norm! j
1518 call assert_equal('55', getline('.'))
1519
1520 " Test for zC
1521 set nofoldenable
1522 50
1523 norm! zCk
1524 call assert_equal('48', getline('.'))
1525 norm! j
1526 call assert_equal('49/*{{{*/', getline('.'))
1527 norm! j
1528 call assert_equal('55', getline('.'))
1529
1530 " Test for zx
1531 " 1) close folds at line 49-54
1532 set nofoldenable
1533 48
1534 norm! zx
1535 call assert_equal(1, &foldenable)
1536 norm! j
1537 call assert_equal('49/*{{{*/', getline('.'))
1538 norm! j
1539 call assert_equal('55', getline('.'))
1540
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02001541 " 2) do not close fold under cursor
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001542 51
1543 set nofoldenable
1544 norm! zx
1545 call assert_equal(1, &foldenable)
1546 norm! 3k
1547 call assert_equal('48', getline('.'))
1548 norm! j
1549 call assert_equal('49/*{{{*/', getline('.'))
1550 norm! j
1551 call assert_equal('50/*{{{*/', getline('.'))
1552 norm! j
1553 call assert_equal('51/*}}}*/', getline('.'))
1554 norm! j
1555 call assert_equal('52', getline('.'))
1556 norm! j
1557 call assert_equal('53', getline('.'))
1558 norm! j
1559 call assert_equal('54/*}}}*/', getline('.'))
1560 norm! j
1561 call assert_equal('55', getline('.'))
1562
1563 " 3) close one level of folds
1564 48
1565 set nofoldenable
1566 set foldlevel=1
1567 norm! zx
1568 call assert_equal(1, &foldenable)
1569 call assert_equal('48', getline('.'))
1570 norm! j
1571 call assert_equal('49/*{{{*/', getline('.'))
1572 norm! j
1573 call assert_equal('50/*{{{*/', getline('.'))
1574 norm! j
1575 call assert_equal('52', getline('.'))
1576 norm! j
1577 call assert_equal('53', getline('.'))
1578 norm! j
1579 call assert_equal('54/*}}}*/', getline('.'))
1580 norm! j
1581 call assert_equal('55', getline('.'))
1582
1583 " Test for zX
1584 " Close all folds
1585 set foldlevel=0 nofoldenable
1586 50
1587 norm! zX
1588 call assert_equal(1, &foldenable)
1589 norm! k
1590 call assert_equal('48', getline('.'))
1591 norm! j
1592 call assert_equal('49/*{{{*/', getline('.'))
1593 norm! j
1594 call assert_equal('55', getline('.'))
1595
1596 " Test for zm
1597 50
1598 set nofoldenable foldlevel=2
1599 norm! zm
1600 call assert_equal(1, &foldenable)
1601 call assert_equal(1, &foldlevel)
1602 norm! zm
1603 call assert_equal(0, &foldlevel)
1604 norm! zm
1605 call assert_equal(0, &foldlevel)
1606 norm! k
1607 call assert_equal('48', getline('.'))
1608 norm! j
1609 call assert_equal('49/*{{{*/', getline('.'))
1610 norm! j
1611 call assert_equal('55', getline('.'))
1612
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02001613 " Test for zm with a count
1614 50
1615 set foldlevel=2
1616 norm! 3zm
1617 call assert_equal(0, &foldlevel)
1618 call assert_equal(49, foldclosed(line('.')))
1619
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001620 " Test for zM
1621 48
1622 set nofoldenable foldlevel=99
1623 norm! zM
1624 call assert_equal(1, &foldenable)
1625 call assert_equal(0, &foldlevel)
1626 call assert_equal('48', getline('.'))
1627 norm! j
1628 call assert_equal('49/*{{{*/', getline('.'))
1629 norm! j
1630 call assert_equal('55', getline('.'))
1631
1632 " Test for zr
1633 48
1634 set nofoldenable foldlevel=0
1635 norm! zr
1636 call assert_equal(0, &foldenable)
1637 call assert_equal(1, &foldlevel)
1638 set foldlevel=0 foldenable
1639 norm! zr
1640 call assert_equal(1, &foldenable)
1641 call assert_equal(1, &foldlevel)
1642 norm! zr
1643 call assert_equal(2, &foldlevel)
1644 call assert_equal('48', getline('.'))
1645 norm! j
1646 call assert_equal('49/*{{{*/', getline('.'))
1647 norm! j
1648 call assert_equal('50/*{{{*/', getline('.'))
1649 norm! j
1650 call assert_equal('51/*}}}*/', getline('.'))
1651 norm! j
1652 call assert_equal('52', getline('.'))
1653
1654 " Test for zR
1655 48
1656 set nofoldenable foldlevel=0
1657 norm! zR
1658 call assert_equal(0, &foldenable)
1659 call assert_equal(2, &foldlevel)
1660 set foldenable foldlevel=0
1661 norm! zR
1662 call assert_equal(1, &foldenable)
1663 call assert_equal(2, &foldlevel)
1664 call assert_equal('48', getline('.'))
1665 norm! j
1666 call assert_equal('49/*{{{*/', getline('.'))
1667 norm! j
1668 call assert_equal('50/*{{{*/', getline('.'))
1669 norm! j
1670 call assert_equal('51/*}}}*/', getline('.'))
1671 norm! j
1672 call assert_equal('52', getline('.'))
1673 call append(50, ['a /*{{{*/', 'b /*}}}*/'])
1674 48
1675 call assert_equal('48', getline('.'))
1676 norm! j
1677 call assert_equal('49/*{{{*/', getline('.'))
1678 norm! j
1679 call assert_equal('50/*{{{*/', getline('.'))
1680 norm! j
1681 call assert_equal('a /*{{{*/', getline('.'))
1682 norm! j
1683 call assert_equal('51/*}}}*/', getline('.'))
1684 norm! j
1685 call assert_equal('52', getline('.'))
1686 48
1687 norm! zR
1688 call assert_equal(1, &foldenable)
1689 call assert_equal(3, &foldlevel)
1690 call assert_equal('48', getline('.'))
1691 norm! j
1692 call assert_equal('49/*{{{*/', getline('.'))
1693 norm! j
1694 call assert_equal('50/*{{{*/', getline('.'))
1695 norm! j
1696 call assert_equal('a /*{{{*/', getline('.'))
1697 norm! j
1698 call assert_equal('b /*}}}*/', getline('.'))
1699 norm! j
1700 call assert_equal('51/*}}}*/', getline('.'))
1701 norm! j
1702 call assert_equal('52', getline('.'))
1703
1704 " clean up
1705 setl nofoldenable fdm=marker foldlevel=0
1706 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001707endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001708
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001709func Test_normal20_exmode()
Bram Moolenaar004a6782020-04-11 17:09:31 +02001710 " Reading from redirected file doesn't work on MS-Windows
1711 CheckNotMSWindows
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001712 call writefile(['1a', 'foo', 'bar', '.', 'w! Xfile2', 'q!'], 'Xscript')
1713 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001714 call system(GetVimCommand() .. ' -e -s < Xscript Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001715 let a=readfile('Xfile2')
1716 call assert_equal(['1', 'foo', 'bar', '2'], a)
1717
1718 " clean up
1719 for file in ['Xfile', 'Xfile2', 'Xscript']
1720 call delete(file)
1721 endfor
1722 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001723endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001724
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001725func Test_normal21_nv_hat()
1726
1727 " Edit a fresh file and wipe the buffer list so that there is no alternate
1728 " file present. Next, check for the expected command failures.
1729 edit Xfoo | %bw
Bram Moolenaare2e40752020-09-04 21:18:46 +02001730 call assert_fails(':buffer #', 'E86:')
1731 call assert_fails(':execute "normal! \<C-^>"', 'E23:')
Bram Moolenaarb7e24832020-06-24 13:37:35 +02001732 call assert_fails("normal i\<C-R>#", 'E23:')
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001733
1734 " Test for the expected behavior when switching between two named buffers.
1735 edit Xfoo | edit Xbar
1736 call feedkeys("\<C-^>", 'tx')
1737 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1738 call feedkeys("\<C-^>", 'tx')
1739 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1740
1741 " Test for the expected behavior when only one buffer is named.
1742 enew | let l:nr = bufnr('%')
1743 call feedkeys("\<C-^>", 'tx')
1744 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
1745 call feedkeys("\<C-^>", 'tx')
1746 call assert_equal('', bufname('%'))
1747 call assert_equal(l:nr, bufnr('%'))
1748
1749 " Test that no action is taken by "<C-^>" when an operator is pending.
1750 edit Xfoo
1751 call feedkeys("ci\<C-^>", 'tx')
1752 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
1753
1754 %bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001755endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001756
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001757func Test_normal22_zet()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001758 " Test for ZZ
Bram Moolenaar0913a102016-09-03 19:11:59 +02001759 " let shell = &shell
1760 " let &shell = 'sh'
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001761 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001762 let args = ' -N -i NONE --noplugins -X --not-a-term'
1763 call system(GetVimCommand() .. args .. ' -c "%d" -c ":norm! ZZ" Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001764 let a = readfile('Xfile')
1765 call assert_equal([], a)
1766 " Test for ZQ
1767 call writefile(['1', '2'], 'Xfile')
Bram Moolenaar93344c22019-08-14 21:12:05 +02001768 call system(GetVimCommand() . args . ' -c "%d" -c ":norm! ZQ" Xfile')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001769 let a = readfile('Xfile')
1770 call assert_equal(['1', '2'], a)
1771
Bram Moolenaar1671f442020-03-10 07:48:13 +01001772 " Unsupported Z command
1773 call assert_beeps('normal! ZW')
1774
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001775 " clean up
1776 for file in ['Xfile']
1777 call delete(file)
1778 endfor
Bram Moolenaar0913a102016-09-03 19:11:59 +02001779 " let &shell = shell
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001780endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001781
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001782func Test_normal23_K()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001783 " Test for K command
1784 new
Bram Moolenaar426f3752016-11-04 21:22:37 +01001785 call append(0, ['version8.txt', 'man', 'aa%bb', 'cc|dd'])
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001786 let k = &keywordprg
1787 set keywordprg=:help
1788 1
1789 norm! VK
1790 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1791 call assert_equal('help', &ft)
1792 call assert_match('\*version8.txt\*', getline('.'))
1793 helpclose
1794 norm! 0K
1795 call assert_equal('version8.txt', fnamemodify(bufname('%'), ':t'))
1796 call assert_equal('help', &ft)
Bram Moolenaarb1c91982018-05-17 17:04:55 +02001797 call assert_match('\*version8\.\d\*', getline('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001798 helpclose
1799
Bram Moolenaar426f3752016-11-04 21:22:37 +01001800 set keywordprg=:new
1801 set iskeyword+=%
1802 set iskeyword+=\|
1803 2
1804 norm! K
1805 call assert_equal('man', fnamemodify(bufname('%'), ':t'))
1806 bwipe!
1807 3
1808 norm! K
1809 call assert_equal('aa%bb', fnamemodify(bufname('%'), ':t'))
1810 bwipe!
Bram Moolenaareb828d02016-11-05 19:54:01 +01001811 if !has('win32')
1812 4
1813 norm! K
1814 call assert_equal('cc|dd', fnamemodify(bufname('%'), ':t'))
1815 bwipe!
1816 endif
Bram Moolenaar426f3752016-11-04 21:22:37 +01001817 set iskeyword-=%
1818 set iskeyword-=\|
1819
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02001820 " Test for specifying a count to K
1821 1
1822 com! -nargs=* Kprog let g:Kprog_Args = <q-args>
1823 set keywordprg=:Kprog
1824 norm! 3K
1825 call assert_equal('3 version8', g:Kprog_Args)
1826 delcom Kprog
1827
Bram Moolenaar0913a102016-09-03 19:11:59 +02001828 " Only expect "man" to work on Unix
1829 if !has("unix")
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001830 let &keywordprg = k
1831 bw!
1832 return
1833 endif
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001834
Bram Moolenaar9134f1e2019-11-29 20:26:13 +01001835 let not_gnu_man = has('mac') || has('bsd')
1836 if not_gnu_man
Dominique Pelle923dce22021-11-21 11:36:04 +00001837 " In macOS and BSD, the option for specifying a pager is different
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001838 set keywordprg=man\ -P\ cat
1839 else
1840 set keywordprg=man\ --pager=cat
1841 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001842 " Test for using man
1843 2
1844 let a = execute('unsilent norm! K')
Bram Moolenaar9134f1e2019-11-29 20:26:13 +01001845 if not_gnu_man
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001846 call assert_match("man -P cat 'man'", a)
1847 else
1848 call assert_match("man --pager=cat 'man'", a)
1849 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001850
Bram Moolenaar1671f442020-03-10 07:48:13 +01001851 " Error cases
1852 call setline(1, '#$#')
1853 call assert_fails('normal! ggK', 'E349:')
1854 call setline(1, '---')
1855 call assert_fails('normal! ggv2lK', 'E349:')
1856 call setline(1, ['abc', 'xyz'])
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +02001857 call assert_fails("normal! gg2lv2h\<C-]>", 'E433:')
Bram Moolenaar1671f442020-03-10 07:48:13 +01001858 call assert_beeps("normal! ggVjK")
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02001859 norm! V
1860 call assert_beeps("norm! cK")
Bram Moolenaar1671f442020-03-10 07:48:13 +01001861
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001862 " clean up
1863 let &keywordprg = k
1864 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001865endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001866
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001867func Test_normal24_rot13()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001868 " Testing for g?? g?g?
1869 new
1870 call append(0, 'abcdefghijklmnopqrstuvwxyzäüö')
1871 1
1872 norm! g??
1873 call assert_equal('nopqrstuvwxyzabcdefghijklmäüö', getline('.'))
1874 norm! g?g?
1875 call assert_equal('abcdefghijklmnopqrstuvwxyzäüö', getline('.'))
1876
1877 " clean up
1878 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001879endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001880
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001881func Test_normal25_tag()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01001882 CheckFeature quickfix
1883
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001884 " Testing for CTRL-] g CTRL-] g]
1885 " CTRL-W g] CTRL-W CTRL-] CTRL-W g CTRL-]
1886 h
1887 " Test for CTRL-]
1888 call search('\<x\>$')
1889 exe "norm! \<c-]>"
1890 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1891 norm! yiW
1892 call assert_equal("*x*", @0)
1893 exe ":norm \<c-o>"
1894
1895 " Test for g_CTRL-]
1896 call search('\<v_u\>$')
1897 exe "norm! g\<c-]>"
1898 call assert_equal("change.txt", fnamemodify(bufname('%'), ':t'))
1899 norm! yiW
1900 call assert_equal("*v_u*", @0)
1901 exe ":norm \<c-o>"
1902
1903 " Test for g]
1904 call search('\<i_<Esc>$')
1905 let a = execute(":norm! g]")
1906 call assert_match('i_<Esc>.*insert.txt', a)
1907
1908 if !empty(exepath('cscope')) && has('cscope')
1909 " setting cscopetag changes how g] works
1910 set cst
1911 exe "norm! g]"
1912 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1913 norm! yiW
1914 call assert_equal("*i_<Esc>*", @0)
1915 exe ":norm \<c-o>"
1916 " Test for CTRL-W g]
1917 exe "norm! \<C-W>g]"
1918 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1919 norm! yiW
1920 call assert_equal("*i_<Esc>*", @0)
1921 call assert_equal(3, winnr('$'))
1922 helpclose
1923 set nocst
1924 endif
1925
1926 " Test for CTRL-W g]
1927 let a = execute("norm! \<C-W>g]")
1928 call assert_match('i_<Esc>.*insert.txt', a)
1929
1930 " Test for CTRL-W CTRL-]
1931 exe "norm! \<C-W>\<C-]>"
1932 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1933 norm! yiW
1934 call assert_equal("*i_<Esc>*", @0)
1935 call assert_equal(3, winnr('$'))
1936 helpclose
1937
1938 " Test for CTRL-W g CTRL-]
1939 exe "norm! \<C-W>g\<C-]>"
1940 call assert_equal("insert.txt", fnamemodify(bufname('%'), ':t'))
1941 norm! yiW
1942 call assert_equal("*i_<Esc>*", @0)
1943 call assert_equal(3, winnr('$'))
1944 helpclose
1945
1946 " clean up
1947 helpclose
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001948endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001949
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001950func Test_normal26_put()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001951 " Test for ]p ]P [p and [P
1952 new
1953 call append(0, ['while read LINE', 'do', ' ((count++))', ' if [ $? -ne 0 ]; then', " echo 'Error writing file'", ' fi', 'done'])
1954 1
1955 /Error/y a
1956 2
1957 norm! "a]pj"a[p
1958 call assert_equal(['do', "echo 'Error writing file'", " echo 'Error writing file'", ' ((count++))'], getline(2,5))
1959 1
1960 /^\s\{4}/
1961 exe "norm! \"a]P3Eldt'"
1962 exe "norm! j\"a[P2Eldt'"
1963 call assert_equal([' if [ $? -ne 0 ]; then', " echo 'Error writing'", " echo 'Error'", " echo 'Error writing file'", ' fi'], getline(6,10))
1964
1965 " clean up
1966 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02001967endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001968
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01001969func Test_normal27_bracket()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02001970 " Test for [' [` ]' ]`
1971 call Setup_NewWindow()
1972 1,21s/.\+/ & b/
1973 1
1974 norm! $ma
1975 5
1976 norm! $mb
1977 10
1978 norm! $mc
1979 15
1980 norm! $md
1981 20
1982 norm! $me
1983
1984 " Test for ['
1985 9
1986 norm! 2['
1987 call assert_equal(' 1 b', getline('.'))
1988 call assert_equal(1, line('.'))
1989 call assert_equal(3, col('.'))
1990
1991 " Test for ]'
1992 norm! ]'
1993 call assert_equal(' 5 b', getline('.'))
1994 call assert_equal(5, line('.'))
1995 call assert_equal(3, col('.'))
1996
1997 " No mark after line 21, cursor moves to first non blank on current line
1998 21
1999 norm! $]'
2000 call assert_equal(' 21 b', getline('.'))
2001 call assert_equal(21, line('.'))
2002 call assert_equal(3, col('.'))
2003
2004 " Test for [`
2005 norm! 2[`
2006 call assert_equal(' 15 b', getline('.'))
2007 call assert_equal(15, line('.'))
2008 call assert_equal(8, col('.'))
2009
2010 " Test for ]`
2011 norm! ]`
2012 call assert_equal(' 20 b', getline('.'))
2013 call assert_equal(20, line('.'))
2014 call assert_equal(8, col('.'))
2015
2016 " clean up
2017 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002018endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002019
Bram Moolenaar1671f442020-03-10 07:48:13 +01002020" Test for ( and ) sentence movements
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002021func Test_normal28_parenthesis()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002022 new
2023 call append(0, ['This is a test. With some sentences!', '', 'Even with a question? And one more. And no sentence here'])
2024
2025 $
2026 norm! d(
2027 call assert_equal(['This is a test. With some sentences!', '', 'Even with a question? And one more. ', ''], getline(1, '$'))
2028 norm! 2d(
2029 call assert_equal(['This is a test. With some sentences!', '', ' ', ''], getline(1, '$'))
2030 1
2031 norm! 0d)
2032 call assert_equal(['With some sentences!', '', ' ', ''], getline(1, '$'))
2033
2034 call append('$', ['This is a long sentence', '', 'spanning', 'over several lines. '])
2035 $
2036 norm! $d(
2037 call assert_equal(['With some sentences!', '', ' ', '', 'This is a long sentence', ''], getline(1, '$'))
2038
Bram Moolenaar224a5f12020-04-28 20:29:07 +02002039 " Move to the next sentence from a paragraph macro
2040 %d
2041 call setline(1, ['.LP', 'blue sky!. blue sky.', 'blue sky. blue sky.'])
2042 call cursor(1, 1)
2043 normal )
2044 call assert_equal([2, 1], [line('.'), col('.')])
2045 normal )
2046 call assert_equal([2, 12], [line('.'), col('.')])
2047 normal ((
2048 call assert_equal([1, 1], [line('.'), col('.')])
2049
Bram Moolenaar1671f442020-03-10 07:48:13 +01002050 " It is an error if a next sentence is not found
2051 %d
2052 call setline(1, '.SH')
2053 call assert_beeps('normal )')
2054
Bram Moolenaar224a5f12020-04-28 20:29:07 +02002055 " If only dot is present, don't treat that as a sentence
2056 call setline(1, '. This is a sentence.')
2057 normal $((
2058 call assert_equal(3, col('.'))
2059
Bram Moolenaar1671f442020-03-10 07:48:13 +01002060 " Jumping to a fold should open the fold
2061 call setline(1, ['', '', 'one', 'two', 'three'])
2062 set foldenable
2063 2,$fold
2064 call feedkeys(')', 'xt')
2065 call assert_equal(3, line('.'))
2066 call assert_equal(1, foldlevel('.'))
2067 call assert_equal(-1, foldclosed('.'))
2068 set foldenable&
2069
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002070 " clean up
2071 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002072endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002073
Bram Moolenaar1671f442020-03-10 07:48:13 +01002074" Test for { and } paragraph movements
2075func Test_normal29_brace()
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002076 let text =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002077 A paragraph begins after each empty line, and also at each of a set of
2078 paragraph macros, specified by the pairs of characters in the 'paragraphs'
2079 option. The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to
2080 the macros ".IP", ".LP", etc. (These are nroff macros, so the dot must be in
2081 the first column). A section boundary is also a paragraph boundary.
2082 Note that a blank line (only containing white space) is NOT a paragraph
2083 boundary.
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002084
2085
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002086 Also note that this does not include a '{' or '}' in the first column. When
2087 the '{' flag is in 'cpoptions' then '{' in the first column is used as a
2088 paragraph boundary |posix|.
2089 {
2090 This is no paragraph
2091 unless the '{' is set
2092 in 'cpoptions'
2093 }
2094 .IP
2095 The nroff macros IP separates a paragraph
2096 That means, it must be a '.'
2097 followed by IP
2098 .LPIt does not matter, if afterwards some
2099 more characters follow.
2100 .SHAlso section boundaries from the nroff
2101 macros terminate a paragraph. That means
2102 a character like this:
2103 .NH
2104 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002105 [DATA]
2106
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002107 new
2108 call append(0, text)
2109 1
2110 norm! 0d2}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002111
2112 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002113 .IP
2114 The nroff macros IP separates a paragraph
2115 That means, it must be a '.'
2116 followed by IP
2117 .LPIt does not matter, if afterwards some
2118 more characters follow.
2119 .SHAlso section boundaries from the nroff
2120 macros terminate a paragraph. That means
2121 a character like this:
2122 .NH
2123 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002124
2125 [DATA]
2126 call assert_equal(expected, getline(1, '$'))
2127
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002128 norm! 0d}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002129
2130 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002131 .LPIt does not matter, if afterwards some
2132 more characters follow.
2133 .SHAlso section boundaries from the nroff
2134 macros terminate a paragraph. That means
2135 a character like this:
2136 .NH
2137 End of text here
2138
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002139 [DATA]
2140 call assert_equal(expected, getline(1, '$'))
2141
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002142 $
2143 norm! d{
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002144
2145 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002146 .LPIt does not matter, if afterwards some
2147 more characters follow.
2148 .SHAlso section boundaries from the nroff
2149 macros terminate a paragraph. That means
2150 a character like this:
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002151
2152 [DATA]
2153 call assert_equal(expected, getline(1, '$'))
2154
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002155 norm! d{
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002156
2157 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002158 .LPIt does not matter, if afterwards some
2159 more characters follow.
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002160
2161 [DATA]
2162 call assert_equal(expected, getline(1, '$'))
2163
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002164 " Test with { in cpooptions
2165 %d
2166 call append(0, text)
2167 set cpo+={
2168 1
2169 norm! 0d2}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002170
2171 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002172 {
2173 This is no paragraph
2174 unless the '{' is set
2175 in 'cpoptions'
2176 }
2177 .IP
2178 The nroff macros IP separates a paragraph
2179 That means, it must be a '.'
2180 followed by IP
2181 .LPIt does not matter, if afterwards some
2182 more characters follow.
2183 .SHAlso section boundaries from the nroff
2184 macros terminate a paragraph. That means
2185 a character like this:
2186 .NH
2187 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002188
2189 [DATA]
2190 call assert_equal(expected, getline(1, '$'))
2191
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002192 $
2193 norm! d}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002194
2195 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002196 {
2197 This is no paragraph
2198 unless the '{' is set
2199 in 'cpoptions'
2200 }
2201 .IP
2202 The nroff macros IP separates a paragraph
2203 That means, it must be a '.'
2204 followed by IP
2205 .LPIt does not matter, if afterwards some
2206 more characters follow.
2207 .SHAlso section boundaries from the nroff
2208 macros terminate a paragraph. That means
2209 a character like this:
2210 .NH
2211 End of text here
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002212
2213 [DATA]
2214 call assert_equal(expected, getline(1, '$'))
2215
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002216 norm! gg}
2217 norm! d5}
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002218
2219 let expected =<< trim [DATA]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002220 {
2221 This is no paragraph
2222 unless the '{' is set
2223 in 'cpoptions'
2224 }
Bram Moolenaarc79745a2019-05-20 22:12:34 +02002225
2226 [DATA]
2227 call assert_equal(expected, getline(1, '$'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002228
Bram Moolenaar1671f442020-03-10 07:48:13 +01002229 " Jumping to a fold should open the fold
2230 %d
2231 call setline(1, ['', 'one', 'two', ''])
2232 set foldenable
2233 2,$fold
2234 call feedkeys('}', 'xt')
2235 call assert_equal(4, line('.'))
2236 call assert_equal(1, foldlevel('.'))
2237 call assert_equal(-1, foldclosed('.'))
2238 set foldenable&
2239
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002240 " clean up
2241 set cpo-={
2242 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002243endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002244
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02002245" Test for section movements
2246func Test_normal_section()
2247 new
2248 let lines =<< trim [END]
2249 int foo()
2250 {
2251 if (1)
2252 {
2253 a = 1;
2254 }
2255 }
2256 [END]
2257 call setline(1, lines)
2258
2259 " jumping to a folded line using [[ should open the fold
2260 2,3fold
2261 call cursor(5, 1)
2262 call feedkeys("[[", 'xt')
2263 call assert_equal(2, line('.'))
2264 call assert_equal(-1, foldclosedend(line('.')))
2265
2266 close!
2267endfunc
2268
Bram Moolenaard1ad99b2020-10-04 16:16:54 +02002269" Test for changing case using u, U, gu, gU and ~ (tilde) commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01002270func Test_normal30_changecase()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002271 new
2272 call append(0, 'This is a simple test: äüöß')
2273 norm! 1ggVu
2274 call assert_equal('this is a simple test: äüöß', getline('.'))
2275 norm! VU
2276 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
2277 norm! guu
2278 call assert_equal('this is a simple test: äüöss', getline('.'))
2279 norm! gUgU
2280 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
2281 norm! gugu
2282 call assert_equal('this is a simple test: äüöss', getline('.'))
2283 norm! gUU
2284 call assert_equal('THIS IS A SIMPLE TEST: ÄÜÖSS', getline('.'))
2285 norm! 010~
2286 call assert_equal('this is a SIMPLE TEST: ÄÜÖSS', getline('.'))
2287 norm! V~
2288 call assert_equal('THIS IS A simple test: äüöss', getline('.'))
Bram Moolenaard1ad99b2020-10-04 16:16:54 +02002289 call assert_beeps('norm! c~')
2290 %d
2291 call assert_beeps('norm! ~')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002292
Bram Moolenaar1671f442020-03-10 07:48:13 +01002293 " Test for changing case across lines using 'whichwrap'
2294 call setline(1, ['aaaaaa', 'aaaaaa'])
2295 normal! gg10~
2296 call assert_equal(['AAAAAA', 'aaaaaa'], getline(1, 2))
2297 set whichwrap+=~
2298 normal! gg10~
2299 call assert_equal(['aaaaaa', 'AAAAaa'], getline(1, 2))
2300 set whichwrap&
2301
Bram Moolenaar3e72dca2021-05-29 16:30:12 +02002302 " try changing the case with a double byte encoding (DBCS)
2303 %bw!
2304 let enc = &enc
2305 set encoding=cp932
2306 call setline(1, "\u8470")
2307 normal ~
2308 normal gU$gu$gUgUg~g~gugu
2309 call assert_equal("\u8470", getline(1))
2310 let &encoding = enc
2311
Bram Moolenaar1671f442020-03-10 07:48:13 +01002312 " clean up
2313 bw!
2314endfunc
2315
2316" Turkish ASCII turns to multi-byte. On some systems Turkish locale
2317" is available but toupper()/tolower() don't do the right thing.
2318func Test_normal_changecase_turkish()
2319 new
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02002320 try
2321 lang tr_TR.UTF-8
2322 set casemap=
2323 let iupper = toupper('i')
2324 if iupper == "\u0130"
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02002325 call setline(1, 'iI')
2326 1normal gUU
2327 call assert_equal("\u0130I", getline(1))
2328 call assert_equal("\u0130I", toupper("iI"))
Bram Moolenaar3317d5e2017-04-08 19:12:06 +02002329
Bram Moolenaar9f4de1f2017-04-08 19:39:43 +02002330 call setline(1, 'iI')
2331 1normal guu
2332 call assert_equal("i\u0131", getline(1))
2333 call assert_equal("i\u0131", tolower("iI"))
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02002334 elseif iupper == "I"
Bram Moolenaar1cc48202017-04-09 13:41:59 +02002335 call setline(1, 'iI')
2336 1normal gUU
2337 call assert_equal("II", getline(1))
2338 call assert_equal("II", toupper("iI"))
2339
2340 call setline(1, 'iI')
2341 1normal guu
2342 call assert_equal("ii", getline(1))
2343 call assert_equal("ii", tolower("iI"))
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02002344 else
2345 call assert_true(false, "expected toupper('i') to be either 'I' or '\u0130'")
2346 endif
2347 set casemap&
2348 call setline(1, 'iI')
2349 1normal gUU
2350 call assert_equal("II", getline(1))
2351 call assert_equal("II", toupper("iI"))
Bram Moolenaar1cc48202017-04-09 13:41:59 +02002352
Bram Moolenaarf1c118b2018-09-03 22:08:10 +02002353 call setline(1, 'iI')
2354 1normal guu
2355 call assert_equal("ii", getline(1))
2356 call assert_equal("ii", tolower("iI"))
2357
2358 lang en_US.UTF-8
2359 catch /E197:/
2360 " can't use Turkish locale
2361 throw 'Skipped: Turkish locale not available'
2362 endtry
Bram Moolenaar1671f442020-03-10 07:48:13 +01002363 close!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002364endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002365
Bram Moolenaar1671f442020-03-10 07:48:13 +01002366" Test for r (replace) command
2367func Test_normal31_r_cmd()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002368 new
2369 call append(0, 'This is a simple test: abcd')
2370 exe "norm! 1gg$r\<cr>"
2371 call assert_equal(['This is a simple test: abc', '', ''], getline(1,'$'))
2372 exe "norm! 1gg2wlr\<cr>"
2373 call assert_equal(['This is a', 'simple test: abc', '', ''], getline(1,'$'))
2374 exe "norm! 2gg0W5r\<cr>"
2375 call assert_equal(['This is a', 'simple ', ' abc', '', ''], getline('1', '$'))
2376 set autoindent
2377 call setline(2, ['simple test: abc', ''])
2378 exe "norm! 2gg0W5r\<cr>"
2379 call assert_equal(['This is a', 'simple ', 'abc', '', '', ''], getline('1', '$'))
2380 exe "norm! 1ggVr\<cr>"
2381 call assert_equal('^M^M^M^M^M^M^M^M^M', strtrans(getline(1)))
2382 call setline(1, 'This is a')
2383 exe "norm! 1gg05rf"
2384 call assert_equal('fffffis a', getline(1))
2385
Bram Moolenaar1671f442020-03-10 07:48:13 +01002386 " When replacing characters, copy characters from above and below lines
2387 " using CTRL-Y and CTRL-E.
2388 " Different code paths are used for utf-8 and latin1 encodings
2389 set showmatch
2390 for enc in ['latin1', 'utf-8']
2391 enew!
2392 let &encoding = enc
2393 call setline(1, [' {a}', 'xxxxxxxxxx', ' [b]'])
2394 exe "norm! 2gg5r\<C-Y>l5r\<C-E>"
2395 call assert_equal(' {a}x [b]x', getline(2))
2396 endfor
2397 set showmatch&
2398
2399 " r command should fail in operator pending mode
2400 call assert_beeps('normal! cr')
2401
Bram Moolenaar004a6782020-04-11 17:09:31 +02002402 " replace a tab character in visual mode
2403 %d
2404 call setline(1, ["a\tb", "c\td", "e\tf"])
2405 normal gglvjjrx
2406 call assert_equal(['axx', 'xxx', 'xxf'], getline(1, '$'))
2407
Bram Moolenaard7e5e942020-10-07 16:54:52 +02002408 " replace with a multibyte character (with multiple composing characters)
2409 %d
2410 new
2411 call setline(1, 'aaa')
2412 exe "normal $ra\u0328\u0301"
2413 call assert_equal("aaa\u0328\u0301", getline(1))
2414
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002415 " clean up
2416 set noautoindent
2417 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002418endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002419
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002420" Test for g*, g#
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002421func Test_normal32_g_cmd1()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002422 new
2423 call append(0, ['abc.x_foo', 'x_foobar.abc'])
2424 1
2425 norm! $g*
2426 call assert_equal('x_foo', @/)
2427 call assert_equal('x_foobar.abc', getline('.'))
2428 norm! $g#
2429 call assert_equal('abc', @/)
2430 call assert_equal('abc.x_foo', getline('.'))
2431
2432 " clean up
2433 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002434endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002435
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002436" Test for g`, g;, g,, g&, gv, gk, gj, gJ, g0, g^, g_, gm, g$, gM, g CTRL-G,
2437" gi and gI commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01002438func Test_normal33_g_cmd2()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002439 call Setup_NewWindow()
2440 " Test for g`
2441 clearjumps
2442 norm! ma10j
2443 let a=execute(':jumps')
2444 " empty jumplist
2445 call assert_equal('>', a[-1:])
2446 norm! g`a
2447 call assert_equal('>', a[-1:])
2448 call assert_equal(1, line('.'))
2449 call assert_equal('1', getline('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002450 call cursor(10, 1)
2451 norm! g'a
2452 call assert_equal('>', a[-1:])
2453 call assert_equal(1, line('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002454
2455 " Test for g; and g,
2456 norm! g;
2457 " there is only one change in the changelist
2458 " currently, when we setup the window
2459 call assert_equal(2, line('.'))
Bram Moolenaare2e40752020-09-04 21:18:46 +02002460 call assert_fails(':norm! g;', 'E662:')
2461 call assert_fails(':norm! g,', 'E663:')
Bram Moolenaar7a1d3282022-06-16 13:04:45 +01002462 let &ul = &ul
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002463 call append('$', ['a', 'b', 'c', 'd'])
Bram Moolenaar7a1d3282022-06-16 13:04:45 +01002464 let &ul = &ul
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002465 call append('$', ['Z', 'Y', 'X', 'W'])
2466 let a = execute(':changes')
2467 call assert_match('2\s\+0\s\+2', a)
2468 call assert_match('101\s\+0\s\+a', a)
2469 call assert_match('105\s\+0\s\+Z', a)
2470 norm! 3g;
2471 call assert_equal(2, line('.'))
2472 norm! 2g,
2473 call assert_equal(105, line('.'))
2474
2475 " Test for g& - global substitute
2476 %d
2477 call setline(1, range(1,10))
2478 call append('$', ['a', 'b', 'c', 'd'])
2479 $s/\w/&&/g
2480 exe "norm! /[1-8]\<cr>"
2481 norm! g&
2482 call assert_equal(['11', '22', '33', '44', '55', '66', '77', '88', '9', '110', 'a', 'b', 'c', 'dd'], getline(1, '$'))
2483
Bram Moolenaar1671f442020-03-10 07:48:13 +01002484 " Jumping to a fold using gg should open the fold
2485 set foldenable
2486 set foldopen+=jump
2487 5,8fold
2488 call feedkeys('6gg', 'xt')
2489 call assert_equal(1, foldlevel('.'))
2490 call assert_equal(-1, foldclosed('.'))
2491 set foldopen-=jump
2492 set foldenable&
2493
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002494 " Test for gv
2495 %d
2496 call append('$', repeat(['abcdefgh'], 8))
2497 exe "norm! 2gg02l\<c-v>2j2ly"
2498 call assert_equal(['cde', 'cde', 'cde'], getreg(0, 1, 1))
2499 " in visual mode, gv swaps current and last selected region
2500 exe "norm! G0\<c-v>4k4lgvd"
2501 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh', 'abcdefgh'], getline(1,'$'))
2502 exe "norm! G0\<c-v>4k4ly"
2503 exe "norm! gvood"
2504 call assert_equal(['', 'abfgh', 'abfgh', 'abfgh', 'fgh', 'fgh', 'fgh', 'fgh', 'fgh'], getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002505 " gv cannot be used in operator pending mode
2506 call assert_beeps('normal! cgv')
2507 " gv should beep without a previously selected visual area
2508 new
2509 call assert_beeps('normal! gv')
2510 close
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002511
2512 " Test for gk/gj
2513 %d
2514 15vsp
2515 set wrap listchars= sbr=
Bram Moolenaar74ede802021-05-29 19:18:01 +02002516 let lineA = 'abcdefghijklmnopqrstuvwxyz'
2517 let lineB = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
2518 let lineC = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002519 $put =lineA
2520 $put =lineB
2521
2522 norm! 3gg0dgk
2523 call assert_equal(['', 'abcdefghijklmno', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'], getline(1, '$'))
2524 set nu
2525 norm! 3gg0gjdgj
2526 call assert_equal(['', 'abcdefghijklmno', '0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
2527
2528 " Test for gJ
2529 norm! 2gggJ
2530 call assert_equal(['', 'abcdefghijklmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
2531 call assert_equal(16, col('.'))
2532 " shouldn't do anything
2533 norm! 10gJ
2534 call assert_equal(1, col('.'))
2535
2536 " Test for g0 g^ gm g$
2537 exe "norm! 2gg0gji "
2538 call assert_equal(['', 'abcdefghijk lmno0123456789AMNOPQRSTUVWXYZ'], getline(1,'$'))
2539 norm! g0yl
2540 call assert_equal(12, col('.'))
2541 call assert_equal(' ', getreg(0))
2542 norm! g$yl
2543 call assert_equal(22, col('.'))
2544 call assert_equal('3', getreg(0))
2545 norm! gmyl
2546 call assert_equal(17, col('.'))
2547 call assert_equal('n', getreg(0))
2548 norm! g^yl
2549 call assert_equal(15, col('.'))
2550 call assert_equal('l', getreg(0))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002551 call assert_beeps('normal 5g$')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002552
Bram Moolenaar74ede802021-05-29 19:18:01 +02002553 " Test for g$ with double-width character half displayed
2554 vsplit
2555 9wincmd |
2556 setlocal nowrap nonumber
2557 call setline(2, 'asdfasdfヨ')
2558 2
2559 normal 0g$
2560 call assert_equal(8, col('.'))
2561 10wincmd |
2562 normal 0g$
2563 call assert_equal(9, col('.'))
2564
2565 setlocal signcolumn=yes
2566 11wincmd |
2567 normal 0g$
2568 call assert_equal(8, col('.'))
2569 12wincmd |
2570 normal 0g$
2571 call assert_equal(9, col('.'))
2572
2573 close
2574
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002575 " Test for g_
2576 call assert_beeps('normal! 100g_')
2577 call setline(2, [' foo ', ' foobar '])
2578 normal! 2ggg_
2579 call assert_equal(5, col('.'))
2580 normal! 2g_
2581 call assert_equal(8, col('.'))
2582
2583 norm! 2ggdG
Bram Moolenaar8b530c12019-10-28 02:13:05 +01002584 $put =lineC
2585
2586 " Test for gM
2587 norm! gMyl
2588 call assert_equal(73, col('.'))
2589 call assert_equal('0', getreg(0))
2590 " Test for 20gM
2591 norm! 20gMyl
2592 call assert_equal(29, col('.'))
2593 call assert_equal('S', getreg(0))
2594 " Test for 60gM
2595 norm! 60gMyl
2596 call assert_equal(87, col('.'))
2597 call assert_equal('E', getreg(0))
2598
Bram Moolenaar71c41252021-12-26 15:00:07 +00002599 " Test for gM with Tab characters
2600 call setline('.', "\ta\tb\tc\td\te\tf")
2601 norm! gMyl
2602 call assert_equal(6, col('.'))
2603 call assert_equal("c", getreg(0))
2604
Bram Moolenaar8b530c12019-10-28 02:13:05 +01002605 " Test for g Ctrl-G
Bram Moolenaar71c41252021-12-26 15:00:07 +00002606 call setline('.', lineC)
2607 norm! 60gMyl
Bram Moolenaar8b530c12019-10-28 02:13:05 +01002608 set ff=unix
2609 let a=execute(":norm! g\<c-g>")
2610 call assert_match('Col 87 of 144; Line 2 of 2; Word 1 of 1; Byte 88 of 146', a)
2611
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002612 " Test for gI
2613 norm! gIfoo
Bram Moolenaar8b530c12019-10-28 02:13:05 +01002614 call assert_equal(['', 'foo0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'], getline(1,'$'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002615
2616 " Test for gi
2617 wincmd c
2618 %d
2619 set tw=0
2620 call setline(1, ['foobar', 'new line'])
2621 norm! A next word
2622 $put ='third line'
2623 norm! gi another word
2624 call assert_equal(['foobar next word another word', 'new line', 'third line'], getline(1,'$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002625 call setline(1, 'foobar')
2626 normal! Ggifirst line
2627 call assert_equal('foobarfirst line', getline(1))
2628 " Test gi in 'virtualedit' mode with cursor after the end of the line
2629 set virtualedit=all
2630 call setline(1, 'foo')
2631 exe "normal! Abar\<Right>\<Right>\<Right>\<Right>"
2632 call setline(1, 'foo')
2633 normal! Ggifirst line
2634 call assert_equal('foo first line', getline(1))
2635 set virtualedit&
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002636
Dominique Pelle923dce22021-11-21 11:36:04 +00002637 " Test for aborting a g command using CTRL-\ CTRL-G
Bram Moolenaar1671f442020-03-10 07:48:13 +01002638 exe "normal! g\<C-\>\<C-G>"
2639 call assert_equal('foo first line', getline('.'))
2640
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002641 " clean up
2642 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002643endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002644
Bram Moolenaarce416b42022-04-03 12:59:34 +01002645func Test_normal_ex_substitute()
2646 " This was hanging on the substitute prompt.
2647 new
2648 call setline(1, 'a')
2649 exe "normal! gggQs/a/b/c\<CR>"
2650 call assert_equal('a', getline(1))
2651 bwipe!
2652endfunc
2653
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002654" Test for g CTRL-G
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002655func Test_g_ctrl_g()
Bram Moolenaar05295832018-08-24 22:07:58 +02002656 new
2657
2658 let a = execute(":norm! g\<c-g>")
2659 call assert_equal("\n--No lines in buffer--", a)
2660
Bram Moolenaar1671f442020-03-10 07:48:13 +01002661 " Test for CTRL-G (same as :file)
2662 let a = execute(":norm! \<c-g>")
2663 call assert_equal("\n\n\"[No Name]\" --No lines in buffer--", a)
2664
Bram Moolenaar05295832018-08-24 22:07:58 +02002665 call setline(1, ['first line', 'second line'])
2666
2667 " Test g CTRL-g with dos, mac and unix file type.
2668 norm! gojll
2669 set ff=dos
2670 let a = execute(":norm! g\<c-g>")
2671 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 15 of 25", a)
2672
2673 set ff=mac
2674 let a = execute(":norm! g\<c-g>")
2675 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
2676
2677 set ff=unix
2678 let a = execute(":norm! g\<c-g>")
2679 call assert_equal("\nCol 3 of 11; Line 2 of 2; Word 3 of 4; Byte 14 of 23", a)
2680
2681 " Test g CTRL-g in visual mode (v)
2682 let a = execute(":norm! gojllvlg\<c-g>")
2683 call assert_equal("\nSelected 1 of 2 Lines; 1 of 4 Words; 2 of 23 Bytes", a)
2684
2685 " Test g CTRL-g in visual mode (CTRL-V) with end col > start col
2686 let a = execute(":norm! \<Esc>gojll\<C-V>kllg\<c-g>")
2687 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
2688
2689 " Test g_CTRL-g in visual mode (CTRL-V) with end col < start col
2690 let a = execute(":norm! \<Esc>goll\<C-V>jhhg\<c-g>")
2691 call assert_equal("\nSelected 3 Cols; 2 of 2 Lines; 2 of 4 Words; 6 of 23 Bytes", a)
2692
2693 " Test g CTRL-g in visual mode (CTRL-V) with end_vcol being MAXCOL
2694 let a = execute(":norm! \<Esc>gojll\<C-V>k$g\<c-g>")
2695 call assert_equal("\nSelected 2 of 2 Lines; 4 of 4 Words; 17 of 23 Bytes", a)
2696
2697 " There should be one byte less with noeol
2698 set bin noeol
2699 let a = execute(":norm! \<Esc>gog\<c-g>")
2700 call assert_equal("\nCol 1 of 10; Line 1 of 2; Word 1 of 4; Char 1 of 23; Byte 1 of 22", a)
2701 set bin & eol&
2702
Bram Moolenaar30276f22019-01-24 17:59:39 +01002703 call setline(1, ['Français', '日本語'])
Bram Moolenaar05295832018-08-24 22:07:58 +02002704
Bram Moolenaar30276f22019-01-24 17:59:39 +01002705 let a = execute(":norm! \<Esc>gojlg\<c-g>")
2706 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 +02002707
Bram Moolenaar30276f22019-01-24 17:59:39 +01002708 let a = execute(":norm! \<Esc>gojvlg\<c-g>")
2709 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 +02002710
Bram Moolenaar30276f22019-01-24 17:59:39 +01002711 let a = execute(":norm! \<Esc>goll\<c-v>jlg\<c-g>")
2712 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 +02002713
Bram Moolenaar30276f22019-01-24 17:59:39 +01002714 set fenc=utf8 bomb
2715 let a = execute(":norm! \<Esc>gojlg\<c-g>")
2716 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 +02002717
Bram Moolenaar30276f22019-01-24 17:59:39 +01002718 set fenc=utf16 bomb
2719 let a = execute(":norm! g\<c-g>")
2720 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 +02002721
Bram Moolenaar30276f22019-01-24 17:59:39 +01002722 set fenc=utf32 bomb
2723 let a = execute(":norm! g\<c-g>")
2724 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 +02002725
Bram Moolenaar30276f22019-01-24 17:59:39 +01002726 set fenc& bomb&
Bram Moolenaar05295832018-08-24 22:07:58 +02002727
2728 set ff&
2729 bwipe!
2730endfunc
2731
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002732" Test for g8
Bram Moolenaar1671f442020-03-10 07:48:13 +01002733func Test_normal34_g_cmd3()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002734 new
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002735 let a=execute(':norm! 1G0g8')
2736 call assert_equal("\nNUL", a)
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002737
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002738 call setline(1, 'abcdefghijklmnopqrstuvwxyzäüö')
2739 let a=execute(':norm! 1G$g8')
2740 call assert_equal("\nc3 b6 ", a)
2741
2742 call setline(1, "a\u0302")
2743 let a=execute(':norm! 1G0g8')
2744 call assert_equal("\n61 + cc 82 ", a)
2745
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002746 " clean up
2747 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002748endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002749
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002750" Test 8g8 which finds invalid utf8 at or after the cursor.
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002751func Test_normal_8g8()
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002752 new
2753
Bram Moolenaar395b6ba2017-04-07 20:09:51 +02002754 " With invalid byte.
2755 call setline(1, "___\xff___")
2756 norm! 1G08g8g
2757 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2758
2759 " With invalid byte before the cursor.
2760 call setline(1, "___\xff___")
2761 norm! 1G$h8g8g
2762 call assert_equal([0, 1, 6, 0, 9], getcurpos())
2763
2764 " With truncated sequence.
2765 call setline(1, "___\xE2\x82___")
2766 norm! 1G08g8g
2767 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2768
2769 " With overlong sequence.
2770 call setline(1, "___\xF0\x82\x82\xAC___")
2771 norm! 1G08g8g
2772 call assert_equal([0, 1, 4, 0, 1], getcurpos())
2773
2774 " With valid utf8.
2775 call setline(1, "café")
2776 norm! 1G08g8
2777 call assert_equal([0, 1, 1, 0, 1], getcurpos())
2778
2779 bw!
2780endfunc
2781
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002782" Test for g<
Bram Moolenaar1671f442020-03-10 07:48:13 +01002783func Test_normal35_g_cmd4()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002784 " Cannot capture its output,
2785 " probably a bug, therefore, test disabled:
Bram Moolenaar31845092016-09-05 22:58:31 +02002786 throw "Skipped: output of g< can't be tested currently"
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002787 echo "a\nb\nc\nd"
2788 let b=execute(':norm! g<')
2789 call assert_true(!empty(b), 'failed `execute(g<)`')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002790endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002791
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002792" Test for gp gP go
Bram Moolenaar1671f442020-03-10 07:48:13 +01002793func Test_normal36_g_cmd5()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002794 new
2795 call append(0, 'abcdefghijklmnopqrstuvwxyz')
Bram Moolenaar0913a102016-09-03 19:11:59 +02002796 set ff=unix
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002797 " Test for gp gP
2798 call append(1, range(1,10))
2799 1
2800 norm! 1yy
2801 3
2802 norm! gp
2803 call assert_equal([0, 5, 1, 0, 1], getcurpos())
2804 $
2805 norm! gP
2806 call assert_equal([0, 14, 1, 0, 1], getcurpos())
2807
2808 " Test for go
2809 norm! 26go
2810 call assert_equal([0, 1, 26, 0, 26], getcurpos())
2811 norm! 27go
2812 call assert_equal([0, 1, 26, 0, 26], getcurpos())
2813 norm! 28go
2814 call assert_equal([0, 2, 1, 0, 1], getcurpos())
2815 set ff=dos
2816 norm! 29go
2817 call assert_equal([0, 2, 1, 0, 1], getcurpos())
2818 set ff=unix
2819 norm! gg0
2820 norm! 101go
2821 call assert_equal([0, 13, 26, 0, 26], getcurpos())
2822 norm! 103go
2823 call assert_equal([0, 14, 1, 0, 1], getcurpos())
2824 " count > buffer content
2825 norm! 120go
naohiro ono56200ee2022-01-01 14:59:44 +00002826 call assert_equal([0, 14, 1, 0, v:maxcol], getcurpos())
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002827 " clean up
2828 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002829endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002830
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002831" Test for gt and gT
Bram Moolenaar1671f442020-03-10 07:48:13 +01002832func Test_normal37_g_cmd6()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002833 tabnew 1.txt
2834 tabnew 2.txt
2835 tabnew 3.txt
2836 norm! 1gt
2837 call assert_equal(1, tabpagenr())
2838 norm! 3gt
2839 call assert_equal(3, tabpagenr())
2840 norm! 1gT
2841 " count gT goes not to the absolute tabpagenumber
2842 " but, but goes to the count previous tabpagenumber
2843 call assert_equal(2, tabpagenr())
2844 " wrap around
2845 norm! 3gT
2846 call assert_equal(3, tabpagenr())
2847 " gt does not wrap around
2848 norm! 5gt
2849 call assert_equal(3, tabpagenr())
2850
2851 for i in range(3)
2852 tabclose
2853 endfor
2854 " clean up
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +01002855 call assert_fails(':tabclose', 'E784:')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002856endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002857
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002858" Test for <Home> and <C-Home> key
Bram Moolenaar1671f442020-03-10 07:48:13 +01002859func Test_normal38_nvhome()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002860 new
2861 call setline(1, range(10))
2862 $
2863 setl et sw=2
2864 norm! V10>$
2865 " count is ignored
2866 exe "norm! 10\<home>"
2867 call assert_equal(1, col('.'))
2868 exe "norm! \<home>"
2869 call assert_equal([0, 10, 1, 0, 1], getcurpos())
2870 exe "norm! 5\<c-home>"
2871 call assert_equal([0, 5, 1, 0, 1], getcurpos())
2872 exe "norm! \<c-home>"
2873 call assert_equal([0, 1, 1, 0, 1], getcurpos())
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002874 exe "norm! G\<c-kHome>"
2875 call assert_equal([0, 1, 1, 0, 1], getcurpos())
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002876
2877 " clean up
2878 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002879endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002880
Bram Moolenaar1671f442020-03-10 07:48:13 +01002881" Test for <End> and <C-End> keys
2882func Test_normal_nvend()
2883 new
2884 call setline(1, map(range(1, 10), '"line" .. v:val'))
2885 exe "normal! \<End>"
2886 call assert_equal(5, col('.'))
2887 exe "normal! 4\<End>"
2888 call assert_equal([4, 5], [line('.'), col('.')])
2889 exe "normal! \<C-End>"
2890 call assert_equal([10, 6], [line('.'), col('.')])
2891 close!
2892endfunc
2893
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002894" Test for cw cW ce
Bram Moolenaar1671f442020-03-10 07:48:13 +01002895func Test_normal39_cw()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002896 " Test for cw and cW on whitespace
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002897 new
2898 set tw=0
2899 call append(0, 'here are some words')
2900 norm! 1gg0elcwZZZ
2901 call assert_equal('hereZZZare some words', getline('.'))
2902 norm! 1gg0elcWYYY
2903 call assert_equal('hereZZZareYYYsome words', getline('.'))
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002904 norm! 2gg0cwfoo
2905 call assert_equal('foo', getline('.'))
2906
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002907 call setline(1, 'one; two')
2908 call cursor(1, 1)
2909 call feedkeys('cwvim', 'xt')
2910 call assert_equal('vim; two', getline(1))
2911 call feedkeys('0cWone', 'xt')
2912 call assert_equal('one two', getline(1))
2913 "When cursor is at the end of a word 'ce' will change until the end of the
2914 "next word, but 'cw' will change only one character
2915 call setline(1, 'one two')
2916 call feedkeys('0ecwce', 'xt')
2917 call assert_equal('once two', getline(1))
2918 call setline(1, 'one two')
2919 call feedkeys('0ecely', 'xt')
2920 call assert_equal('only', getline(1))
2921
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002922 " clean up
2923 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002924endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002925
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002926" Test for CTRL-\ commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01002927func Test_normal40_ctrl_bsl()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002928 new
2929 call append(0, 'here are some words')
2930 exe "norm! 1gg0a\<C-\>\<C-N>"
2931 call assert_equal('n', mode())
2932 call assert_equal(1, col('.'))
2933 call assert_equal('', visualmode())
2934 exe "norm! 1gg0viw\<C-\>\<C-N>"
2935 call assert_equal('n', mode())
2936 call assert_equal(4, col('.'))
2937 exe "norm! 1gg0a\<C-\>\<C-G>"
2938 call assert_equal('n', mode())
2939 call assert_equal(1, col('.'))
2940 "imap <buffer> , <c-\><c-n>
2941 set im
2942 exe ":norm! \<c-\>\<c-n>dw"
2943 set noim
2944 call assert_equal('are some words', getline(1))
2945 call assert_false(&insertmode)
Yegappan Lakshmanan1a71d312021-07-15 12:49:58 +02002946 call assert_beeps("normal! \<C-\>\<C-A>")
Bram Moolenaar1671f442020-03-10 07:48:13 +01002947
Bram Moolenaar21829c52021-01-26 22:42:21 +01002948 if has('cmdwin')
2949 " Using CTRL-\ CTRL-N in cmd window should close the window
2950 call feedkeys("q:\<C-\>\<C-N>", 'xt')
2951 call assert_equal('', getcmdwintype())
2952 endif
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002953
2954 " clean up
2955 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002956endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002957
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002958" Test for <c-r>=, <c-r><c-r>= and <c-r><c-o>= in insert mode
Bram Moolenaar1671f442020-03-10 07:48:13 +01002959func Test_normal41_insert_reg()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002960 new
2961 set sts=2 sw=2 ts=8 tw=0
2962 call append(0, ["aaa\tbbb\tccc", '', '', ''])
2963 let a=getline(1)
2964 norm! 2gg0
2965 exe "norm! a\<c-r>=a\<cr>"
2966 norm! 3gg0
2967 exe "norm! a\<c-r>\<c-r>=a\<cr>"
2968 norm! 4gg0
2969 exe "norm! a\<c-r>\<c-o>=a\<cr>"
2970 call assert_equal(['aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', 'aaa bbb ccc', ''], getline(1, '$'))
2971
2972 " clean up
2973 set sts=0 sw=8 ts=8
Bram Moolenaar31845092016-09-05 22:58:31 +02002974 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02002975endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002976
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01002977" Test for Ctrl-D and Ctrl-U
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01002978func Test_normal42_halfpage()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02002979 call Setup_NewWindow()
2980 call assert_equal(5, &scroll)
2981 exe "norm! \<c-d>"
2982 call assert_equal('6', getline('.'))
2983 exe "norm! 2\<c-d>"
2984 call assert_equal('8', getline('.'))
2985 call assert_equal(2, &scroll)
2986 set scroll=5
2987 exe "norm! \<c-u>"
2988 call assert_equal('3', getline('.'))
2989 1
2990 set scrolloff=5
2991 exe "norm! \<c-d>"
2992 call assert_equal('10', getline('.'))
2993 exe "norm! \<c-u>"
2994 call assert_equal('5', getline('.'))
2995 1
2996 set scrolloff=99
2997 exe "norm! \<c-d>"
2998 call assert_equal('10', getline('.'))
2999 set scrolloff=0
3000 100
3001 exe "norm! $\<c-u>"
3002 call assert_equal('95', getline('.'))
3003 call assert_equal([0, 95, 1, 0, 1], getcurpos())
3004 100
3005 set nostartofline
3006 exe "norm! $\<c-u>"
3007 call assert_equal('95', getline('.'))
naohiro ono56200ee2022-01-01 14:59:44 +00003008 call assert_equal([0, 95, 2, 0, v:maxcol], getcurpos())
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02003009 " cleanup
3010 set startofline
3011 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003012endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02003013
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003014func Test_normal45_drop()
Bram Moolenaar29495952018-02-12 22:49:00 +01003015 if !has('dnd')
Bram Moolenaarb48e96f2018-02-13 12:26:14 +01003016 " The ~ register does not exist
3017 call assert_beeps('norm! "~')
Bram Moolenaar29495952018-02-12 22:49:00 +01003018 return
3019 endif
3020
3021 " basic test for drag-n-drop
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02003022 " unfortunately, without a gui, we can't really test much here,
3023 " so simply test that ~p fails (which uses the drop register)
3024 new
Bram Moolenaare2e40752020-09-04 21:18:46 +02003025 call assert_fails(':norm! "~p', 'E353:')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02003026 call assert_equal([], getreg('~', 1, 1))
3027 " the ~ register is read only
Bram Moolenaare2e40752020-09-04 21:18:46 +02003028 call assert_fails(':let @~="1"', 'E354:')
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02003029 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003030endfunc
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02003031
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003032func Test_normal46_ignore()
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02003033 new
3034 " How to test this?
3035 " let's just for now test, that the buffer
3036 " does not change
3037 call feedkeys("\<c-s>", 't')
3038 call assert_equal([''], getline(1,'$'))
3039
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003040 " no valid commands
3041 exe "norm! \<char-0x100>"
3042 call assert_equal([''], getline(1,'$'))
3043
3044 exe "norm! ä"
3045 call assert_equal([''], getline(1,'$'))
3046
Bram Moolenaar87bc3f72016-09-03 17:33:54 +02003047 " clean up
3048 bw!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003049endfunc
Bram Moolenaarc4a908e2016-09-08 23:35:30 +02003050
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003051func Test_normal47_visual_buf_wipe()
Bram Moolenaarc4a908e2016-09-08 23:35:30 +02003052 " This was causing a crash or ml_get error.
3053 enew!
3054 call setline(1,'xxx')
3055 normal $
3056 new
3057 call setline(1, range(1,2))
3058 2
3059 exe "norm \<C-V>$"
3060 bw!
3061 norm yp
3062 set nomodified
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003063endfunc
3064
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003065func Test_normal48_wincmd()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003066 new
3067 exe "norm! \<c-w>c"
3068 call assert_equal(1, winnr('$'))
Bram Moolenaare2e40752020-09-04 21:18:46 +02003069 call assert_fails(":norm! \<c-w>c", 'E444:')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003070endfunc
3071
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003072func Test_normal49_counts()
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003073 new
3074 call setline(1, 'one two three four five six seven eight nine ten')
3075 1
3076 norm! 3d2w
3077 call assert_equal('seven eight nine ten', getline(1))
3078 bw!
3079endfunc
3080
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003081func Test_normal50_commandline()
Bram Moolenaar004a6782020-04-11 17:09:31 +02003082 CheckFeature timers
3083 CheckFeature cmdline_hist
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003084 func! DoTimerWork(id)
3085 call assert_equal('[Command Line]', bufname(''))
3086 " should fail, with E11, but does fail with E23?
3087 "call feedkeys("\<c-^>", 'tm')
3088
3089 " should also fail with E11
Bram Moolenaare2e40752020-09-04 21:18:46 +02003090 call assert_fails(":wincmd p", 'E11:')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003091 " return from commandline window
3092 call feedkeys("\<cr>")
3093 endfunc
3094
3095 let oldlang=v:lang
3096 lang C
3097 set updatetime=20
3098 call timer_start(100, 'DoTimerWork')
3099 try
3100 " throws E23, for whatever reason...
3101 call feedkeys('q:', 'x!')
3102 catch /E23/
3103 " no-op
3104 endtry
3105 " clean up
3106 set updatetime=4000
3107 exe "lang" oldlang
3108 bw!
3109endfunc
3110
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003111func Test_normal51_FileChangedRO()
Bram Moolenaar004a6782020-04-11 17:09:31 +02003112 CheckFeature autocmd
Bram Moolenaare5f2a072017-02-01 22:31:49 +01003113 " Don't sleep after the warning message.
3114 call test_settime(1)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003115 call writefile(['foo'], 'Xreadonly.log')
3116 new Xreadonly.log
3117 setl ro
3118 au FileChangedRO <buffer> :call feedkeys("\<c-^>", 'tix')
Bram Moolenaare2e40752020-09-04 21:18:46 +02003119 call assert_fails(":norm! Af", 'E788:')
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003120 call assert_equal(['foo'], getline(1,'$'))
3121 call assert_equal('Xreadonly.log', bufname(''))
3122
3123 " cleanup
Bram Moolenaare5f2a072017-02-01 22:31:49 +01003124 call test_settime(0)
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003125 bw!
3126 call delete("Xreadonly.log")
3127endfunc
3128
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003129func Test_normal52_rl()
Bram Moolenaar004a6782020-04-11 17:09:31 +02003130 CheckFeature rightleft
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003131 new
3132 call setline(1, 'abcde fghij klmnopq')
3133 norm! 1gg$
3134 set rl
3135 call assert_equal(19, col('.'))
3136 call feedkeys('l', 'tx')
3137 call assert_equal(18, col('.'))
3138 call feedkeys('h', 'tx')
3139 call assert_equal(19, col('.'))
3140 call feedkeys("\<right>", 'tx')
3141 call assert_equal(18, col('.'))
Bram Moolenaar1671f442020-03-10 07:48:13 +01003142 call feedkeys("\<left>", 'tx')
3143 call assert_equal(19, col('.'))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003144 call feedkeys("\<s-right>", 'tx')
3145 call assert_equal(13, col('.'))
3146 call feedkeys("\<c-right>", 'tx')
3147 call assert_equal(7, col('.'))
3148 call feedkeys("\<c-left>", 'tx')
3149 call assert_equal(13, col('.'))
3150 call feedkeys("\<s-left>", 'tx')
3151 call assert_equal(19, col('.'))
3152 call feedkeys("<<", 'tx')
3153 call assert_equal(' abcde fghij klmnopq',getline(1))
3154 call feedkeys(">>", 'tx')
3155 call assert_equal('abcde fghij klmnopq',getline(1))
3156
3157 " cleanup
3158 set norl
3159 bw!
3160endfunc
3161
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02003162func Test_normal54_Ctrl_bsl()
3163 new
3164 call setline(1, 'abcdefghijklmn')
3165 exe "norm! df\<c-\>\<c-n>"
3166 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
3167 exe "norm! df\<c-\>\<c-g>"
3168 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
3169 exe "norm! df\<c-\>m"
3170 call assert_equal(['abcdefghijklmn'], getline(1,'$'))
Bram Moolenaar30276f22019-01-24 17:59:39 +01003171
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02003172 call setline(2, 'abcdefghijklmnāf')
3173 norm! 2gg0
3174 exe "norm! df\<Char-0x101>"
3175 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
3176 norm! 1gg0
3177 exe "norm! df\<esc>"
3178 call assert_equal(['abcdefghijklmn', 'f'], getline(1,'$'))
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003179
Bram Moolenaarb1e04fc2017-03-29 13:08:35 +02003180 " clean up
3181 bw!
3182endfunc
3183
3184func Test_normal_large_count()
3185 " This may fail with 32bit long, how do we detect that?
3186 new
3187 normal o
3188 normal 6666666666dL
3189 bwipe!
Bram Moolenaar2931f2a2016-09-09 16:59:08 +02003190endfunc
Bram Moolenaarbf3d5802017-03-29 19:48:11 +02003191
3192func Test_delete_until_paragraph()
Bram Moolenaarbf3d5802017-03-29 19:48:11 +02003193 new
3194 normal grádv}
3195 call assert_equal('á', getline(1))
3196 normal grád}
3197 call assert_equal('', getline(1))
3198 bwipe!
3199endfunc
Bram Moolenaarfb094e12017-11-05 20:59:28 +01003200
3201" Test for the gr (virtual replace) command
3202" Test for the bug fixed by 7.4.387
3203func Test_gr_command()
3204 enew!
3205 let save_cpo = &cpo
3206 call append(0, ['First line', 'Second line', 'Third line'])
3207 exe "normal i\<C-G>u"
3208 call cursor(2, 1)
3209 set cpo-=X
3210 normal 4gro
3211 call assert_equal('oooond line', getline(2))
3212 undo
3213 set cpo+=X
3214 normal 4gro
3215 call assert_equal('ooooecond line', getline(2))
3216 let &cpo = save_cpo
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003217 normal! ggvegrx
3218 call assert_equal('xxxxx line', getline(1))
3219 exe "normal! gggr\<C-V>122"
3220 call assert_equal('zxxxx line', getline(1))
3221 set virtualedit=all
3222 normal! 15|grl
3223 call assert_equal('zxxxx line l', getline(1))
3224 set virtualedit&
3225 set nomodifiable
3226 call assert_fails('normal! grx', 'E21:')
3227 call assert_fails('normal! gRx', 'E21:')
3228 set modifiable&
Bram Moolenaarfb094e12017-11-05 20:59:28 +01003229 enew!
3230endfunc
3231
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003232func Test_nv_hat_count()
3233 %bwipeout!
3234 let l:nr = bufnr('%') + 1
Bram Moolenaare2e40752020-09-04 21:18:46 +02003235 call assert_fails(':execute "normal! ' . l:nr . '\<C-^>"', 'E92:')
Bram Moolenaar1bbb6192018-11-10 16:02:01 +01003236
3237 edit Xfoo
3238 let l:foo_nr = bufnr('Xfoo')
3239
3240 edit Xbar
3241 let l:bar_nr = bufnr('Xbar')
3242
3243 " Make sure we are not just using the alternate file.
3244 edit Xbaz
3245
3246 call feedkeys(l:foo_nr . "\<C-^>", 'tx')
3247 call assert_equal('Xfoo', fnamemodify(bufname('%'), ':t'))
3248
3249 call feedkeys(l:bar_nr . "\<C-^>", 'tx')
3250 call assert_equal('Xbar', fnamemodify(bufname('%'), ':t'))
3251
3252 %bwipeout!
3253endfunc
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01003254
3255func Test_message_when_using_ctrl_c()
Bram Moolenaar553e5a52019-03-25 23:16:34 +01003256 " Make sure no buffers are changed.
3257 %bwipe!
3258
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01003259 exe "normal \<C-C>"
3260 call assert_match("Type :qa and press <Enter> to exit Vim", Screenline(&lines))
Bram Moolenaar553e5a52019-03-25 23:16:34 +01003261
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01003262 new
3263 cal setline(1, 'hi!')
3264 exe "normal \<C-C>"
3265 call assert_match("Type :qa! and press <Enter> to abandon all changes and exit Vim", Screenline(&lines))
Bram Moolenaar553e5a52019-03-25 23:16:34 +01003266
Bram Moolenaara84a3dd2019-03-25 22:21:24 +01003267 bwipe!
3268endfunc
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02003269
Bram Moolenaar7a1d3282022-06-16 13:04:45 +01003270func Test_mode_updated_after_ctrl_c()
3271 CheckScreendump
3272
3273 let buf = RunVimInTerminal('', {'rows': 5})
3274 call term_sendkeys(buf, "i")
3275 call term_sendkeys(buf, "\<C-O>")
3276 " wait a moment so that the "-- (insert) --" message is displayed
3277 call TermWait(buf, 50)
3278 call term_sendkeys(buf, "\<C-C>")
3279 call VerifyScreenDump(buf, 'Test_mode_updated_1', {})
3280
3281 call StopVimInTerminal(buf)
3282endfunc
3283
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02003284" Test for '[m', ']m', '[M' and ']M'
3285" Jumping to beginning and end of methods in Java-like languages
3286func Test_java_motion()
3287 new
Bram Moolenaar1671f442020-03-10 07:48:13 +01003288 call assert_beeps('normal! [m')
3289 call assert_beeps('normal! ]m')
3290 call assert_beeps('normal! [M')
3291 call assert_beeps('normal! ]M')
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003292 let lines =<< trim [CODE]
3293 Piece of Java
3294 {
3295 tt m1 {
3296 t1;
3297 } e1
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02003298
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003299 tt m2 {
3300 t2;
3301 } e2
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02003302
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003303 tt m3 {
3304 if (x)
3305 {
3306 t3;
3307 }
3308 } e3
3309 }
3310 [CODE]
3311 call setline(1, lines)
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02003312
3313 normal gg
3314
3315 normal 2]maA
3316 call assert_equal("\ttt m1 {A", getline('.'))
3317 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
3318
3319 normal j]maB
3320 call assert_equal("\ttt m2 {B", getline('.'))
3321 call assert_equal([7, 9, 16], [line('.'), col('.'), virtcol('.')])
3322
3323 normal ]maC
3324 call assert_equal("\ttt m3 {C", getline('.'))
3325 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
3326
3327 normal [maD
3328 call assert_equal("\ttt m3 {DC", getline('.'))
3329 call assert_equal([11, 9, 16], [line('.'), col('.'), virtcol('.')])
3330
3331 normal k2[maE
3332 call assert_equal("\ttt m1 {EA", getline('.'))
3333 call assert_equal([3, 9, 16], [line('.'), col('.'), virtcol('.')])
3334
3335 normal 3[maF
3336 call assert_equal("{F", getline('.'))
3337 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
3338
3339 normal ]MaG
3340 call assert_equal("\t}G e1", getline('.'))
3341 call assert_equal([5, 3, 10], [line('.'), col('.'), virtcol('.')])
3342
3343 normal j2]MaH
3344 call assert_equal("\t}H e3", getline('.'))
3345 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
3346
3347 normal ]M]M
3348 normal aI
3349 call assert_equal("}I", getline('.'))
3350 call assert_equal([17, 2, 2], [line('.'), col('.'), virtcol('.')])
3351
3352 normal 2[MaJ
3353 call assert_equal("\t}JH e3", getline('.'))
3354 call assert_equal([16, 3, 10], [line('.'), col('.'), virtcol('.')])
3355
3356 normal k[MaK
3357 call assert_equal("\t}K e2", getline('.'))
3358 call assert_equal([9, 3, 10], [line('.'), col('.'), virtcol('.')])
3359
3360 normal 3[MaL
3361 call assert_equal("{LF", getline('.'))
3362 call assert_equal([2, 2, 2], [line('.'), col('.'), virtcol('.')])
3363
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003364 call cursor(2, 1)
3365 call assert_beeps('norm! 5]m')
3366
3367 " jumping to a method in a fold should open the fold
3368 6,10fold
3369 call feedkeys("gg3]m", 'xt')
3370 call assert_equal([7, 8, 15], [line('.'), col('.'), virtcol('.')])
3371 call assert_equal(-1, foldclosedend(7))
3372
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02003373 close!
3374endfunc
Bram Moolenaard5c82342019-07-27 18:44:57 +02003375
Bram Moolenaar004a6782020-04-11 17:09:31 +02003376" Tests for g cmds
Bram Moolenaar1671f442020-03-10 07:48:13 +01003377func Test_normal_gdollar_cmd()
Bram Moolenaard5c82342019-07-27 18:44:57 +02003378 call Setup_NewWindow()
3379 " Make long lines that will wrap
3380 %s/$/\=repeat(' foobar', 10)/
3381 20vsp
3382 set wrap
3383 " Test for g$ with count
3384 norm! gg
3385 norm! 0vg$y
3386 call assert_equal(20, col("'>"))
3387 call assert_equal('1 foobar foobar foob', getreg(0))
3388 norm! gg
3389 norm! 0v4g$y
3390 call assert_equal(72, col("'>"))
3391 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.."\n", getreg(0))
3392 norm! gg
3393 norm! 0v6g$y
3394 call assert_equal(40, col("'>"))
3395 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3396 \ '2 foobar foobar foobar foobar foobar foo', getreg(0))
3397 set nowrap
3398 " clean up
3399 norm! gg
3400 norm! 0vg$y
3401 call assert_equal(20, col("'>"))
3402 call assert_equal('1 foobar foobar foob', getreg(0))
3403 norm! gg
3404 norm! 0v4g$y
3405 call assert_equal(20, col("'>"))
3406 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3407 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3408 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3409 \ '4 foobar foobar foob', getreg(0))
3410 norm! gg
3411 norm! 0v6g$y
3412 call assert_equal(20, col("'>"))
3413 call assert_equal('1 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3414 \ '2 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3415 \ '3 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3416 \ '4 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3417 \ '5 foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar'.. "\n"..
3418 \ '6 foobar foobar foob', getreg(0))
3419 " Move to last line, also down movement is not possible, should still move
3420 " the cursor to the last visible char
3421 norm! G
3422 norm! 0v6g$y
3423 call assert_equal(20, col("'>"))
3424 call assert_equal('100 foobar foobar fo', getreg(0))
3425 bw!
3426endfunc
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02003427
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003428func Test_normal_gk_gj()
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02003429 " needs 80 column new window
3430 new
3431 vert 80new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003432 call assert_beeps('normal gk')
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02003433 put =[repeat('x',90)..' {{{1', 'x {{{1']
3434 norm! gk
3435 " In a 80 column wide terminal the window will be only 78 char
3436 " (because Vim will leave space for the other window),
3437 " but if the terminal is larger, it will be 80 chars, so verify the
3438 " cursor column correctly.
3439 call assert_equal(winwidth(0)+1, col('.'))
3440 call assert_equal(winwidth(0)+1, virtcol('.'))
3441 norm! j
3442 call assert_equal(6, col('.'))
3443 call assert_equal(6, virtcol('.'))
3444 norm! gk
3445 call assert_equal(95, col('.'))
3446 call assert_equal(95, virtcol('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003447 %bw!
Bram Moolenaarceba3dd2019-10-12 16:12:54 +02003448
3449 " needs 80 column new window
3450 new
3451 vert 80new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003452 call assert_beeps('normal gj')
Bram Moolenaarceba3dd2019-10-12 16:12:54 +02003453 set number
3454 set numberwidth=10
3455 set cpoptions+=n
3456 put =[repeat('0',90), repeat('1',90)]
3457 norm! 075l
3458 call assert_equal(76, col('.'))
3459 norm! gk
3460 call assert_equal(1, col('.'))
3461 norm! gk
3462 call assert_equal(76, col('.'))
3463 norm! gk
3464 call assert_equal(1, col('.'))
3465 norm! gj
3466 call assert_equal(76, col('.'))
3467 norm! gj
3468 call assert_equal(1, col('.'))
3469 norm! gj
3470 call assert_equal(76, col('.'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003471 " When 'nowrap' is set, gk and gj behave like k and j
3472 set nowrap
3473 normal! gk
3474 call assert_equal([2, 76], [line('.'), col('.')])
3475 normal! gj
3476 call assert_equal([3, 76], [line('.'), col('.')])
3477 %bw!
3478 set cpoptions& number& numberwidth& wrap&
Bram Moolenaar03ac52f2019-09-24 22:47:46 +02003479endfunc
Bram Moolenaarf0cee192020-02-16 13:33:56 +01003480
Bram Moolenaar818fc9a2020-02-21 17:54:45 +01003481" Test for using : to run a multi-line Ex command in operator pending mode
3482func Test_normal_yank_with_excmd()
3483 new
3484 call setline(1, ['foo', 'bar', 'baz'])
3485 let @a = ''
3486 call feedkeys("\"ay:if v:true\<CR>normal l\<CR>endif\<CR>", 'xt')
3487 call assert_equal('f', @a)
3488 close!
3489endfunc
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003490
3491" Test for supplying a count to a normal-mode command across a cursorhold call
3492func Test_normal_cursorhold_with_count()
3493 func s:cHold()
3494 let g:cHold_Called += 1
3495 endfunc
3496 new
3497 augroup normalcHoldTest
3498 au!
3499 au CursorHold <buffer> call s:cHold()
3500 augroup END
3501 let g:cHold_Called = 0
3502 call feedkeys("3\<CursorHold>2ix", 'xt')
3503 call assert_equal(1, g:cHold_Called)
3504 call assert_equal(repeat('x', 32), getline(1))
3505 augroup normalcHoldTest
3506 au!
3507 augroup END
3508 au! normalcHoldTest
3509 close!
3510 delfunc s:cHold
3511endfunc
3512
3513" Test for using a count and a command with CTRL-W
3514func Test_wincmd_with_count()
3515 call feedkeys("\<C-W>12n", 'xt')
3516 call assert_equal(12, winheight(0))
3517endfunc
3518
3519" Test for 'b', 'B' 'ge' and 'gE' commands
Bram Moolenaar1671f442020-03-10 07:48:13 +01003520func Test_horiz_motion()
3521 new
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003522 normal! gg
3523 call assert_beeps('normal! b')
3524 call assert_beeps('normal! B')
3525 call assert_beeps('normal! gE')
3526 call assert_beeps('normal! ge')
Bram Moolenaar1671f442020-03-10 07:48:13 +01003527 " <S-Backspace> moves one word left and <C-Backspace> moves one WORD left
3528 call setline(1, 'one ,two ,three')
3529 exe "normal! $\<S-BS>"
3530 call assert_equal(11, col('.'))
3531 exe "normal! $\<C-BS>"
3532 call assert_equal(10, col('.'))
3533 close!
3534endfunc
3535
3536" Test for using a : command in operator pending mode
3537func Test_normal_colon_op()
3538 new
3539 call setline(1, ['one', 'two'])
3540 call assert_beeps("normal! Gc:d\<CR>")
3541 close!
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003542endfunc
3543
Bram Moolenaar004a6782020-04-11 17:09:31 +02003544" Test for d and D commands
3545func Test_normal_delete_cmd()
3546 new
3547 " D in an empty line
3548 call setline(1, '')
3549 normal D
3550 call assert_equal('', getline(1))
3551 " D in an empty line in virtualedit mode
3552 set virtualedit=all
3553 normal D
3554 call assert_equal('', getline(1))
3555 set virtualedit&
3556 " delete to a readonly register
3557 call setline(1, ['abcd'])
3558 call assert_beeps('normal ":d2l')
Bram Moolenaar6fd367a2021-03-13 13:14:04 +01003559
3560 " D and d with 'nomodifiable'
3561 call setline(1, ['abcd'])
3562 setlocal nomodifiable
3563 call assert_fails('normal D', 'E21:')
3564 call assert_fails('normal d$', 'E21:')
3565
Bram Moolenaar004a6782020-04-11 17:09:31 +02003566 close!
3567endfunc
3568
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003569" Test for deleting or changing characters across lines with 'whichwrap'
3570" containing 's'. Should count <EOL> as one character.
3571func Test_normal_op_across_lines()
3572 new
3573 set whichwrap&
3574 call setline(1, ['one two', 'three four'])
3575 exe "norm! $3d\<Space>"
3576 call assert_equal(['one twhree four'], getline(1, '$'))
3577
3578 call setline(1, ['one two', 'three four'])
3579 exe "norm! $3c\<Space>x"
3580 call assert_equal(['one twxhree four'], getline(1, '$'))
3581
3582 set whichwrap+=l
3583 call setline(1, ['one two', 'three four'])
3584 exe "norm! $3x"
3585 call assert_equal(['one twhree four'], getline(1, '$'))
3586 close!
3587 set whichwrap&
3588endfunc
3589
Bram Moolenaar224a5f12020-04-28 20:29:07 +02003590" Test for 'w' and 'b' commands
3591func Test_normal_word_move()
3592 new
3593 call setline(1, ['foo bar a', '', 'foo bar b'])
3594 " copy a single character word at the end of a line
3595 normal 1G$yw
3596 call assert_equal('a', @")
3597 " copy a single character word at the end of a file
3598 normal G$yw
3599 call assert_equal('b', @")
3600 " check for a word movement handling an empty line properly
3601 normal 1G$vwy
3602 call assert_equal("a\n\n", @")
3603
3604 " copy using 'b' command
3605 %d
3606 " non-empty blank line at the start of file
3607 call setline(1, [' ', 'foo bar'])
3608 normal 2Gyb
3609 call assert_equal(" \n", @")
3610 " try to copy backwards from the start of the file
3611 call setline(1, ['one two', 'foo bar'])
3612 call assert_beeps('normal ggyb')
3613 " 'b' command should stop at an empty line
3614 call setline(1, ['one two', '', 'foo bar'])
3615 normal 3Gyb
3616 call assert_equal("\n", @")
3617 normal 3Gy2b
3618 call assert_equal("two\n", @")
3619 " 'b' command should not stop at a non-empty blank line
3620 call setline(1, ['one two', ' ', 'foo bar'])
3621 normal 3Gyb
3622 call assert_equal("two\n ", @")
3623
3624 close!
3625endfunc
3626
Bram Moolenaarbdd2c292020-06-22 21:34:30 +02003627" Test for 'scrolloff' with a long line that doesn't fit in the screen
3628func Test_normal_scroloff()
3629 10new
3630 80vnew
3631 call setline(1, repeat('a', 1000))
3632 set scrolloff=10
3633 normal gg10gj
3634 call assert_equal(8, winline())
3635 normal 10gj
3636 call assert_equal(10, winline())
3637 normal 10gk
3638 call assert_equal(3, winline())
3639 set scrolloff&
3640 close!
3641endfunc
3642
3643" Test for vertical scrolling with CTRL-F and CTRL-B with a long line
3644func Test_normal_vert_scroll_longline()
3645 10new
3646 80vnew
3647 call setline(1, range(1, 10))
3648 call append(5, repeat('a', 1000))
3649 exe "normal gg\<C-F>"
3650 call assert_equal(6, line('.'))
3651 exe "normal \<C-F>\<C-F>"
3652 call assert_equal(11, line('.'))
3653 call assert_equal(1, winline())
3654 exe "normal \<C-B>"
3655 call assert_equal(10, line('.'))
3656 call assert_equal(3, winline())
3657 exe "normal \<C-B>\<C-B>"
3658 call assert_equal(5, line('.'))
3659 call assert_equal(5, winline())
3660 close!
3661endfunc
3662
Bram Moolenaar8a9bc952020-10-02 18:48:07 +02003663" Test for jumping in a file using %
3664func Test_normal_percent_jump()
3665 new
3666 call setline(1, range(1, 100))
3667
3668 " jumping to a folded line should open the fold
3669 25,75fold
3670 call feedkeys('50%', 'xt')
3671 call assert_equal(50, line('.'))
3672 call assert_equal(-1, foldclosedend(50))
3673 close!
3674endfunc
3675
Bram Moolenaar3e72dca2021-05-29 16:30:12 +02003676" Test for << and >> commands to shift text by 'shiftwidth'
3677func Test_normal_shift_rightleft()
3678 new
3679 call setline(1, ['one', '', "\t", ' two', "\tthree", ' four'])
3680 set shiftwidth=2 tabstop=8
3681 normal gg6>>
3682 call assert_equal([' one', '', "\t ", ' two', "\t three", "\tfour"],
3683 \ getline(1, '$'))
3684 normal ggVG2>>
3685 call assert_equal([' one', '', "\t ", "\ttwo",
3686 \ "\t three", "\t four"], getline(1, '$'))
3687 normal gg6<<
3688 call assert_equal([' one', '', "\t ", ' two', "\t three",
3689 \ "\t four"], getline(1, '$'))
3690 normal ggVG2<<
3691 call assert_equal(['one', '', "\t", ' two', "\tthree", ' four'],
3692 \ getline(1, '$'))
3693 set shiftwidth& tabstop&
3694 bw!
3695endfunc
3696
Yegappan Lakshmanan2ac71842021-05-31 19:23:01 +02003697" Some commands like yy, cc, dd, >>, << and !! accept a count after
3698" typing the first letter of the command.
3699func Test_normal_count_after_operator()
3700 new
3701 setlocal shiftwidth=4 tabstop=8 autoindent
3702 call setline(1, ['one', 'two', 'three', 'four', 'five'])
3703 let @a = ''
3704 normal! j"ay4y
3705 call assert_equal("two\nthree\nfour\nfive\n", @a)
3706 normal! 3G>2>
3707 call assert_equal(['one', 'two', ' three', ' four', 'five'],
3708 \ getline(1, '$'))
3709 exe "normal! 3G0c2cred\nblue"
3710 call assert_equal(['one', 'two', ' red', ' blue', 'five'],
3711 \ getline(1, '$'))
3712 exe "normal! gg<8<"
3713 call assert_equal(['one', 'two', 'red', 'blue', 'five'],
3714 \ getline(1, '$'))
3715 exe "normal! ggd3d"
3716 call assert_equal(['blue', 'five'], getline(1, '$'))
3717 call setline(1, range(1, 4))
3718 call feedkeys("gg!3!\<C-B>\"\<CR>", 'xt')
3719 call assert_equal('".,.+2!', @:)
3720 call feedkeys("gg!1!\<C-B>\"\<CR>", 'xt')
3721 call assert_equal('".!', @:)
3722 call feedkeys("gg!9!\<C-B>\"\<CR>", 'xt')
3723 call assert_equal('".,$!', @:)
3724 bw!
3725endfunc
3726
Christian Brabandtaaec1d42021-11-04 13:28:29 +00003727func Test_normal_gj_on_extra_wide_char()
3728 new | 25vsp
3729 let text='1 foooooooo ar e ins‍zwe1 foooooooo ins‍zwei' .
3730 \ ' i drei vier fünf sechs sieben acht un zehn elf zwöfl' .
3731 \ ' dreizehn v ierzehn fünfzehn'
3732 put =text
3733 call cursor(2,1)
3734 norm! gj
3735 call assert_equal([0,2,25,0], getpos('.'))
3736 bw!
3737endfunc
3738
Bram Moolenaar03725c52021-11-24 12:17:53 +00003739func Test_normal_count_out_of_range()
3740 new
3741 call setline(1, 'text')
3742 normal 44444444444|
3743 call assert_equal(999999999, v:count)
3744 normal 444444444444|
3745 call assert_equal(999999999, v:count)
3746 normal 4444444444444|
3747 call assert_equal(999999999, v:count)
3748 normal 4444444444444444444|
3749 call assert_equal(999999999, v:count)
3750
3751 normal 9y99999999|
3752 call assert_equal(899999991, v:count)
3753 normal 10y99999999|
3754 call assert_equal(999999999, v:count)
3755 normal 44444444444y44444444444|
3756 call assert_equal(999999999, v:count)
3757 bwipe!
3758endfunc
3759
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01003760" vim: shiftwidth=2 sts=2 expandtab