blob: 9d2d0f34ac0f6235cd9035b9330761f4589d8ec3 [file] [log] [blame]
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001" Test for edit functions
Bram Moolenaar215ba3b2019-11-06 15:07:07 +01002
Bram Moolenaareb992cb2017-03-09 18:20:16 +01003if exists("+t_kD")
4 let &t_kD="[3;*~"
5endif
Bram Moolenaareb992cb2017-03-09 18:20:16 +01006
Bram Moolenaar215ba3b2019-11-06 15:07:07 +01007source check.vim
8
Bram Moolenaareb992cb2017-03-09 18:20:16 +01009" Needed for testing basic rightleft: Test_edit_rightleft
10source view_util.vim
11
12" Needs to come first until the bug in getchar() is
13" fixed: https://groups.google.com/d/msg/vim_dev/fXL9yme4H4c/bOR-U6_bAQAJ
Bram Moolenaar1e115362019-01-09 23:01:02 +010014func Test_edit_00b()
Bram Moolenaareb992cb2017-03-09 18:20:16 +010015 new
16 call setline(1, ['abc '])
17 inoreabbr <buffer> h here some more
18 call cursor(1, 4)
19 " <c-l> expands the abbreviation and ends insertmode
20 call feedkeys(":set im\<cr> h\<c-l>:set noim\<cr>", 'tix')
21 call assert_equal(['abc here some more '], getline(1,'$'))
22 iunabbr <buffer> h
23 bw!
24endfunc
25
Bram Moolenaar1e115362019-01-09 23:01:02 +010026func Test_edit_01()
Bram Moolenaareb992cb2017-03-09 18:20:16 +010027 " set for Travis CI?
28 " set nocp noesckeys
29 new
Bram Moolenaareb992cb2017-03-09 18:20:16 +010030 " 1) empty buffer
31 call assert_equal([''], getline(1,'$'))
32 " 2) delete in an empty line
33 call feedkeys("i\<del>\<esc>", 'tnix')
34 call assert_equal([''], getline(1,'$'))
35 %d
36 " 3) delete one character
37 call setline(1, 'a')
38 call feedkeys("i\<del>\<esc>", 'tnix')
39 call assert_equal([''], getline(1,'$'))
40 %d
41 " 4) delete a multibyte character
Bram Moolenaar30276f22019-01-24 17:59:39 +010042 call setline(1, "\u0401")
43 call feedkeys("i\<del>\<esc>", 'tnix')
44 call assert_equal([''], getline(1,'$'))
45 %d
Bram Moolenaareb992cb2017-03-09 18:20:16 +010046 " 5.1) delete linebreak with 'bs' option containing eol
47 let _bs=&bs
48 set bs=eol
49 call setline(1, ["abc def", "ghi jkl"])
50 call cursor(1, 1)
51 call feedkeys("A\<del>\<esc>", 'tnix')
52 call assert_equal(['abc defghi jkl'], getline(1, 2))
53 %d
54 " 5.2) delete linebreak with backspace option w/out eol
55 set bs=
56 call setline(1, ["abc def", "ghi jkl"])
57 call cursor(1, 1)
58 call feedkeys("A\<del>\<esc>", 'tnix')
59 call assert_equal(["abc def", "ghi jkl"], getline(1, 2))
Bram Moolenaareb992cb2017-03-09 18:20:16 +010060 let &bs=_bs
61 bw!
62endfunc
63
Bram Moolenaar1e115362019-01-09 23:01:02 +010064func Test_edit_02()
Bram Moolenaareb992cb2017-03-09 18:20:16 +010065 " Change cursor position in InsertCharPre command
66 new
67 call setline(1, 'abc')
68 call cursor(1, 1)
69 fu! DoIt(...)
70 call cursor(1, 4)
71 if len(a:000)
72 let v:char=a:1
73 endif
74 endfu
75 au InsertCharPre <buffer> :call DoIt('y')
76 call feedkeys("ix\<esc>", 'tnix')
77 call assert_equal(['abcy'], getline(1, '$'))
78 " Setting <Enter> in InsertCharPre
79 au! InsertCharPre <buffer> :call DoIt("\n")
80 call setline(1, 'abc')
81 call cursor(1, 1)
82 call feedkeys("ix\<esc>", 'tnix')
83 call assert_equal(['abc', ''], getline(1, '$'))
84 %d
85 au! InsertCharPre
86 " Change cursor position in InsertEnter command
87 " 1) when setting v:char, keeps changed cursor position
88 au! InsertEnter <buffer> :call DoIt('y')
89 call setline(1, 'abc')
90 call cursor(1, 1)
91 call feedkeys("ix\<esc>", 'tnix')
92 call assert_equal(['abxc'], getline(1, '$'))
93 " 2) when not setting v:char, restores changed cursor position
94 au! InsertEnter <buffer> :call DoIt()
95 call setline(1, 'abc')
96 call cursor(1, 1)
97 call feedkeys("ix\<esc>", 'tnix')
98 call assert_equal(['xabc'], getline(1, '$'))
99 au! InsertEnter
100 delfu DoIt
101 bw!
102endfunc
103
Bram Moolenaar1e115362019-01-09 23:01:02 +0100104func Test_edit_03()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100105 " Change cursor after <c-o> command to end of line
106 new
107 call setline(1, 'abc')
108 call cursor(1, 1)
109 call feedkeys("i\<c-o>$y\<esc>", 'tnix')
110 call assert_equal(['abcy'], getline(1, '$'))
111 %d
112 call setline(1, 'abc')
113 call cursor(1, 1)
114 call feedkeys("i\<c-o>80|y\<esc>", 'tnix')
115 call assert_equal(['abcy'], getline(1, '$'))
116 %d
117 call setline(1, 'abc')
118 call feedkeys("Ad\<c-o>:s/$/efg/\<cr>hij", 'tnix')
119 call assert_equal(['hijabcdefg'], getline(1, '$'))
120 bw!
121endfunc
122
Bram Moolenaar1e115362019-01-09 23:01:02 +0100123func Test_edit_04()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100124 " test for :stopinsert
125 new
126 call setline(1, 'abc')
127 call cursor(1, 1)
128 call feedkeys("i\<c-o>:stopinsert\<cr>$", 'tnix')
129 call feedkeys("aX\<esc>", 'tnix')
130 call assert_equal(['abcX'], getline(1, '$'))
131 %d
132 bw!
133endfunc
134
Bram Moolenaar1e115362019-01-09 23:01:02 +0100135func Test_edit_05()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100136 " test for folds being opened
137 new
138 call setline(1, ['abcX', 'abcX', 'zzzZ'])
139 call cursor(1, 1)
140 set foldmethod=manual foldopen+=insert
141 " create fold for those two lines
142 norm! Vjzf
143 call feedkeys("$ay\<esc>", 'tnix')
144 call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$'))
145 %d
146 call setline(1, ['abcX', 'abcX', 'zzzZ'])
147 call cursor(1, 1)
148 set foldmethod=manual foldopen-=insert
149 " create fold for those two lines
150 norm! Vjzf
151 call feedkeys("$ay\<esc>", 'tnix')
152 call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$'))
153 %d
154 bw!
155endfunc
156
Bram Moolenaar1e115362019-01-09 23:01:02 +0100157func Test_edit_06()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100158 " Test in diff mode
159 if !has("diff") || !executable("diff")
160 return
161 endif
162 new
163 call setline(1, ['abc', 'xxx', 'yyy'])
164 vnew
165 call setline(1, ['abc', 'zzz', 'xxx', 'yyy'])
166 wincmd p
167 diffthis
168 wincmd p
169 diffthis
170 wincmd p
171 call cursor(2, 1)
172 norm! zt
173 call feedkeys("Ozzz\<esc>", 'tnix')
174 call assert_equal(['abc', 'zzz', 'xxx', 'yyy'], getline(1,'$'))
175 bw!
176 bw!
177endfunc
178
Bram Moolenaar1e115362019-01-09 23:01:02 +0100179func Test_edit_07()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100180 " 1) Test with completion <c-l> when popupmenu is visible
181 new
182 call setline(1, 'J')
183
184 func! ListMonths()
185 call complete(col('.')-1, ['January', 'February', 'March',
186 \ 'April', 'May', 'June', 'July', 'August', 'September',
187 \ 'October', 'November', 'December'])
188 return ''
189 endfunc
190 inoremap <buffer> <F5> <C-R>=ListMonths()<CR>
191
192 call feedkeys("A\<f5>\<c-p>". repeat("\<down>", 6)."\<c-l>\<down>\<c-l>\<cr>", 'tx')
193 call assert_equal(['July'], getline(1,'$'))
194 " 1) Test completion when InsertCharPre kicks in
195 %d
196 call setline(1, 'J')
197 fu! DoIt()
198 if v:char=='u'
199 let v:char='an'
200 endif
201 endfu
202 au InsertCharPre <buffer> :call DoIt()
203 call feedkeys("A\<f5>\<c-p>u\<cr>\<c-l>\<cr>", 'tx')
Bram Moolenaar4c313b12019-08-24 22:58:31 +0200204 call assert_equal(["Jan\<c-l>",''], 1->getline('$'))
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100205 %d
206 call setline(1, 'J')
207 call feedkeys("A\<f5>\<c-p>u\<down>\<c-l>\<cr>", 'tx')
Bram Moolenaar4c313b12019-08-24 22:58:31 +0200208 call assert_equal(["January"], 1->getline('$'))
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100209
210 delfu ListMonths
211 delfu DoIt
212 iunmap <buffer> <f5>
213 bw!
214endfunc
215
Bram Moolenaar1e115362019-01-09 23:01:02 +0100216func Test_edit_08()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100217 " reset insertmode from i_ctrl-r_=
Bram Moolenaar2a45d642017-10-27 01:35:00 +0200218 let g:bufnr = bufnr('%')
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100219 new
220 call setline(1, ['abc'])
221 call cursor(1, 4)
Bram Moolenaar2a45d642017-10-27 01:35:00 +0200222 call feedkeys(":set im\<cr>ZZZ\<c-r>=setbufvar(g:bufnr,'&im', 0)\<cr>",'tnix')
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100223 call assert_equal(['abZZZc'], getline(1,'$'))
224 call assert_equal([0, 1, 1, 0], getpos('.'))
225 call assert_false(0, '&im')
226 bw!
Bram Moolenaar2a45d642017-10-27 01:35:00 +0200227 unlet g:bufnr
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100228endfunc
229
Bram Moolenaar1e115362019-01-09 23:01:02 +0100230func Test_edit_09()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100231 " test i_CTRL-\ combinations
232 new
233 call setline(1, ['abc', 'def', 'ghi'])
234 call cursor(1, 1)
235 " 1) CTRL-\ CTLR-N
236 call feedkeys(":set im\<cr>\<c-\>\<c-n>ccABC\<c-l>", 'txin')
237 call assert_equal(['ABC', 'def', 'ghi'], getline(1,'$'))
238 call setline(1, ['ABC', 'def', 'ghi'])
239 " 2) CTRL-\ CTLR-G
240 call feedkeys("j0\<c-\>\<c-g>ZZZ\<cr>\<c-l>", 'txin')
241 call assert_equal(['ABC', 'ZZZ', 'def', 'ghi'], getline(1,'$'))
242 call feedkeys("I\<c-\>\<c-g>YYY\<c-l>", 'txin')
243 call assert_equal(['ABC', 'ZZZ', 'YYYdef', 'ghi'], getline(1,'$'))
244 set noinsertmode
245 " 3) CTRL-\ CTRL-O
246 call setline(1, ['ABC', 'ZZZ', 'def', 'ghi'])
247 call cursor(1, 1)
248 call feedkeys("A\<c-o>ix", 'txin')
249 call assert_equal(['ABxC', 'ZZZ', 'def', 'ghi'], getline(1,'$'))
250 call feedkeys("A\<c-\>\<c-o>ix", 'txin')
251 call assert_equal(['ABxCx', 'ZZZ', 'def', 'ghi'], getline(1,'$'))
252 " 4) CTRL-\ a (should be inserted literally, not special after <c-\>
253 call setline(1, ['ABC', 'ZZZ', 'def', 'ghi'])
254 call cursor(1, 1)
255 call feedkeys("A\<c-\>a", 'txin')
256 call assert_equal(["ABC\<c-\>a", 'ZZZ', 'def', 'ghi'], getline(1, '$'))
257 bw!
258endfunc
259
Bram Moolenaar1e115362019-01-09 23:01:02 +0100260func Test_edit_10()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100261 " Test for starting selectmode
262 new
263 set selectmode=key keymodel=startsel
264 call setline(1, ['abc', 'def', 'ghi'])
265 call cursor(1, 4)
266 call feedkeys("A\<s-home>start\<esc>", 'txin')
267 call assert_equal(['startdef', 'ghi'], getline(1, '$'))
Bram Moolenaarf5f1e102020-03-08 05:13:15 +0100268 " start select mode again with gv
269 set selectmode=cmd
270 call feedkeys('gvabc', 'xt')
271 call assert_equal('abctdef', getline(1))
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100272 set selectmode= keymodel=
273 bw!
274endfunc
275
Bram Moolenaar1e115362019-01-09 23:01:02 +0100276func Test_edit_11()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100277 " Test that indenting kicks in
278 new
279 set cindent
280 call setline(1, ['{', '', ''])
281 call cursor(2, 1)
282 call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
283 call cursor(3, 1)
284 call feedkeys("i/* comment */", 'tnix')
285 call assert_equal(['{', "\<tab>int c;", "/* comment */"], getline(1, '$'))
286 " added changed cindentkeys slightly
287 set cindent cinkeys+=*/
288 call setline(1, ['{', '', ''])
289 call cursor(2, 1)
290 call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
291 call cursor(3, 1)
292 call feedkeys("i/* comment */", 'tnix')
293 call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */"], getline(1, '$'))
294 set cindent cinkeys+==end
295 call feedkeys("oend\<cr>\<esc>", 'tnix')
296 call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */", "\tend", ''], getline(1, '$'))
297 set cinkeys-==end
298 %d
299 " Use indentexpr instead of cindenting
300 func! Do_Indent()
301 if v:lnum == 3
302 return 3*shiftwidth()
303 else
304 return 2*shiftwidth()
305 endif
306 endfunc
307 setl indentexpr=Do_Indent() indentkeys+=*/
308 call setline(1, ['{', '', ''])
309 call cursor(2, 1)
310 call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
311 call cursor(3, 1)
312 call feedkeys("i/* comment */", 'tnix')
313 call assert_equal(['{', "\<tab>\<tab>int c;", "\<tab>\<tab>\<tab>/* comment */"], getline(1, '$'))
314 set cinkeys&vim indentkeys&vim
315 set nocindent indentexpr=
316 delfu Do_Indent
317 bw!
318endfunc
319
Bram Moolenaar1e115362019-01-09 23:01:02 +0100320func Test_edit_11_indentexpr()
Bram Moolenaar1b383442017-09-26 20:04:54 +0200321 " Test that indenting kicks in
322 new
323 " Use indentexpr instead of cindenting
324 func! Do_Indent()
325 let pline=prevnonblank(v:lnum)
326 if empty(getline(v:lnum))
327 if getline(pline) =~ 'if\|then'
328 return shiftwidth()
329 else
330 return 0
331 endif
332 else
333 return 0
334 endif
335 endfunc
336 setl indentexpr=Do_Indent() indentkeys+=0=then,0=fi
337 call setline(1, ['if [ $this ]'])
338 call cursor(1, 1)
339 call feedkeys("othen\<cr>that\<cr>fi", 'tnix')
340 call assert_equal(['if [ $this ]', "then", "\<tab>that", "fi"], getline(1, '$'))
341 set cinkeys&vim indentkeys&vim
342 set nocindent indentexpr=
343 delfu Do_Indent
344 bw!
345endfunc
346
Bram Moolenaar1e115362019-01-09 23:01:02 +0100347func Test_edit_12()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100348 " Test changing indent in replace mode
349 new
350 call setline(1, ["\tabc", "\tdef"])
351 call cursor(2, 4)
352 call feedkeys("R^\<c-d>", 'tnix')
353 call assert_equal(["\tabc", "def"], getline(1, '$'))
Bram Moolenaar4c313b12019-08-24 22:58:31 +0200354 call assert_equal([0, 2, 2, 0], '.'->getpos())
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100355 %d
356 call setline(1, ["\tabc", "\t\tdef"])
357 call cursor(2, 2)
358 call feedkeys("R^\<c-d>", 'tnix')
359 call assert_equal(["\tabc", "def"], getline(1, '$'))
360 call assert_equal([0, 2, 1, 0], getpos('.'))
361 %d
362 call setline(1, ["\tabc", "\t\tdef"])
363 call cursor(2, 2)
364 call feedkeys("R\<c-t>", 'tnix')
365 call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
366 call assert_equal([0, 2, 2, 0], getpos('.'))
367 bw!
368 10vnew
369 call setline(1, ["\tabc", "\t\tdef"])
370 call cursor(2, 2)
371 call feedkeys("R\<c-t>", 'tnix')
372 call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
373 call assert_equal([0, 2, 2, 0], getpos('.'))
374 %d
375 set sw=4
376 call setline(1, ["\tabc", "\t\tdef"])
377 call cursor(2, 2)
378 call feedkeys("R\<c-t>\<c-t>", 'tnix')
379 call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
380 call assert_equal([0, 2, 2, 0], getpos('.'))
381 %d
382 call setline(1, ["\tabc", "\t\tdef"])
383 call cursor(2, 2)
384 call feedkeys("R\<c-t>\<c-t>", 'tnix')
385 call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
386 call assert_equal([0, 2, 2, 0], getpos('.'))
387 set et
388 set sw& et&
389 %d
390 call setline(1, ["\t/*"])
391 set formatoptions=croql
392 call cursor(1, 3)
393 call feedkeys("A\<cr>\<cr>/", 'tnix')
394 call assert_equal(["\t/*", " *", " */"], getline(1, '$'))
395 set formatoptions&
396 bw!
397endfunc
398
Bram Moolenaar1e115362019-01-09 23:01:02 +0100399func Test_edit_13()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100400 " Test smartindenting
401 if exists("+smartindent")
402 new
403 set smartindent autoindent
404 call setline(1, ["\tabc"])
405 call feedkeys("A {\<cr>more\<cr>}\<esc>", 'tnix')
406 call assert_equal(["\tabc {", "\t\tmore", "\t}"], getline(1, '$'))
407 set smartindent& autoindent&
Bram Moolenaar2ba42382019-03-16 18:11:07 +0100408 bwipe!
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100409 endif
Bram Moolenaar2ba42382019-03-16 18:11:07 +0100410
411 " Test autoindent removing indent of blank line.
412 new
413 call setline(1, ' foo bar baz')
414 set autoindent
415 exe "normal 0eea\<CR>\<CR>\<Esc>"
416 call assert_equal(" foo bar", getline(1))
417 call assert_equal("", getline(2))
418 call assert_equal(" baz", getline(3))
419 set autoindent&
420 bwipe!
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100421endfunc
422
Bram Moolenaar1e115362019-01-09 23:01:02 +0100423func Test_edit_CR()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100424 " Test for <CR> in insert mode
425 " basically only in quickfix mode ist tested, the rest
426 " has been taken care of by other tests
427 if !has("quickfix")
428 return
429 endif
430 botright new
431 call writefile(range(1, 10), 'Xqflist.txt')
432 call setqflist([{'filename': 'Xqflist.txt', 'lnum': 2}])
433 copen
434 set modifiable
435 call feedkeys("A\<cr>", 'tnix')
436 call assert_equal('Xqflist.txt', bufname(''))
437 call assert_equal(2, line('.'))
438 cclose
439 botright new
440 call setloclist(0, [{'filename': 'Xqflist.txt', 'lnum': 10}])
441 lopen
442 set modifiable
443 call feedkeys("A\<cr>", 'tnix')
444 call assert_equal('Xqflist.txt', bufname(''))
445 call assert_equal(10, line('.'))
446 call feedkeys("A\<Enter>", 'tnix')
447 call feedkeys("A\<kEnter>", 'tnix')
448 call feedkeys("A\n", 'tnix')
449 call feedkeys("A\r", 'tnix')
450 call assert_equal(map(range(1, 10), 'string(v:val)') + ['', '', '', ''], getline(1, '$'))
451 bw!
452 lclose
453 call delete('Xqflist.txt')
454endfunc
455
Bram Moolenaar1e115362019-01-09 23:01:02 +0100456func Test_edit_CTRL_()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100457 " disabled for Windows builds, why?
Bram Moolenaar30276f22019-01-24 17:59:39 +0100458 if !has("rightleft") || has("win32")
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100459 return
460 endif
461 let _encoding=&encoding
462 set encoding=utf-8
463 " Test for CTRL-_
464 new
465 call setline(1, ['abc'])
466 call cursor(1, 1)
467 call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
468 call assert_equal(["\<C-_>xyzabc"], getline(1, '$'))
469 call assert_false(&revins)
470 set ari
471 call setline(1, ['abc'])
472 call cursor(1, 1)
473 call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
474 call assert_equal(["æèñabc"], getline(1, '$'))
475 call assert_true(&revins)
476 call setline(1, ['abc'])
477 call cursor(1, 1)
478 call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
479 call assert_equal(["xyzabc"], getline(1, '$'))
480 call assert_false(&revins)
481 set noari
482 let &encoding=_encoding
483 bw!
484endfunc
485
486" needs to come first, to have the @. register empty
Bram Moolenaar1e115362019-01-09 23:01:02 +0100487func Test_edit_00a_CTRL_A()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100488 " Test pressing CTRL-A
489 new
490 call setline(1, repeat([''], 5))
491 call cursor(1, 1)
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100492 try
493 call feedkeys("A\<NUL>", 'tnix')
494 catch /^Vim\%((\a\+)\)\=:E29/
495 call assert_true(1, 'E29 error caught')
496 endtry
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100497 call cursor(1, 1)
498 call feedkeys("Afoobar \<esc>", 'tnix')
499 call cursor(2, 1)
500 call feedkeys("A\<c-a>more\<esc>", 'tnix')
501 call cursor(3, 1)
502 call feedkeys("A\<NUL>and more\<esc>", 'tnix')
503 call assert_equal(['foobar ', 'foobar more', 'foobar morend more', '', ''], getline(1, '$'))
504 bw!
505endfunc
506
Bram Moolenaar1e115362019-01-09 23:01:02 +0100507func Test_edit_CTRL_EY()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100508 " Ctrl-E/ Ctrl-Y in insert mode completion to scroll
509 10new
510 call setline(1, range(1, 100))
511 call cursor(30, 1)
512 norm! z.
513 call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix')
514 call assert_equal(30, winsaveview()['topline'])
515 call assert_equal([0, 30, 2, 0], getpos('.'))
516 call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix')
517 call feedkeys("A\<c-x>".repeat("\<c-y>", 10), 'tnix')
518 call assert_equal(21, winsaveview()['topline'])
519 call assert_equal([0, 30, 2, 0], getpos('.'))
520 bw!
521endfunc
522
Bram Moolenaar1e115362019-01-09 23:01:02 +0100523func Test_edit_CTRL_G()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100524 new
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100525 call setline(1, ['foobar', 'foobar', 'foobar'])
526 call cursor(2, 4)
527 call feedkeys("ioooooooo\<c-g>k\<c-r>.\<esc>", 'tnix')
528 call assert_equal(['foooooooooobar', 'foooooooooobar', 'foobar'], getline(1, '$'))
529 call assert_equal([0, 1, 11, 0], getpos('.'))
530 call feedkeys("i\<c-g>k\<esc>", 'tnix')
531 call assert_equal([0, 1, 10, 0], getpos('.'))
532 call cursor(2, 4)
533 call feedkeys("i\<c-g>jzzzz\<esc>", 'tnix')
534 call assert_equal(['foooooooooobar', 'foooooooooobar', 'foozzzzbar'], getline(1, '$'))
535 call assert_equal([0, 3, 7, 0], getpos('.'))
536 call feedkeys("i\<c-g>j\<esc>", 'tnix')
537 call assert_equal([0, 3, 6, 0], getpos('.'))
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100538 bw!
539endfunc
540
Bram Moolenaar1e115362019-01-09 23:01:02 +0100541func Test_edit_CTRL_I()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100542 " Tab in completion mode
543 let path=expand("%:p:h")
544 new
Bram Moolenaarca851592018-06-06 21:04:07 +0200545 call setline(1, [path. "/", ''])
Bram Moolenaarc5379472017-03-16 22:38:00 +0100546 call feedkeys("Arunt\<c-x>\<c-f>\<tab>\<cr>\<esc>", 'tnix')
547 call assert_match('runtest\.vim', getline(1))
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100548 %d
549 call writefile(['one', 'two', 'three'], 'Xinclude.txt')
550 let include='#include Xinclude.txt'
551 call setline(1, [include, ''])
552 call cursor(2, 1)
553 call feedkeys("A\<c-x>\<tab>\<cr>\<esc>", 'tnix')
554 call assert_equal([include, 'one', ''], getline(1, '$'))
555 call feedkeys("2ggC\<c-x>\<tab>\<down>\<cr>\<esc>", 'tnix')
556 call assert_equal([include, 'two', ''], getline(1, '$'))
557 call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<cr>\<esc>", 'tnix')
558 call assert_equal([include, 'three', ''], getline(1, '$'))
559 call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
560 call assert_equal([include, '', ''], getline(1, '$'))
561 call delete("Xinclude.txt")
562 bw!
563endfunc
564
Bram Moolenaar1e115362019-01-09 23:01:02 +0100565func Test_edit_CTRL_K()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100566 " Test pressing CTRL-K (basically only dictionary completion and digraphs
567 " the rest is already covered
568 call writefile(['A', 'AA', 'AAA', 'AAAA'], 'Xdictionary.txt')
569 set dictionary=Xdictionary.txt
570 new
571 call setline(1, 'A')
572 call cursor(1, 1)
573 call feedkeys("A\<c-x>\<c-k>\<cr>\<esc>", 'tnix')
574 call assert_equal(['AA', ''], getline(1, '$'))
575 %d
576 call setline(1, 'A')
577 call cursor(1, 1)
578 call feedkeys("A\<c-x>\<c-k>\<down>\<cr>\<esc>", 'tnix')
579 call assert_equal(['AAA'], getline(1, '$'))
580 %d
581 call setline(1, 'A')
582 call cursor(1, 1)
583 call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<cr>\<esc>", 'tnix')
584 call assert_equal(['AAAA'], getline(1, '$'))
585 %d
586 call setline(1, 'A')
587 call cursor(1, 1)
588 call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
589 call assert_equal(['A'], getline(1, '$'))
590 %d
591 call setline(1, 'A')
592 call cursor(1, 1)
593 call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
594 call assert_equal(['AA'], getline(1, '$'))
595
Bram Moolenaar4b96df52020-01-26 22:00:26 +0100596 " press an unexpected key after dictionary completion
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100597 %d
598 call setline(1, 'A')
599 call cursor(1, 1)
600 call feedkeys("A\<c-x>\<c-k>\<c-]>\<cr>\<esc>", 'tnix')
601 call assert_equal(['AA', ''], getline(1, '$'))
602 %d
603 call setline(1, 'A')
604 call cursor(1, 1)
605 call feedkeys("A\<c-x>\<c-k>\<c-s>\<cr>\<esc>", 'tnix')
606 call assert_equal(["AA\<c-s>", ''], getline(1, '$'))
607 %d
608 call setline(1, 'A')
609 call cursor(1, 1)
610 call feedkeys("A\<c-x>\<c-k>\<c-f>\<cr>\<esc>", 'tnix')
611 call assert_equal(["AA\<c-f>", ''], getline(1, '$'))
612
613 set dictionary=
614 %d
615 call setline(1, 'A')
616 call cursor(1, 1)
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100617 let v:testing = 1
618 try
619 call feedkeys("A\<c-x>\<c-k>\<esc>", 'tnix')
620 catch
621 " error sleeps 2 seconds, when v:testing is not set
622 let v:testing = 0
623 endtry
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100624 call delete('Xdictionary.txt')
625
Bram Moolenaar30276f22019-01-24 17:59:39 +0100626 call test_override("char_avail", 1)
627 set showcmd
628 %d
629 call feedkeys("A\<c-k>a:\<esc>", 'tnix')
630 call assert_equal(['ä'], getline(1, '$'))
631 call test_override("char_avail", 0)
632 set noshowcmd
633
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100634 bw!
635endfunc
636
Bram Moolenaar1e115362019-01-09 23:01:02 +0100637func Test_edit_CTRL_L()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100638 " Test Ctrl-X Ctrl-L (line completion)
639 new
640 set complete=.
641 call setline(1, ['one', 'two', 'three', '', '', '', ''])
642 call cursor(4, 1)
643 call feedkeys("A\<c-x>\<c-l>\<esc>", 'tnix')
644 call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
645 call feedkeys("cct\<c-x>\<c-l>\<c-n>\<esc>", 'tnix')
646 call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
647 call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<esc>", 'tnix')
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100648 call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$'))
Bram Moolenaar02ae9b42018-02-09 15:06:02 +0100649 call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100650 call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
Bram Moolenaar02ae9b42018-02-09 15:06:02 +0100651 call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
652 call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100653 call feedkeys("cct\<c-x>\<c-l>\<c-p>\<esc>", 'tnix')
654 call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$'))
655 call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<esc>", 'tnix')
656 call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
657 call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<c-p>\<esc>", 'tnix')
658 call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
659 set complete=
660 call cursor(5, 1)
661 call feedkeys("A\<c-x>\<c-l>\<c-p>\<c-n>\<esc>", 'tnix')
662 call assert_equal(['one', 'two', 'three', 'three', "\<c-l>\<c-p>\<c-n>", '', ''], getline(1, '$'))
663 set complete&
664 %d
665 if has("conceal") && has("syntax")
666 call setline(1, ['foo', 'bar', 'foobar'])
667 call test_override("char_avail", 1)
668 set conceallevel=2 concealcursor=n
669 syn on
670 syn match ErrorMsg "^bar"
671 call matchadd("Conceal", 'oo', 10, -1, {'conceal': 'X'})
672 func! DoIt()
673 let g:change=1
674 endfunc
675 au! TextChangedI <buffer> :call DoIt()
676
677 call cursor(2, 1)
678 call assert_false(exists("g:change"))
679 call feedkeys("A \<esc>", 'tnix')
680 call assert_equal(['foo', 'bar ', 'foobar'], getline(1, '$'))
681 call assert_equal(1, g:change)
682
683 call test_override("char_avail", 0)
684 call clearmatches()
685 syn off
686 au! TextChangedI
687 delfu DoIt
688 unlet! g:change
689 endif
690 bw!
691endfunc
692
Bram Moolenaar1e115362019-01-09 23:01:02 +0100693func Test_edit_CTRL_N()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100694 " Check keyword completion
695 new
696 set complete=.
697 call setline(1, ['INFER', 'loWER', '', '', ])
698 call cursor(3, 1)
699 call feedkeys("Ai\<c-n>\<cr>\<esc>", "tnix")
700 call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix')
701 call assert_equal(['INFER', 'loWER', 'i', 'LO', '', ''], getline(1, '$'))
702 %d
703 call setline(1, ['INFER', 'loWER', '', '', ])
704 call cursor(3, 1)
705 set ignorecase infercase
706 call feedkeys("Ii\<c-n>\<cr>\<esc>", "tnix")
707 call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix')
708 call assert_equal(['INFER', 'loWER', 'infer', 'LOWER', '', ''], getline(1, '$'))
709
710 set noignorecase noinfercase complete&
711 bw!
712endfunc
713
Bram Moolenaar1e115362019-01-09 23:01:02 +0100714func Test_edit_CTRL_O()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100715 " Check for CTRL-O in insert mode
716 new
717 inoreabbr <buffer> h here some more
718 call setline(1, ['abc', 'def'])
719 call cursor(1, 1)
720 " Ctrl-O after an abbreviation
721 exe "norm A h\<c-o>:set nu\<cr> text"
722 call assert_equal(['abc here some more text', 'def'], getline(1, '$'))
723 call assert_true(&nu)
724 set nonu
725 iunabbr <buffer> h
726 " Ctrl-O at end of line with 've'=onemore
727 call cursor(1, 1)
728 call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix')
729 call assert_equal([0, 1, 23, 0], g:a)
730 call cursor(1, 1)
731 set ve=onemore
732 call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix')
733 call assert_equal([0, 1, 24, 0], g:a)
734 set ve=
735 unlet! g:a
736 bw!
737endfunc
738
Bram Moolenaar1e115362019-01-09 23:01:02 +0100739func Test_edit_CTRL_R()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100740 " Insert Register
741 new
742 call test_override("ALL", 1)
743 set showcmd
744 call feedkeys("AFOOBAR eins zwei\<esc>", 'tnix')
745 call feedkeys("O\<c-r>.", 'tnix')
746 call feedkeys("O\<c-r>=10*500\<cr>\<esc>", 'tnix')
747 call feedkeys("O\<c-r>=getreg('=', 1)\<cr>\<esc>", 'tnix')
748 call assert_equal(["getreg('=', 1)", '5000', "FOOBAR eins zwei", "FOOBAR eins zwei"], getline(1, '$'))
749 call test_override("ALL", 0)
750 set noshowcmd
751 bw!
752endfunc
753
Bram Moolenaar1e115362019-01-09 23:01:02 +0100754func Test_edit_CTRL_S()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100755 " Test pressing CTRL-S (basically only spellfile completion)
756 " the rest is already covered
757 new
758 if !has("spell")
759 call setline(1, 'vim')
760 call feedkeys("A\<c-x>ss\<cr>\<esc>", 'tnix')
761 call assert_equal(['vims', ''], getline(1, '$'))
762 bw!
763 return
764 endif
765 call setline(1, 'vim')
766 " spell option not yet set
767 try
768 call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix')
769 catch /^Vim\%((\a\+)\)\=:E756/
770 call assert_true(1, 'error caught')
771 endtry
772 call assert_equal(['vim', ''], getline(1, '$'))
773 %d
774 setl spell spelllang=en
775 call setline(1, 'vim')
776 call cursor(1, 1)
777 call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix')
778 call assert_equal(['Vim', ''], getline(1, '$'))
779 %d
780 call setline(1, 'vim')
781 call cursor(1, 1)
782 call feedkeys("A\<c-x>\<c-s>\<down>\<cr>\<esc>", 'tnix')
783 call assert_equal(['Aim'], getline(1, '$'))
784 %d
785 call setline(1, 'vim')
786 call cursor(1, 1)
787 call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix')
788 call assert_equal(['vim', ''], getline(1, '$'))
789 %d
790 " empty buffer
791 call cursor(1, 1)
792 call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix')
793 call assert_equal(['', ''], getline(1, '$'))
794 setl nospell
795 bw!
796endfunc
797
Bram Moolenaar1e115362019-01-09 23:01:02 +0100798func Test_edit_CTRL_T()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100799 " Check for CTRL-T and CTRL-X CTRL-T in insert mode
800 " 1) increase indent
801 new
802 call setline(1, "abc")
803 call cursor(1, 1)
804 call feedkeys("A\<c-t>xyz", 'tnix')
805 call assert_equal(["\<tab>abcxyz"], getline(1, '$'))
806 " 2) also when paste option is set
807 set paste
808 call setline(1, "abc")
809 call cursor(1, 1)
810 call feedkeys("A\<c-t>xyz", 'tnix')
811 call assert_equal(["\<tab>abcxyz"], getline(1, '$'))
812 set nopaste
813 " CTRL-X CTRL-T (thesaurus complete)
814 call writefile(['angry furious mad enraged'], 'Xthesaurus')
815 set thesaurus=Xthesaurus
816 call setline(1, 'mad')
817 call cursor(1, 1)
818 call feedkeys("A\<c-x>\<c-t>\<cr>\<esc>", 'tnix')
819 call assert_equal(['mad', ''], getline(1, '$'))
820 %d
821 call setline(1, 'mad')
822 call cursor(1, 1)
823 call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix')
824 call assert_equal(['angry', ''], getline(1, '$'))
825 %d
826 call setline(1, 'mad')
827 call cursor(1, 1)
828 call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
829 call assert_equal(['furious', ''], getline(1, '$'))
830 %d
831 call setline(1, 'mad')
832 call cursor(1, 1)
833 call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
834 call assert_equal(['enraged', ''], getline(1, '$'))
835 %d
836 call setline(1, 'mad')
837 call cursor(1, 1)
838 call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
839 call assert_equal(['mad', ''], getline(1, '$'))
840 %d
841 call setline(1, 'mad')
842 call cursor(1, 1)
843 call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
844 call assert_equal(['mad', ''], getline(1, '$'))
845 " Using <c-p> <c-n> when 'complete' is empty
846 set complete=
847 %d
848 call setline(1, 'mad')
849 call cursor(1, 1)
850 call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix')
851 call assert_equal(['angry', ''], getline(1, '$'))
852 %d
853 call setline(1, 'mad')
854 call cursor(1, 1)
855 call feedkeys("A\<c-x>\<c-t>\<c-p>\<cr>\<esc>", 'tnix')
856 call assert_equal(['mad', ''], getline(1, '$'))
857 set complete&
858
859 set thesaurus=
860 %d
861 call setline(1, 'mad')
862 call cursor(1, 1)
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100863 let v:testing = 1
864 try
865 call feedkeys("A\<c-x>\<c-t>\<esc>", 'tnix')
866 catch
867 " error sleeps 2 seconds, when v:testing is not set
868 let v:testing = 0
869 endtry
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100870 call assert_equal(['mad'], getline(1, '$'))
871 call delete('Xthesaurus')
872 bw!
873endfunc
874
Bram Moolenaar1e115362019-01-09 23:01:02 +0100875func Test_edit_CTRL_U()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100876 " Test 'completefunc'
877 new
878 " -1, -2 and -3 are special return values
879 let g:special=0
880 fun! CompleteMonths(findstart, base)
881 if a:findstart
882 " locate the start of the word
883 return g:special
884 else
885 " find months matching with "a:base"
886 let res = []
887 for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
888 if m =~ '^\c'.a:base
889 call add(res, {'word': m, 'abbr': m.' Month', 'icase': 0})
890 endif
891 endfor
892 return {'words': res, 'refresh': 'always'}
893 endif
894 endfun
895 set completefunc=CompleteMonths
896 call setline(1, ['', ''])
897 call cursor(1, 1)
898 call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
899 call assert_equal(['X', '', ''], getline(1, '$'))
900 %d
901 let g:special=-1
902 call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
903 call assert_equal(['XJan', ''], getline(1, '$'))
904 %d
905 let g:special=-2
906 call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
907 call assert_equal(['X', ''], getline(1, '$'))
908 %d
909 let g:special=-3
910 call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
911 call assert_equal(['X', ''], getline(1, '$'))
912 %d
913 let g:special=0
914 call feedkeys("AM\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
915 call assert_equal(['Mar', ''], getline(1, '$'))
916 %d
917 call feedkeys("AM\<c-x>\<c-u>\<c-n>\<cr>\<esc>", 'tnix')
918 call assert_equal(['May', ''], getline(1, '$'))
919 %d
920 call feedkeys("AM\<c-x>\<c-u>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
921 call assert_equal(['M', ''], getline(1, '$'))
922 delfu CompleteMonths
923 %d
924 try
925 call feedkeys("A\<c-x>\<c-u>", 'tnix')
926 call assert_fails(1, 'unknown completion function')
927 catch /^Vim\%((\a\+)\)\=:E117/
928 call assert_true(1, 'E117 error caught')
929 endtry
930 set completefunc=
931 bw!
932endfunc
933
Bram Moolenaar1e115362019-01-09 23:01:02 +0100934func Test_edit_CTRL_Z()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100935 " Ctrl-Z when insertmode is not set inserts it literally
936 new
937 call setline(1, 'abc')
938 call feedkeys("A\<c-z>\<esc>", 'tnix')
939 call assert_equal(["abc\<c-z>"], getline(1,'$'))
940 bw!
941 " TODO: How to Test Ctrl-Z in insert mode, e.g. suspend?
942endfunc
943
Bram Moolenaar1e115362019-01-09 23:01:02 +0100944func Test_edit_DROP()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100945 if !has("dnd")
946 return
947 endif
948 new
949 call setline(1, ['abc def ghi'])
950 call cursor(1, 1)
951 try
952 call feedkeys("i\<Drop>\<Esc>", 'tnix')
953 call assert_fails(1, 'Invalid register name')
954 catch /^Vim\%((\a\+)\)\=:E353/
955 call assert_true(1, 'error caught')
956 endtry
957 bw!
958endfunc
959
Bram Moolenaar1e115362019-01-09 23:01:02 +0100960func Test_edit_CTRL_V()
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100961 if has("ebcdic")
962 return
963 endif
964 new
965 call setline(1, ['abc'])
966 call cursor(2, 1)
967 " force some redraws
968 set showmode showcmd
969 "call test_override_char_avail(1)
970 call test_override('ALL', 1)
971 call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix')
972 call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$'))
973
974 if has("rightleft") && exists("+rl")
975 set rl
976 call setline(1, ['abc'])
977 call cursor(2, 1)
978 call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix')
979 call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$'))
980 set norl
981 endif
982
983 call test_override('ALL', 0)
984 set noshowmode showcmd
985 bw!
986endfunc
987
Bram Moolenaar1e115362019-01-09 23:01:02 +0100988func Test_edit_F1()
Bram Moolenaar5a4c3082019-12-01 15:23:11 +0100989 CheckFeature quickfix
990
Bram Moolenaareb992cb2017-03-09 18:20:16 +0100991 " Pressing <f1>
992 new
993 call feedkeys(":set im\<cr>\<f1>\<c-l>", 'tnix')
994 set noinsertmode
995 call assert_equal('help', &buftype)
996 bw
997 bw
998endfunc
999
Bram Moolenaar1e115362019-01-09 23:01:02 +01001000func Test_edit_F21()
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001001 " Pressing <f21>
1002 " sends a netbeans command
1003 if has("netbeans_intg")
1004 new
1005 " I have no idea what this is supposed to do :)
1006 call feedkeys("A\<F21>\<F1>\<esc>", 'tnix')
1007 bw
1008 endif
1009endfunc
1010
Bram Moolenaar1e115362019-01-09 23:01:02 +01001011func Test_edit_HOME_END()
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001012 " Test Home/End Keys
1013 new
1014 set foldopen+=hor
1015 call setline(1, ['abc', 'def'])
1016 call cursor(1, 1)
1017 call feedkeys("AX\<Home>Y\<esc>", 'tnix')
1018 call cursor(2, 1)
1019 call feedkeys("iZ\<End>Y\<esc>", 'tnix')
1020 call assert_equal(['YabcX', 'ZdefY'], getline(1, '$'))
1021
1022 set foldopen-=hor
1023 bw!
1024endfunc
1025
Bram Moolenaar1e115362019-01-09 23:01:02 +01001026func Test_edit_INS()
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001027 " Test for Pressing <Insert>
1028 new
1029 call setline(1, ['abc', 'def'])
1030 call cursor(1, 1)
1031 call feedkeys("i\<Insert>ZYX>", 'tnix')
1032 call assert_equal(['ZYX>', 'def'], getline(1, '$'))
1033 call setline(1, ['abc', 'def'])
1034 call cursor(1, 1)
1035 call feedkeys("i\<Insert>Z\<Insert>YX>", 'tnix')
1036 call assert_equal(['ZYX>bc', 'def'], getline(1, '$'))
1037 bw!
1038endfunc
1039
Bram Moolenaar1e115362019-01-09 23:01:02 +01001040func Test_edit_LEFT_RIGHT()
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001041 " Left, Shift-Left, Right, Shift-Right
1042 new
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001043 call setline(1, ['abc def ghi', 'ABC DEF GHI', 'ZZZ YYY XXX'])
1044 let _ww=&ww
1045 set ww=
1046 call cursor(2, 1)
1047 call feedkeys("i\<left>\<esc>", 'tnix')
1048 call assert_equal([0, 2, 1, 0], getpos('.'))
1049 " Is this a bug, <s-left> does not respect whichwrap option
1050 call feedkeys("i\<s-left>\<esc>", 'tnix')
1051 call assert_equal([0, 1, 8, 0], getpos('.'))
1052 call feedkeys("i". repeat("\<s-left>", 3). "\<esc>", 'tnix')
1053 call assert_equal([0, 1, 1, 0], getpos('.'))
1054 call feedkeys("i\<right>\<esc>", 'tnix')
1055 call assert_equal([0, 1, 1, 0], getpos('.'))
1056 call feedkeys("i\<right>\<right>\<esc>", 'tnix')
1057 call assert_equal([0, 1, 2, 0], getpos('.'))
1058 call feedkeys("A\<right>\<esc>", 'tnix')
1059 call assert_equal([0, 1, 11, 0], getpos('.'))
1060 call feedkeys("A\<s-right>\<esc>", 'tnix')
1061 call assert_equal([0, 2, 1, 0], getpos('.'))
1062 call feedkeys("i\<s-right>\<esc>", 'tnix')
1063 call assert_equal([0, 2, 4, 0], getpos('.'))
1064 call cursor(3, 11)
1065 call feedkeys("A\<right>\<esc>", 'tnix')
1066 call feedkeys("A\<s-right>\<esc>", 'tnix')
1067 call assert_equal([0, 3, 11, 0], getpos('.'))
1068 call cursor(2, 11)
1069 " <S-Right> does not respect 'whichwrap' option
1070 call feedkeys("A\<s-right>\<esc>", 'tnix')
1071 call assert_equal([0, 3, 1, 0], getpos('.'))
1072 " Check motion when 'whichwrap' contains cursor keys for insert mode
1073 set ww+=[,]
1074 call cursor(2, 1)
1075 call feedkeys("i\<left>\<esc>", 'tnix')
1076 call assert_equal([0, 1, 11, 0], getpos('.'))
1077 call cursor(2, 11)
1078 call feedkeys("A\<right>\<esc>", 'tnix')
1079 call assert_equal([0, 3, 1, 0], getpos('.'))
1080 call cursor(2, 11)
1081 call feedkeys("A\<s-right>\<esc>", 'tnix')
1082 call assert_equal([0, 3, 1, 0], getpos('.'))
1083 let &ww = _ww
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001084 bw!
1085endfunc
1086
Bram Moolenaar1e115362019-01-09 23:01:02 +01001087func Test_edit_MOUSE()
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001088 " This is a simple test, since we not really using the mouse here
1089 if !has("mouse")
1090 return
1091 endif
1092 10new
1093 call setline(1, range(1, 100))
1094 call cursor(1, 1)
1095 set mouse=a
1096 call feedkeys("A\<ScrollWheelDown>\<esc>", 'tnix')
1097 call assert_equal([0, 4, 1, 0], getpos('.'))
1098 " This should move by one pageDown, but only moves
1099 " by one line when the test is run...
1100 call feedkeys("A\<S-ScrollWheelDown>\<esc>", 'tnix')
1101 call assert_equal([0, 5, 1, 0], getpos('.'))
1102 set nostartofline
1103 call feedkeys("A\<C-ScrollWheelDown>\<esc>", 'tnix')
1104 call assert_equal([0, 6, 1, 0], getpos('.'))
1105 call feedkeys("A\<LeftMouse>\<esc>", 'tnix')
1106 call assert_equal([0, 6, 1, 0], getpos('.'))
1107 call feedkeys("A\<RightMouse>\<esc>", 'tnix')
1108 call assert_equal([0, 6, 1, 0], getpos('.'))
1109 call cursor(1, 100)
1110 norm! zt
1111 " this should move by a screen up, but when the test
1112 " is run, it moves up to the top of the buffer...
1113 call feedkeys("A\<ScrollWheelUp>\<esc>", 'tnix')
1114 call assert_equal([0, 1, 1, 0], getpos('.'))
1115 call cursor(1, 30)
1116 norm! zt
1117 call feedkeys("A\<S-ScrollWheelUp>\<esc>", 'tnix')
1118 call assert_equal([0, 1, 1, 0], getpos('.'))
1119 call cursor(1, 30)
1120 norm! zt
1121 call feedkeys("A\<C-ScrollWheelUp>\<esc>", 'tnix')
1122 call assert_equal([0, 1, 1, 0], getpos('.'))
1123 %d
1124 call setline(1, repeat(["12345678901234567890"], 100))
1125 call cursor(2, 1)
1126 call feedkeys("A\<ScrollWheelRight>\<esc>", 'tnix')
1127 call assert_equal([0, 2, 20, 0], getpos('.'))
1128 call feedkeys("A\<ScrollWheelLeft>\<esc>", 'tnix')
1129 call assert_equal([0, 2, 20, 0], getpos('.'))
1130 call feedkeys("A\<S-ScrollWheelRight>\<esc>", 'tnix')
1131 call assert_equal([0, 2, 20, 0], getpos('.'))
1132 call feedkeys("A\<S-ScrollWheelLeft>\<esc>", 'tnix')
1133 call assert_equal([0, 2, 20, 0], getpos('.'))
1134 call feedkeys("A\<C-ScrollWheelRight>\<esc>", 'tnix')
1135 call assert_equal([0, 2, 20, 0], getpos('.'))
1136 call feedkeys("A\<C-ScrollWheelLeft>\<esc>", 'tnix')
1137 call assert_equal([0, 2, 20, 0], getpos('.'))
1138 set mouse& startofline
1139 bw!
1140endfunc
1141
Bram Moolenaar1e115362019-01-09 23:01:02 +01001142func Test_edit_PAGEUP_PAGEDOWN()
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001143 10new
1144 call setline(1, repeat(['abc def ghi'], 30))
1145 call cursor(1, 1)
1146 call feedkeys("i\<PageDown>\<esc>", 'tnix')
1147 call assert_equal([0, 9, 1, 0], getpos('.'))
1148 call feedkeys("i\<PageDown>\<esc>", 'tnix')
1149 call assert_equal([0, 17, 1, 0], getpos('.'))
1150 call feedkeys("i\<PageDown>\<esc>", 'tnix')
1151 call assert_equal([0, 25, 1, 0], getpos('.'))
1152 call feedkeys("i\<PageDown>\<esc>", 'tnix')
1153 call assert_equal([0, 30, 1, 0], getpos('.'))
1154 call feedkeys("i\<PageDown>\<esc>", 'tnix')
1155 call assert_equal([0, 30, 1, 0], getpos('.'))
1156 call feedkeys("A\<PageUp>\<esc>", 'tnix')
1157 call assert_equal([0, 29, 1, 0], getpos('.'))
1158 call feedkeys("A\<PageUp>\<esc>", 'tnix')
1159 call assert_equal([0, 21, 1, 0], getpos('.'))
1160 call feedkeys("A\<PageUp>\<esc>", 'tnix')
1161 call assert_equal([0, 13, 1, 0], getpos('.'))
1162 call feedkeys("A\<PageUp>\<esc>", 'tnix')
1163 call assert_equal([0, 5, 1, 0], getpos('.'))
1164 call feedkeys("A\<PageUp>\<esc>", 'tnix')
1165 call assert_equal([0, 5, 11, 0], getpos('.'))
1166 " <S-Up> is the same as <PageUp>
1167 " <S-Down> is the same as <PageDown>
1168 call cursor(1, 1)
1169 call feedkeys("i\<S-Down>\<esc>", 'tnix')
1170 call assert_equal([0, 9, 1, 0], getpos('.'))
1171 call feedkeys("i\<S-Down>\<esc>", 'tnix')
1172 call assert_equal([0, 17, 1, 0], getpos('.'))
1173 call feedkeys("i\<S-Down>\<esc>", 'tnix')
1174 call assert_equal([0, 25, 1, 0], getpos('.'))
1175 call feedkeys("i\<S-Down>\<esc>", 'tnix')
1176 call assert_equal([0, 30, 1, 0], getpos('.'))
1177 call feedkeys("i\<S-Down>\<esc>", 'tnix')
1178 call assert_equal([0, 30, 1, 0], getpos('.'))
1179 call feedkeys("A\<S-Up>\<esc>", 'tnix')
1180 call assert_equal([0, 29, 1, 0], getpos('.'))
1181 call feedkeys("A\<S-Up>\<esc>", 'tnix')
1182 call assert_equal([0, 21, 1, 0], getpos('.'))
1183 call feedkeys("A\<S-Up>\<esc>", 'tnix')
1184 call assert_equal([0, 13, 1, 0], getpos('.'))
1185 call feedkeys("A\<S-Up>\<esc>", 'tnix')
1186 call assert_equal([0, 5, 1, 0], getpos('.'))
1187 call feedkeys("A\<S-Up>\<esc>", 'tnix')
1188 call assert_equal([0, 5, 11, 0], getpos('.'))
1189 set nostartofline
1190 call cursor(30, 11)
1191 norm! zt
1192 call feedkeys("A\<PageUp>\<esc>", 'tnix')
1193 call assert_equal([0, 29, 11, 0], getpos('.'))
1194 call feedkeys("A\<PageUp>\<esc>", 'tnix')
1195 call assert_equal([0, 21, 11, 0], getpos('.'))
1196 call feedkeys("A\<PageUp>\<esc>", 'tnix')
1197 call assert_equal([0, 13, 11, 0], getpos('.'))
1198 call feedkeys("A\<PageUp>\<esc>", 'tnix')
1199 call assert_equal([0, 5, 11, 0], getpos('.'))
1200 call feedkeys("A\<PageUp>\<esc>", 'tnix')
1201 call assert_equal([0, 5, 11, 0], getpos('.'))
1202 call cursor(1, 1)
1203 call feedkeys("A\<PageDown>\<esc>", 'tnix')
1204 call assert_equal([0, 9, 11, 0], getpos('.'))
1205 call feedkeys("A\<PageDown>\<esc>", 'tnix')
1206 call assert_equal([0, 17, 11, 0], getpos('.'))
1207 call feedkeys("A\<PageDown>\<esc>", 'tnix')
1208 call assert_equal([0, 25, 11, 0], getpos('.'))
1209 call feedkeys("A\<PageDown>\<esc>", 'tnix')
1210 call assert_equal([0, 30, 11, 0], getpos('.'))
1211 call feedkeys("A\<PageDown>\<esc>", 'tnix')
1212 call assert_equal([0, 30, 11, 0], getpos('.'))
1213 " <S-Up> is the same as <PageUp>
1214 " <S-Down> is the same as <PageDown>
1215 call cursor(30, 11)
1216 norm! zt
1217 call feedkeys("A\<S-Up>\<esc>", 'tnix')
1218 call assert_equal([0, 29, 11, 0], getpos('.'))
1219 call feedkeys("A\<S-Up>\<esc>", 'tnix')
1220 call assert_equal([0, 21, 11, 0], getpos('.'))
1221 call feedkeys("A\<S-Up>\<esc>", 'tnix')
1222 call assert_equal([0, 13, 11, 0], getpos('.'))
1223 call feedkeys("A\<S-Up>\<esc>", 'tnix')
1224 call assert_equal([0, 5, 11, 0], getpos('.'))
1225 call feedkeys("A\<S-Up>\<esc>", 'tnix')
1226 call assert_equal([0, 5, 11, 0], getpos('.'))
1227 call cursor(1, 1)
1228 call feedkeys("A\<S-Down>\<esc>", 'tnix')
1229 call assert_equal([0, 9, 11, 0], getpos('.'))
1230 call feedkeys("A\<S-Down>\<esc>", 'tnix')
1231 call assert_equal([0, 17, 11, 0], getpos('.'))
1232 call feedkeys("A\<S-Down>\<esc>", 'tnix')
1233 call assert_equal([0, 25, 11, 0], getpos('.'))
1234 call feedkeys("A\<S-Down>\<esc>", 'tnix')
1235 call assert_equal([0, 30, 11, 0], getpos('.'))
1236 call feedkeys("A\<S-Down>\<esc>", 'tnix')
1237 call assert_equal([0, 30, 11, 0], getpos('.'))
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001238 bw!
1239endfunc
1240
Bram Moolenaar1e115362019-01-09 23:01:02 +01001241func Test_edit_forbidden()
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001242 new
1243 " 1) edit in the sandbox is not allowed
1244 call setline(1, 'a')
1245 com! Sandbox :sandbox call feedkeys("i\<del>\<esc>", 'tnix')
1246 call assert_fails(':Sandbox', 'E48:')
1247 com! Sandbox :sandbox exe "norm! i\<del>"
1248 call assert_fails(':Sandbox', 'E48:')
1249 delcom Sandbox
1250 call assert_equal(['a'], getline(1,'$'))
1251 " 2) edit with textlock set
1252 fu! DoIt()
1253 call feedkeys("i\<del>\<esc>", 'tnix')
1254 endfu
1255 au InsertCharPre <buffer> :call DoIt()
1256 try
1257 call feedkeys("ix\<esc>", 'tnix')
1258 call assert_fails(1, 'textlock')
1259 catch /^Vim\%((\a\+)\)\=:E523/ " catch E523: not allowed here
1260 endtry
1261 " TODO: Might be a bug: should x really be inserted here
1262 call assert_equal(['xa'], getline(1, '$'))
1263 delfu DoIt
1264 try
1265 call feedkeys("ix\<esc>", 'tnix')
1266 call assert_fails(1, 'unknown function')
1267 catch /^Vim\%((\a\+)\)\=:E117/ " catch E117: unknown function
1268 endtry
1269 au! InsertCharPre
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01001270 " Not allowed to enter ex mode when text is locked
1271 au InsertCharPre <buffer> :normal! gQ<CR>
1272 let caught_e523 = 0
1273 try
1274 call feedkeys("ix\<esc>", 'xt')
1275 catch /^Vim\%((\a\+)\)\=:E523/ " catch E523
1276 let caught_e523 = 1
1277 endtry
1278 call assert_equal(1, caught_e523)
1279 au! InsertCharPre
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001280 " 3) edit when completion is shown
1281 fun! Complete(findstart, base)
1282 if a:findstart
1283 return col('.')
1284 else
1285 call feedkeys("i\<del>\<esc>", 'tnix')
1286 return []
1287 endif
1288 endfun
1289 set completefunc=Complete
1290 try
1291 call feedkeys("i\<c-x>\<c-u>\<esc>", 'tnix')
1292 call assert_fails(1, 'change in complete function')
1293 catch /^Vim\%((\a\+)\)\=:E523/ " catch E523
1294 endtry
1295 delfu Complete
1296 set completefunc=
1297 if has("rightleft") && exists("+fkmap")
1298 " 4) 'R' when 'fkmap' and 'revins' is set.
1299 set revins fkmap
1300 try
1301 normal Ri
1302 call assert_fails(1, "R with 'fkmap' and 'ri' set")
1303 catch
1304 finally
1305 set norevins nofkmap
1306 endtry
1307 endif
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001308 bw!
1309endfunc
1310
Bram Moolenaar1e115362019-01-09 23:01:02 +01001311func Test_edit_rightleft()
Bram Moolenaareb992cb2017-03-09 18:20:16 +01001312 " Cursor in rightleft mode moves differently
1313 if !exists("+rightleft")
1314 return
1315 endif
1316 call NewWindow(10, 20)
1317 call setline(1, ['abc', 'def', 'ghi'])
1318 call cursor(1, 2)
1319 set rightleft
1320 " Screen looks as expected
1321 let lines = ScreenLines([1, 4], winwidth(0))
1322 let expect = [
1323 \" cba",
1324 \" fed",
1325 \" ihg",
1326 \" ~"]
1327 call assert_equal(join(expect, "\n"), join(lines, "\n"))
1328 " 2) right moves to the left
1329 call feedkeys("i\<right>\<esc>x", 'txin')
1330 call assert_equal(['bc', 'def', 'ghi'], getline(1,'$'))
1331 call cursor(1, 2)
1332 call feedkeys("i\<s-right>\<esc>", 'txin')
1333 call cursor(1, 2)
1334 call feedkeys("i\<c-right>\<esc>", 'txin')
1335 " Screen looks as expected
1336 let lines = ScreenLines([1, 4], winwidth(0))
1337 let expect = [
1338 \" cb",
1339 \" fed",
1340 \" ihg",
1341 \" ~"]
1342 call assert_equal(join(expect, "\n"), join(lines, "\n"))
1343 " 2) left moves to the right
1344 call setline(1, ['abc', 'def', 'ghi'])
1345 call cursor(1, 2)
1346 call feedkeys("i\<left>\<esc>x", 'txin')
1347 call assert_equal(['ac', 'def', 'ghi'], getline(1,'$'))
1348 call cursor(1, 2)
1349 call feedkeys("i\<s-left>\<esc>", 'txin')
1350 call cursor(1, 2)
1351 call feedkeys("i\<c-left>\<esc>", 'txin')
1352 " Screen looks as expected
1353 let lines = ScreenLines([1, 4], winwidth(0))
1354 let expect = [
1355 \" ca",
1356 \" fed",
1357 \" ihg",
1358 \" ~"]
1359 call assert_equal(join(expect, "\n"), join(lines, "\n"))
1360 set norightleft
1361 bw!
1362endfunc
Bram Moolenaar658a3a22017-03-31 22:27:12 +02001363
1364func Test_edit_complete_very_long_name()
Bram Moolenaar15ecbd62017-04-07 14:10:48 +02001365 if !has('unix')
Bram Moolenaar9b810792017-03-31 23:32:53 +02001366 " Long directory names only work on Unix.
1367 return
1368 endif
Bram Moolenaar15ecbd62017-04-07 14:10:48 +02001369
1370 let dirname = getcwd() . "/Xdir"
1371 let longdirname = dirname . repeat('/' . repeat('d', 255), 4)
1372 try
1373 call mkdir(longdirname, 'p')
1374 catch /E739:/
1375 " Long directory name probably not supported.
1376 call delete(dirname, 'rf')
1377 return
1378 endtry
1379
Bram Moolenaarf8191c52019-05-18 17:22:54 +02001380 " Try to get the Vim window position before setting 'columns', so that we can
1381 " move the window back to where it was.
Bram Moolenaarba6ec182017-04-04 22:41:10 +02001382 let winposx = getwinposx()
1383 let winposy = getwinposy()
Bram Moolenaarf8191c52019-05-18 17:22:54 +02001384
1385 if winposx >= 0 && winposy >= 0 && !has('gui_running')
1386 " We did get the window position, but xterm may report the wrong numbers.
1387 " Move the window to the reported position and compute any offset.
1388 exe 'winpos ' . winposx . ' ' . winposy
1389 sleep 100m
1390 let x = getwinposx()
1391 if x >= 0
1392 let winposx += winposx - x
1393 endif
1394 let y = getwinposy()
1395 if y >= 0
1396 let winposy += winposy - y
1397 endif
1398 endif
1399
Bram Moolenaar658a3a22017-03-31 22:27:12 +02001400 let save_columns = &columns
Bram Moolenaar15ecbd62017-04-07 14:10:48 +02001401 " Need at least about 1100 columns to reproduce the problem.
Bram Moolenaarba6ec182017-04-04 22:41:10 +02001402 set columns=2000
Bram Moolenaar658a3a22017-03-31 22:27:12 +02001403 set noswapfile
Bram Moolenaarba6ec182017-04-04 22:41:10 +02001404
Bram Moolenaar658a3a22017-03-31 22:27:12 +02001405 let longfilename = longdirname . '/' . repeat('a', 255)
Bram Moolenaar658a3a22017-03-31 22:27:12 +02001406 call writefile(['Totum', 'Table'], longfilename)
1407 new
1408 exe "next Xfile " . longfilename
1409 exe "normal iT\<C-N>"
1410
1411 bwipe!
1412 exe 'bwipe! ' . longfilename
1413 call delete(dirname, 'rf')
1414 let &columns = save_columns
Bram Moolenaarba6ec182017-04-04 22:41:10 +02001415 if winposx >= 0 && winposy >= 0
1416 exe 'winpos ' . winposx . ' ' . winposy
1417 endif
Bram Moolenaar658a3a22017-03-31 22:27:12 +02001418 set swapfile&
1419endfunc
Bram Moolenaarff930ca2017-10-19 17:12:10 +02001420
Bram Moolenaar2c8c6812018-07-28 17:07:52 +02001421func Test_edit_backtick()
1422 next a\`b c
1423 call assert_equal('a`b', expand('%'))
1424 next
1425 call assert_equal('c', expand('%'))
1426 call assert_equal('a\`b c', expand('##'))
1427endfunc
1428
Bram Moolenaarff930ca2017-10-19 17:12:10 +02001429func Test_edit_quit()
1430 edit foo.txt
1431 split
1432 new
1433 call setline(1, 'hello')
1434 3wincmd w
1435 redraw!
1436 call assert_fails('1q', 'E37:')
1437 bwipe! foo.txt
1438 only
1439endfunc
1440
Bram Moolenaaradb8fbe2018-06-04 20:34:23 +02001441func Test_edit_alt()
1442 " Keeping the cursor line didn't happen when the first line has indent.
1443 new
1444 call setline(1, [' one', 'two', 'three'])
1445 w XAltFile
1446 $
1447 call assert_equal(3, line('.'))
1448 e Xother
1449 e #
1450 call assert_equal(3, line('.'))
1451
1452 bwipe XAltFile
1453 call delete('XAltFile')
1454endfunc
Bram Moolenaar4dbc2622018-11-02 11:59:15 +01001455
1456func Test_leave_insert_autocmd()
1457 new
1458 au InsertLeave * let g:did_au = 1
1459 let g:did_au = 0
1460 call feedkeys("afoo\<Esc>", 'tx')
1461 call assert_equal(1, g:did_au)
1462 call assert_equal('foo', getline(1))
1463
1464 let g:did_au = 0
1465 call feedkeys("Sbar\<C-C>", 'tx')
1466 call assert_equal(0, g:did_au)
1467 call assert_equal('bar', getline(1))
1468
1469 inoremap x xx<Esc>
1470 let g:did_au = 0
1471 call feedkeys("Saax", 'tx')
1472 call assert_equal(1, g:did_au)
1473 call assert_equal('aaxx', getline(1))
1474
1475 inoremap x xx<C-C>
1476 let g:did_au = 0
1477 call feedkeys("Sbbx", 'tx')
1478 call assert_equal(0, g:did_au)
1479 call assert_equal('bbxx', getline(1))
1480
1481 bwipe!
1482 au! InsertLeave
1483 iunmap x
1484endfunc
Bram Moolenaarc6b37db2019-04-27 18:00:34 +02001485
1486" Test for inserting characters using CTRL-V followed by a number.
1487func Test_edit_special_chars()
1488 new
1489
1490 if has("ebcdic")
1491 let t = "o\<C-V>193\<C-V>xc2\<C-V>o303 \<C-V>90a\<C-V>xfg\<C-V>o578\<Esc>"
1492 else
1493 let t = "o\<C-V>65\<C-V>x42\<C-V>o103 \<C-V>33a\<C-V>xfg\<C-V>o78\<Esc>"
1494 endif
1495
1496 exe "normal " . t
1497 call assert_equal("ABC !a\<C-O>g\<C-G>8", getline(2))
1498
1499 close!
1500endfunc
Bram Moolenaar8d3b5102019-09-05 21:29:01 +02001501
1502func Test_edit_startinsert()
1503 new
1504 set backspace+=start
1505 call setline(1, 'foobar')
1506 call feedkeys("A\<C-U>\<Esc>", 'xt')
1507 call assert_equal('', getline(1))
1508
1509 call setline(1, 'foobar')
1510 call feedkeys(":startinsert!\<CR>\<C-U>\<Esc>", 'xt')
1511 call assert_equal('', getline(1))
1512
1513 set backspace&
1514 bwipe!
1515endfunc
Bram Moolenaar177c9f22019-11-06 13:59:16 +01001516
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +01001517" Test for :startreplace and :startgreplace
1518func Test_edit_startreplace()
1519 new
1520 call setline(1, 'abc')
1521 call feedkeys("l:startreplace\<CR>xyz\e", 'xt')
1522 call assert_equal('axyz', getline(1))
1523 call feedkeys("0:startreplace!\<CR>abc\e", 'xt')
1524 call assert_equal('axyzabc', getline(1))
1525 call setline(1, "a\tb")
1526 call feedkeys("0l:startgreplace\<CR>xyz\e", 'xt')
1527 call assert_equal("axyz\tb", getline(1))
1528 call feedkeys("0i\<C-R>=execute('startreplace')\<CR>12\e", 'xt')
1529 call assert_equal("12axyz\tb", getline(1))
1530 close!
1531endfunc
1532
Bram Moolenaar177c9f22019-11-06 13:59:16 +01001533func Test_edit_noesckeys()
Bram Moolenaar215ba3b2019-11-06 15:07:07 +01001534 CheckNotGui
Bram Moolenaar177c9f22019-11-06 13:59:16 +01001535 new
1536
1537 " <Left> moves cursor when 'esckeys' is set
1538 exe "set t_kl=\<Esc>OD"
1539 set esckeys
1540 call feedkeys("axyz\<Esc>ODX", "xt")
1541 call assert_equal("xyXz", getline(1))
1542
1543 " <Left> exits Insert mode when 'esckeys' is off
1544 set noesckeys
1545 call setline(1, '')
1546 call feedkeys("axyz\<Esc>ODX", "xt")
1547 call assert_equal(["DX", "xyz"], getline(1, 2))
1548
1549 bwipe!
1550 set esckeys
1551endfunc
Bram Moolenaarbc2b71d2020-02-17 21:33:30 +01001552
1553" vim: shiftwidth=2 sts=2 expandtab