xref: /vim-8.2.3635/src/testdir/test_edit.vim (revision fc65cabb)
1" Test for edit functions
2"
3if exists("+t_kD")
4  let &t_kD="[3;*~"
5endif
6
7" Needed for testing basic rightleft: Test_edit_rightleft
8source view_util.vim
9
10" Needs to come first until the bug in getchar() is
11" fixed: https://groups.google.com/d/msg/vim_dev/fXL9yme4H4c/bOR-U6_bAQAJ
12func! Test_edit_00b()
13  new
14  call setline(1, ['abc '])
15  inoreabbr <buffer> h here some more
16  call cursor(1, 4)
17  " <c-l> expands the abbreviation and ends insertmode
18  call feedkeys(":set im\<cr> h\<c-l>:set noim\<cr>", 'tix')
19  call assert_equal(['abc here some more '], getline(1,'$'))
20  iunabbr <buffer> h
21  bw!
22endfunc
23
24func! Test_edit_01()
25  " set for Travis CI?
26  "  set nocp noesckeys
27  new
28  " 1) empty buffer
29  call assert_equal([''], getline(1,'$'))
30  " 2) delete in an empty line
31  call feedkeys("i\<del>\<esc>", 'tnix')
32  call assert_equal([''], getline(1,'$'))
33  %d
34  " 3) delete one character
35  call setline(1, 'a')
36  call feedkeys("i\<del>\<esc>", 'tnix')
37  call assert_equal([''], getline(1,'$'))
38  %d
39  " 4) delete a multibyte character
40  if has("multi_byte")
41    call setline(1, "\u0401")
42    call feedkeys("i\<del>\<esc>", 'tnix')
43    call assert_equal([''], getline(1,'$'))
44    %d
45  endif
46  " 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))
60  let &bs=_bs
61  bw!
62endfunc
63
64func! Test_edit_02()
65  " 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
104func! Test_edit_03()
105  " 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
123func! Test_edit_04()
124  " 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
135func! Test_edit_05()
136  " 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
157func! Test_edit_06()
158  " 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
179func! Test_edit_07()
180  " 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')
204  call assert_equal(["Jan\<c-l>",''], getline(1,'$'))
205  %d
206  call setline(1, 'J')
207  call feedkeys("A\<f5>\<c-p>u\<down>\<c-l>\<cr>", 'tx')
208  call assert_equal(["January"], getline(1,'$'))
209
210  delfu ListMonths
211  delfu DoIt
212  iunmap <buffer> <f5>
213  bw!
214endfunc
215
216func! Test_edit_08()
217  " reset insertmode from i_ctrl-r_=
218  let g:bufnr = bufnr('%')
219  new
220  call setline(1, ['abc'])
221  call cursor(1, 4)
222  call feedkeys(":set im\<cr>ZZZ\<c-r>=setbufvar(g:bufnr,'&im', 0)\<cr>",'tnix')
223  call assert_equal(['abZZZc'], getline(1,'$'))
224  call assert_equal([0, 1, 1, 0], getpos('.'))
225  call assert_false(0, '&im')
226  bw!
227  unlet g:bufnr
228endfunc
229
230func! Test_edit_09()
231  " 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
260func! Test_edit_10()
261  " 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, '$'))
268  set selectmode= keymodel=
269  bw!
270endfunc
271
272func! Test_edit_11()
273  " Test that indenting kicks in
274  new
275  set cindent
276  call setline(1, ['{', '', ''])
277  call cursor(2, 1)
278  call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
279  call cursor(3, 1)
280  call feedkeys("i/* comment */", 'tnix')
281  call assert_equal(['{', "\<tab>int c;", "/* comment */"], getline(1, '$'))
282  " added changed cindentkeys slightly
283  set cindent cinkeys+=*/
284  call setline(1, ['{', '', ''])
285  call cursor(2, 1)
286  call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
287  call cursor(3, 1)
288  call feedkeys("i/* comment */", 'tnix')
289  call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */"], getline(1, '$'))
290  set cindent cinkeys+==end
291  call feedkeys("oend\<cr>\<esc>", 'tnix')
292  call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */", "\tend", ''], getline(1, '$'))
293  set cinkeys-==end
294  %d
295  " Use indentexpr instead of cindenting
296  func! Do_Indent()
297    if v:lnum == 3
298      return 3*shiftwidth()
299    else
300      return 2*shiftwidth()
301    endif
302  endfunc
303  setl indentexpr=Do_Indent() indentkeys+=*/
304  call setline(1, ['{', '', ''])
305  call cursor(2, 1)
306  call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
307  call cursor(3, 1)
308  call feedkeys("i/* comment */", 'tnix')
309  call assert_equal(['{', "\<tab>\<tab>int c;", "\<tab>\<tab>\<tab>/* comment */"], getline(1, '$'))
310  set cinkeys&vim indentkeys&vim
311  set nocindent indentexpr=
312  delfu Do_Indent
313  bw!
314endfunc
315
316func! Test_edit_11_indentexpr()
317  " Test that indenting kicks in
318  new
319  " Use indentexpr instead of cindenting
320  func! Do_Indent()
321    let pline=prevnonblank(v:lnum)
322    if empty(getline(v:lnum))
323      if getline(pline) =~ 'if\|then'
324        return shiftwidth()
325      else
326        return 0
327      endif
328    else
329        return 0
330    endif
331  endfunc
332  setl indentexpr=Do_Indent() indentkeys+=0=then,0=fi
333  call setline(1, ['if [ $this ]'])
334  call cursor(1, 1)
335  call feedkeys("othen\<cr>that\<cr>fi", 'tnix')
336  call assert_equal(['if [ $this ]', "then", "\<tab>that", "fi"], getline(1, '$'))
337  set cinkeys&vim indentkeys&vim
338  set nocindent indentexpr=
339  delfu Do_Indent
340  bw!
341endfunc
342
343func! Test_edit_12()
344  " Test changing indent in replace mode
345  new
346  call setline(1, ["\tabc", "\tdef"])
347  call cursor(2, 4)
348  call feedkeys("R^\<c-d>", 'tnix')
349  call assert_equal(["\tabc", "def"], getline(1, '$'))
350  call assert_equal([0, 2, 2, 0], getpos('.'))
351  %d
352  call setline(1, ["\tabc", "\t\tdef"])
353  call cursor(2, 2)
354  call feedkeys("R^\<c-d>", 'tnix')
355  call assert_equal(["\tabc", "def"], getline(1, '$'))
356  call assert_equal([0, 2, 1, 0], getpos('.'))
357  %d
358  call setline(1, ["\tabc", "\t\tdef"])
359  call cursor(2, 2)
360  call feedkeys("R\<c-t>", 'tnix')
361  call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
362  call assert_equal([0, 2, 2, 0], getpos('.'))
363  bw!
364  10vnew
365  call setline(1, ["\tabc", "\t\tdef"])
366  call cursor(2, 2)
367  call feedkeys("R\<c-t>", 'tnix')
368  call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
369  call assert_equal([0, 2, 2, 0], getpos('.'))
370  %d
371  set sw=4
372  call setline(1, ["\tabc", "\t\tdef"])
373  call cursor(2, 2)
374  call feedkeys("R\<c-t>\<c-t>", 'tnix')
375  call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
376  call assert_equal([0, 2, 2, 0], getpos('.'))
377  %d
378  call setline(1, ["\tabc", "\t\tdef"])
379  call cursor(2, 2)
380  call feedkeys("R\<c-t>\<c-t>", 'tnix')
381  call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
382  call assert_equal([0, 2, 2, 0], getpos('.'))
383  set et
384  set sw& et&
385  %d
386  call setline(1, ["\t/*"])
387  set formatoptions=croql
388  call cursor(1, 3)
389  call feedkeys("A\<cr>\<cr>/", 'tnix')
390  call assert_equal(["\t/*", " *", " */"], getline(1, '$'))
391  set formatoptions&
392  bw!
393endfunc
394
395func! Test_edit_13()
396  " Test smartindenting
397  if exists("+smartindent")
398    new
399    set smartindent autoindent
400    call setline(1, ["\tabc"])
401    call feedkeys("A {\<cr>more\<cr>}\<esc>", 'tnix')
402    call assert_equal(["\tabc {", "\t\tmore", "\t}"], getline(1, '$'))
403    set smartindent& autoindent&
404    bw!
405  endif
406endfunc
407
408func! Test_edit_CR()
409  " Test for <CR> in insert mode
410  " basically only in quickfix mode ist tested, the rest
411  " has been taken care of by other tests
412  if !has("quickfix")
413    return
414  endif
415  botright new
416  call writefile(range(1, 10), 'Xqflist.txt')
417  call setqflist([{'filename': 'Xqflist.txt', 'lnum': 2}])
418  copen
419  set modifiable
420  call feedkeys("A\<cr>", 'tnix')
421  call assert_equal('Xqflist.txt', bufname(''))
422  call assert_equal(2, line('.'))
423  cclose
424  botright new
425  call setloclist(0, [{'filename': 'Xqflist.txt', 'lnum': 10}])
426  lopen
427  set modifiable
428  call feedkeys("A\<cr>", 'tnix')
429  call assert_equal('Xqflist.txt', bufname(''))
430  call assert_equal(10, line('.'))
431  call feedkeys("A\<Enter>", 'tnix')
432  call feedkeys("A\<kEnter>", 'tnix')
433  call feedkeys("A\n", 'tnix')
434  call feedkeys("A\r", 'tnix')
435  call assert_equal(map(range(1, 10), 'string(v:val)') + ['', '', '', ''], getline(1, '$'))
436  bw!
437  lclose
438  call delete('Xqflist.txt')
439endfunc
440
441func! Test_edit_CTRL_()
442  " disabled for Windows builds, why?
443  if !has("multi_byte") || !has("rightleft") || has("win32")
444    return
445  endif
446  let _encoding=&encoding
447  set encoding=utf-8
448  " Test for CTRL-_
449  new
450  call setline(1, ['abc'])
451  call cursor(1, 1)
452  call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
453  call assert_equal(["\<C-_>xyzabc"], getline(1, '$'))
454  call assert_false(&revins)
455  set ari
456  call setline(1, ['abc'])
457  call cursor(1, 1)
458  call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
459  call assert_equal(["æèñabc"], getline(1, '$'))
460  call assert_true(&revins)
461  call setline(1, ['abc'])
462  call cursor(1, 1)
463  call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
464  call assert_equal(["xyzabc"], getline(1, '$'))
465  call assert_false(&revins)
466  set noari
467  let &encoding=_encoding
468  bw!
469endfunc
470
471" needs to come first, to have the @. register empty
472func! Test_edit_00a_CTRL_A()
473  " Test pressing CTRL-A
474  new
475  call setline(1, repeat([''], 5))
476  call cursor(1, 1)
477  try
478    call feedkeys("A\<NUL>", 'tnix')
479  catch /^Vim\%((\a\+)\)\=:E29/
480    call assert_true(1, 'E29 error caught')
481  endtry
482  call cursor(1, 1)
483  call feedkeys("Afoobar \<esc>", 'tnix')
484  call cursor(2, 1)
485  call feedkeys("A\<c-a>more\<esc>", 'tnix')
486  call cursor(3, 1)
487  call feedkeys("A\<NUL>and more\<esc>", 'tnix')
488  call assert_equal(['foobar ', 'foobar more', 'foobar morend more', '', ''], getline(1, '$'))
489  bw!
490endfunc
491
492func! Test_edit_CTRL_EY()
493  " Ctrl-E/ Ctrl-Y in insert mode completion to scroll
494  10new
495  call setline(1, range(1, 100))
496  call cursor(30, 1)
497  norm! z.
498  call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix')
499  call assert_equal(30, winsaveview()['topline'])
500  call assert_equal([0, 30, 2, 0], getpos('.'))
501  call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix')
502  call feedkeys("A\<c-x>".repeat("\<c-y>", 10), 'tnix')
503  call assert_equal(21, winsaveview()['topline'])
504  call assert_equal([0, 30, 2, 0], getpos('.'))
505  bw!
506endfunc
507
508func! Test_edit_CTRL_G()
509  new
510  call setline(1, ['foobar', 'foobar', 'foobar'])
511  call cursor(2, 4)
512  call feedkeys("ioooooooo\<c-g>k\<c-r>.\<esc>", 'tnix')
513  call assert_equal(['foooooooooobar', 'foooooooooobar', 'foobar'], getline(1, '$'))
514  call assert_equal([0, 1, 11, 0], getpos('.'))
515  call feedkeys("i\<c-g>k\<esc>", 'tnix')
516  call assert_equal([0, 1, 10, 0], getpos('.'))
517  call cursor(2, 4)
518  call feedkeys("i\<c-g>jzzzz\<esc>", 'tnix')
519  call assert_equal(['foooooooooobar', 'foooooooooobar', 'foozzzzbar'], getline(1, '$'))
520  call assert_equal([0, 3, 7, 0], getpos('.'))
521  call feedkeys("i\<c-g>j\<esc>", 'tnix')
522  call assert_equal([0, 3, 6, 0], getpos('.'))
523  bw!
524endfunc
525
526func! Test_edit_CTRL_I()
527  " Tab in completion mode
528  let path=expand("%:p:h")
529  new
530  call setline(1, [path. "/", ''])
531  call feedkeys("Arunt\<c-x>\<c-f>\<tab>\<cr>\<esc>", 'tnix')
532  call assert_match('runtest\.vim', getline(1))
533  %d
534  call writefile(['one', 'two', 'three'], 'Xinclude.txt')
535  let include='#include Xinclude.txt'
536  call setline(1, [include, ''])
537  call cursor(2, 1)
538  call feedkeys("A\<c-x>\<tab>\<cr>\<esc>", 'tnix')
539  call assert_equal([include, 'one', ''], getline(1, '$'))
540  call feedkeys("2ggC\<c-x>\<tab>\<down>\<cr>\<esc>", 'tnix')
541  call assert_equal([include, 'two', ''], getline(1, '$'))
542  call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<cr>\<esc>", 'tnix')
543  call assert_equal([include, 'three', ''], getline(1, '$'))
544  call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
545  call assert_equal([include, '', ''], getline(1, '$'))
546  call delete("Xinclude.txt")
547  bw!
548endfunc
549
550func! Test_edit_CTRL_K()
551  " Test pressing CTRL-K (basically only dictionary completion and digraphs
552  " the rest is already covered
553  call writefile(['A', 'AA', 'AAA', 'AAAA'], 'Xdictionary.txt')
554  set dictionary=Xdictionary.txt
555  new
556  call setline(1, 'A')
557  call cursor(1, 1)
558  call feedkeys("A\<c-x>\<c-k>\<cr>\<esc>", 'tnix')
559  call assert_equal(['AA', ''], getline(1, '$'))
560  %d
561  call setline(1, 'A')
562  call cursor(1, 1)
563  call feedkeys("A\<c-x>\<c-k>\<down>\<cr>\<esc>", 'tnix')
564  call assert_equal(['AAA'], getline(1, '$'))
565  %d
566  call setline(1, 'A')
567  call cursor(1, 1)
568  call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<cr>\<esc>", 'tnix')
569  call assert_equal(['AAAA'], getline(1, '$'))
570  %d
571  call setline(1, 'A')
572  call cursor(1, 1)
573  call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
574  call assert_equal(['A'], getline(1, '$'))
575  %d
576  call setline(1, 'A')
577  call cursor(1, 1)
578  call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
579  call assert_equal(['AA'], getline(1, '$'))
580
581  " press an unexecpted key after dictionary completion
582  %d
583  call setline(1, 'A')
584  call cursor(1, 1)
585  call feedkeys("A\<c-x>\<c-k>\<c-]>\<cr>\<esc>", 'tnix')
586  call assert_equal(['AA', ''], getline(1, '$'))
587  %d
588  call setline(1, 'A')
589  call cursor(1, 1)
590  call feedkeys("A\<c-x>\<c-k>\<c-s>\<cr>\<esc>", 'tnix')
591  call assert_equal(["AA\<c-s>", ''], getline(1, '$'))
592  %d
593  call setline(1, 'A')
594  call cursor(1, 1)
595  call feedkeys("A\<c-x>\<c-k>\<c-f>\<cr>\<esc>", 'tnix')
596  call assert_equal(["AA\<c-f>", ''], getline(1, '$'))
597
598  set dictionary=
599  %d
600  call setline(1, 'A')
601  call cursor(1, 1)
602  let v:testing = 1
603  try
604    call feedkeys("A\<c-x>\<c-k>\<esc>", 'tnix')
605  catch
606    " error sleeps 2 seconds, when v:testing is not set
607    let v:testing = 0
608  endtry
609  call delete('Xdictionary.txt')
610
611  if has("multi_byte")
612    call test_override("char_avail", 1)
613    set showcmd
614    %d
615    call feedkeys("A\<c-k>a:\<esc>", 'tnix')
616    call assert_equal(['ä'], getline(1, '$'))
617    call test_override("char_avail", 0)
618    set noshowcmd
619  endif
620  bw!
621endfunc
622
623func! Test_edit_CTRL_L()
624  " Test Ctrl-X Ctrl-L (line completion)
625  new
626  set complete=.
627  call setline(1, ['one', 'two', 'three', '', '', '', ''])
628  call cursor(4, 1)
629  call feedkeys("A\<c-x>\<c-l>\<esc>", 'tnix')
630  call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
631  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<esc>", 'tnix')
632  call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
633  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<esc>", 'tnix')
634  call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$'))
635  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
636  call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
637  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
638  call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
639  call feedkeys("cct\<c-x>\<c-l>\<c-p>\<esc>", 'tnix')
640  call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$'))
641  call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<esc>", 'tnix')
642  call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
643  call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<c-p>\<esc>", 'tnix')
644  call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
645  set complete=
646  call cursor(5, 1)
647  call feedkeys("A\<c-x>\<c-l>\<c-p>\<c-n>\<esc>", 'tnix')
648  call assert_equal(['one', 'two', 'three', 'three', "\<c-l>\<c-p>\<c-n>", '', ''], getline(1, '$'))
649  set complete&
650  %d
651  if has("conceal") && has("syntax")
652    call setline(1, ['foo', 'bar', 'foobar'])
653    call test_override("char_avail", 1)
654    set conceallevel=2 concealcursor=n
655    syn on
656    syn match ErrorMsg "^bar"
657    call matchadd("Conceal", 'oo', 10, -1, {'conceal': 'X'})
658    func! DoIt()
659      let g:change=1
660    endfunc
661    au! TextChangedI <buffer> :call DoIt()
662
663    call cursor(2, 1)
664    call assert_false(exists("g:change"))
665    call feedkeys("A \<esc>", 'tnix')
666    call assert_equal(['foo', 'bar ', 'foobar'], getline(1, '$'))
667    call assert_equal(1, g:change)
668
669    call test_override("char_avail", 0)
670    call clearmatches()
671    syn off
672    au! TextChangedI
673    delfu DoIt
674    unlet! g:change
675  endif
676  bw!
677endfunc
678
679func! Test_edit_CTRL_N()
680  " Check keyword completion
681  new
682  set complete=.
683  call setline(1, ['INFER', 'loWER', '', '', ])
684  call cursor(3, 1)
685  call feedkeys("Ai\<c-n>\<cr>\<esc>", "tnix")
686  call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix')
687  call assert_equal(['INFER', 'loWER', 'i', 'LO', '', ''], getline(1, '$'))
688  %d
689  call setline(1, ['INFER', 'loWER', '', '', ])
690  call cursor(3, 1)
691  set ignorecase infercase
692  call feedkeys("Ii\<c-n>\<cr>\<esc>", "tnix")
693  call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix')
694  call assert_equal(['INFER', 'loWER', 'infer', 'LOWER', '', ''], getline(1, '$'))
695
696  set noignorecase noinfercase complete&
697  bw!
698endfunc
699
700func! Test_edit_CTRL_O()
701  " Check for CTRL-O in insert mode
702  new
703  inoreabbr <buffer> h here some more
704  call setline(1, ['abc', 'def'])
705  call cursor(1, 1)
706  " Ctrl-O after an abbreviation
707  exe "norm A h\<c-o>:set nu\<cr> text"
708  call assert_equal(['abc here some more text', 'def'], getline(1, '$'))
709  call assert_true(&nu)
710  set nonu
711  iunabbr <buffer> h
712  " Ctrl-O at end of line with 've'=onemore
713  call cursor(1, 1)
714  call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix')
715  call assert_equal([0, 1, 23, 0], g:a)
716  call cursor(1, 1)
717  set ve=onemore
718  call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix')
719  call assert_equal([0, 1, 24, 0], g:a)
720  set ve=
721  unlet! g:a
722  bw!
723endfunc
724
725func! Test_edit_CTRL_R()
726  " Insert Register
727  new
728  call test_override("ALL", 1)
729  set showcmd
730  call feedkeys("AFOOBAR eins zwei\<esc>", 'tnix')
731  call feedkeys("O\<c-r>.", 'tnix')
732  call feedkeys("O\<c-r>=10*500\<cr>\<esc>", 'tnix')
733  call feedkeys("O\<c-r>=getreg('=', 1)\<cr>\<esc>", 'tnix')
734  call assert_equal(["getreg('=', 1)", '5000', "FOOBAR eins zwei", "FOOBAR eins zwei"], getline(1, '$'))
735  call test_override("ALL", 0)
736  set noshowcmd
737  bw!
738endfunc
739
740func! Test_edit_CTRL_S()
741  " Test pressing CTRL-S (basically only spellfile completion)
742  " the rest is already covered
743  new
744  if !has("spell")
745    call setline(1, 'vim')
746    call feedkeys("A\<c-x>ss\<cr>\<esc>", 'tnix')
747    call assert_equal(['vims', ''], getline(1, '$'))
748    bw!
749    return
750  endif
751  call setline(1, 'vim')
752  " spell option not yet set
753  try
754    call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix')
755  catch /^Vim\%((\a\+)\)\=:E756/
756    call assert_true(1, 'error caught')
757  endtry
758  call assert_equal(['vim', ''], getline(1, '$'))
759  %d
760  setl spell spelllang=en
761  call setline(1, 'vim')
762  call cursor(1, 1)
763  call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix')
764  call assert_equal(['Vim', ''], getline(1, '$'))
765  %d
766  call setline(1, 'vim')
767  call cursor(1, 1)
768  call feedkeys("A\<c-x>\<c-s>\<down>\<cr>\<esc>", 'tnix')
769  call assert_equal(['Aim'], getline(1, '$'))
770  %d
771  call setline(1, 'vim')
772  call cursor(1, 1)
773  call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix')
774  call assert_equal(['vim', ''], getline(1, '$'))
775  %d
776  " empty buffer
777  call cursor(1, 1)
778  call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix')
779  call assert_equal(['', ''], getline(1, '$'))
780  setl nospell
781  bw!
782endfunc
783
784func! Test_edit_CTRL_T()
785  " Check for CTRL-T and CTRL-X CTRL-T in insert mode
786  " 1) increase indent
787  new
788  call setline(1, "abc")
789  call cursor(1, 1)
790  call feedkeys("A\<c-t>xyz", 'tnix')
791  call assert_equal(["\<tab>abcxyz"], getline(1, '$'))
792  " 2) also when paste option is set
793  set paste
794  call setline(1, "abc")
795  call cursor(1, 1)
796  call feedkeys("A\<c-t>xyz", 'tnix')
797  call assert_equal(["\<tab>abcxyz"], getline(1, '$'))
798  set nopaste
799  " CTRL-X CTRL-T (thesaurus complete)
800  call writefile(['angry furious mad enraged'], 'Xthesaurus')
801  set thesaurus=Xthesaurus
802  call setline(1, 'mad')
803  call cursor(1, 1)
804  call feedkeys("A\<c-x>\<c-t>\<cr>\<esc>", 'tnix')
805  call assert_equal(['mad', ''], getline(1, '$'))
806  %d
807  call setline(1, 'mad')
808  call cursor(1, 1)
809  call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix')
810  call assert_equal(['angry', ''], getline(1, '$'))
811  %d
812  call setline(1, 'mad')
813  call cursor(1, 1)
814  call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
815  call assert_equal(['furious', ''], getline(1, '$'))
816  %d
817  call setline(1, 'mad')
818  call cursor(1, 1)
819  call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
820  call assert_equal(['enraged', ''], getline(1, '$'))
821  %d
822  call setline(1, 'mad')
823  call cursor(1, 1)
824  call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
825  call assert_equal(['mad', ''], getline(1, '$'))
826  %d
827  call setline(1, 'mad')
828  call cursor(1, 1)
829  call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
830  call assert_equal(['mad', ''], getline(1, '$'))
831  " Using <c-p> <c-n> when 'complete' is empty
832  set complete=
833  %d
834  call setline(1, 'mad')
835  call cursor(1, 1)
836  call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix')
837  call assert_equal(['angry', ''], getline(1, '$'))
838  %d
839  call setline(1, 'mad')
840  call cursor(1, 1)
841  call feedkeys("A\<c-x>\<c-t>\<c-p>\<cr>\<esc>", 'tnix')
842  call assert_equal(['mad', ''], getline(1, '$'))
843  set complete&
844
845  set thesaurus=
846  %d
847  call setline(1, 'mad')
848  call cursor(1, 1)
849  let v:testing = 1
850  try
851    call feedkeys("A\<c-x>\<c-t>\<esc>", 'tnix')
852  catch
853    " error sleeps 2 seconds, when v:testing is not set
854    let v:testing = 0
855  endtry
856  call assert_equal(['mad'], getline(1, '$'))
857  call delete('Xthesaurus')
858  bw!
859endfunc
860
861func! Test_edit_CTRL_U()
862  " Test 'completefunc'
863  new
864  " -1, -2 and -3 are special return values
865  let g:special=0
866  fun! CompleteMonths(findstart, base)
867    if a:findstart
868      " locate the start of the word
869      return g:special
870    else
871      " find months matching with "a:base"
872      let res = []
873      for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
874        if m =~ '^\c'.a:base
875          call add(res, {'word': m, 'abbr': m.' Month', 'icase': 0})
876        endif
877      endfor
878      return {'words': res, 'refresh': 'always'}
879    endif
880  endfun
881  set completefunc=CompleteMonths
882  call setline(1, ['', ''])
883  call cursor(1, 1)
884  call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
885  call assert_equal(['X', '', ''], getline(1, '$'))
886  %d
887  let g:special=-1
888  call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
889  call assert_equal(['XJan', ''], getline(1, '$'))
890  %d
891  let g:special=-2
892  call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
893  call assert_equal(['X', ''], getline(1, '$'))
894  %d
895  let g:special=-3
896  call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
897  call assert_equal(['X', ''], getline(1, '$'))
898  %d
899  let g:special=0
900  call feedkeys("AM\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
901  call assert_equal(['Mar', ''], getline(1, '$'))
902  %d
903  call feedkeys("AM\<c-x>\<c-u>\<c-n>\<cr>\<esc>", 'tnix')
904  call assert_equal(['May', ''], getline(1, '$'))
905  %d
906  call feedkeys("AM\<c-x>\<c-u>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
907  call assert_equal(['M', ''], getline(1, '$'))
908  delfu CompleteMonths
909  %d
910  try
911    call feedkeys("A\<c-x>\<c-u>", 'tnix')
912    call assert_fails(1, 'unknown completion function')
913  catch /^Vim\%((\a\+)\)\=:E117/
914    call assert_true(1, 'E117 error caught')
915  endtry
916  set completefunc=
917  bw!
918endfunc
919
920func! Test_edit_CTRL_Z()
921  " Ctrl-Z when insertmode is not set inserts it literally
922  new
923  call setline(1, 'abc')
924  call feedkeys("A\<c-z>\<esc>", 'tnix')
925  call assert_equal(["abc\<c-z>"], getline(1,'$'))
926  bw!
927  " TODO: How to Test Ctrl-Z in insert mode, e.g. suspend?
928endfunc
929
930func! Test_edit_DROP()
931  if !has("dnd")
932    return
933  endif
934  new
935  call setline(1, ['abc def ghi'])
936  call cursor(1, 1)
937  try
938    call feedkeys("i\<Drop>\<Esc>", 'tnix')
939    call assert_fails(1, 'Invalid register name')
940  catch /^Vim\%((\a\+)\)\=:E353/
941    call assert_true(1, 'error caught')
942  endtry
943  bw!
944endfunc
945
946func! Test_edit_CTRL_V()
947  if has("ebcdic")
948    return
949  endif
950  new
951  call setline(1, ['abc'])
952  call cursor(2, 1)
953  " force some redraws
954  set showmode showcmd
955  "call test_override_char_avail(1)
956  call test_override('ALL', 1)
957  call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix')
958  call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$'))
959
960  if has("rightleft") && exists("+rl")
961    set rl
962    call setline(1, ['abc'])
963    call cursor(2, 1)
964    call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix')
965    call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$'))
966    set norl
967  endif
968
969  call test_override('ALL', 0)
970  set noshowmode showcmd
971  bw!
972endfunc
973
974func! Test_edit_F1()
975  " Pressing <f1>
976  new
977  call feedkeys(":set im\<cr>\<f1>\<c-l>", 'tnix')
978  set noinsertmode
979  call assert_equal('help', &buftype)
980  bw
981  bw
982endfunc
983
984func! Test_edit_F21()
985  " Pressing <f21>
986  " sends a netbeans command
987  if has("netbeans_intg")
988    new
989    " I have no idea what this is supposed to do :)
990    call feedkeys("A\<F21>\<F1>\<esc>", 'tnix')
991    bw
992  endif
993endfunc
994
995func! Test_edit_HOME_END()
996  " Test Home/End Keys
997  new
998  set foldopen+=hor
999  call setline(1, ['abc', 'def'])
1000  call cursor(1, 1)
1001  call feedkeys("AX\<Home>Y\<esc>", 'tnix')
1002  call cursor(2, 1)
1003  call feedkeys("iZ\<End>Y\<esc>", 'tnix')
1004  call assert_equal(['YabcX', 'ZdefY'], getline(1, '$'))
1005
1006  set foldopen-=hor
1007  bw!
1008endfunc
1009
1010func! Test_edit_INS()
1011  " Test for Pressing <Insert>
1012  new
1013  call setline(1, ['abc', 'def'])
1014  call cursor(1, 1)
1015  call feedkeys("i\<Insert>ZYX>", 'tnix')
1016  call assert_equal(['ZYX>', 'def'], getline(1, '$'))
1017  call setline(1, ['abc', 'def'])
1018  call cursor(1, 1)
1019  call feedkeys("i\<Insert>Z\<Insert>YX>", 'tnix')
1020  call assert_equal(['ZYX>bc', 'def'], getline(1, '$'))
1021  bw!
1022endfunc
1023
1024func! Test_edit_LEFT_RIGHT()
1025  " Left, Shift-Left, Right, Shift-Right
1026  new
1027  call setline(1, ['abc def ghi', 'ABC DEF GHI', 'ZZZ YYY XXX'])
1028  let _ww=&ww
1029  set ww=
1030  call cursor(2, 1)
1031  call feedkeys("i\<left>\<esc>", 'tnix')
1032  call assert_equal([0, 2, 1, 0], getpos('.'))
1033  " Is this a bug, <s-left> does not respect whichwrap option
1034  call feedkeys("i\<s-left>\<esc>", 'tnix')
1035  call assert_equal([0, 1, 8, 0], getpos('.'))
1036  call feedkeys("i". repeat("\<s-left>", 3). "\<esc>", 'tnix')
1037  call assert_equal([0, 1, 1, 0], getpos('.'))
1038  call feedkeys("i\<right>\<esc>", 'tnix')
1039  call assert_equal([0, 1, 1, 0], getpos('.'))
1040  call feedkeys("i\<right>\<right>\<esc>", 'tnix')
1041  call assert_equal([0, 1, 2, 0], getpos('.'))
1042  call feedkeys("A\<right>\<esc>", 'tnix')
1043  call assert_equal([0, 1, 11, 0], getpos('.'))
1044  call feedkeys("A\<s-right>\<esc>", 'tnix')
1045  call assert_equal([0, 2, 1, 0], getpos('.'))
1046  call feedkeys("i\<s-right>\<esc>", 'tnix')
1047  call assert_equal([0, 2, 4, 0], getpos('.'))
1048  call cursor(3, 11)
1049  call feedkeys("A\<right>\<esc>", 'tnix')
1050  call feedkeys("A\<s-right>\<esc>", 'tnix')
1051  call assert_equal([0, 3, 11, 0], getpos('.'))
1052  call cursor(2, 11)
1053  " <S-Right> does not respect 'whichwrap' option
1054  call feedkeys("A\<s-right>\<esc>", 'tnix')
1055  call assert_equal([0, 3, 1, 0], getpos('.'))
1056  " Check motion when 'whichwrap' contains cursor keys for insert mode
1057  set ww+=[,]
1058  call cursor(2, 1)
1059  call feedkeys("i\<left>\<esc>", 'tnix')
1060  call assert_equal([0, 1, 11, 0], getpos('.'))
1061  call cursor(2, 11)
1062  call feedkeys("A\<right>\<esc>", 'tnix')
1063  call assert_equal([0, 3, 1, 0], getpos('.'))
1064  call cursor(2, 11)
1065  call feedkeys("A\<s-right>\<esc>", 'tnix')
1066  call assert_equal([0, 3, 1, 0], getpos('.'))
1067  let &ww = _ww
1068  bw!
1069endfunc
1070
1071func! Test_edit_MOUSE()
1072  " This is a simple test, since we not really using the mouse here
1073  if !has("mouse")
1074    return
1075  endif
1076  10new
1077  call setline(1, range(1, 100))
1078  call cursor(1, 1)
1079  set mouse=a
1080  call feedkeys("A\<ScrollWheelDown>\<esc>", 'tnix')
1081  call assert_equal([0, 4, 1, 0], getpos('.'))
1082  " This should move by one pageDown, but only moves
1083  " by one line when the test is run...
1084  call feedkeys("A\<S-ScrollWheelDown>\<esc>", 'tnix')
1085  call assert_equal([0, 5, 1, 0], getpos('.'))
1086  set nostartofline
1087  call feedkeys("A\<C-ScrollWheelDown>\<esc>", 'tnix')
1088  call assert_equal([0, 6, 1, 0], getpos('.'))
1089  call feedkeys("A\<LeftMouse>\<esc>", 'tnix')
1090  call assert_equal([0, 6, 1, 0], getpos('.'))
1091  call feedkeys("A\<RightMouse>\<esc>", 'tnix')
1092  call assert_equal([0, 6, 1, 0], getpos('.'))
1093  call cursor(1, 100)
1094  norm! zt
1095  " this should move by a screen up, but when the test
1096  " is run, it moves up to the top of the buffer...
1097  call feedkeys("A\<ScrollWheelUp>\<esc>", 'tnix')
1098  call assert_equal([0, 1, 1, 0], getpos('.'))
1099  call cursor(1, 30)
1100  norm! zt
1101  call feedkeys("A\<S-ScrollWheelUp>\<esc>", 'tnix')
1102  call assert_equal([0, 1, 1, 0], getpos('.'))
1103  call cursor(1, 30)
1104  norm! zt
1105  call feedkeys("A\<C-ScrollWheelUp>\<esc>", 'tnix')
1106  call assert_equal([0, 1, 1, 0], getpos('.'))
1107  %d
1108  call setline(1, repeat(["12345678901234567890"], 100))
1109  call cursor(2, 1)
1110  call feedkeys("A\<ScrollWheelRight>\<esc>", 'tnix')
1111  call assert_equal([0, 2, 20, 0], getpos('.'))
1112  call feedkeys("A\<ScrollWheelLeft>\<esc>", 'tnix')
1113  call assert_equal([0, 2, 20, 0], getpos('.'))
1114  call feedkeys("A\<S-ScrollWheelRight>\<esc>", 'tnix')
1115  call assert_equal([0, 2, 20, 0], getpos('.'))
1116  call feedkeys("A\<S-ScrollWheelLeft>\<esc>", 'tnix')
1117  call assert_equal([0, 2, 20, 0], getpos('.'))
1118  call feedkeys("A\<C-ScrollWheelRight>\<esc>", 'tnix')
1119  call assert_equal([0, 2, 20, 0], getpos('.'))
1120  call feedkeys("A\<C-ScrollWheelLeft>\<esc>", 'tnix')
1121  call assert_equal([0, 2, 20, 0], getpos('.'))
1122  set mouse& startofline
1123  bw!
1124endfunc
1125
1126func! Test_edit_PAGEUP_PAGEDOWN()
1127  10new
1128  call setline(1, repeat(['abc def ghi'], 30))
1129  call cursor(1, 1)
1130  call feedkeys("i\<PageDown>\<esc>", 'tnix')
1131  call assert_equal([0, 9, 1, 0], getpos('.'))
1132  call feedkeys("i\<PageDown>\<esc>", 'tnix')
1133  call assert_equal([0, 17, 1, 0], getpos('.'))
1134  call feedkeys("i\<PageDown>\<esc>", 'tnix')
1135  call assert_equal([0, 25, 1, 0], getpos('.'))
1136  call feedkeys("i\<PageDown>\<esc>", 'tnix')
1137  call assert_equal([0, 30, 1, 0], getpos('.'))
1138  call feedkeys("i\<PageDown>\<esc>", 'tnix')
1139  call assert_equal([0, 30, 1, 0], getpos('.'))
1140  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1141  call assert_equal([0, 29, 1, 0], getpos('.'))
1142  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1143  call assert_equal([0, 21, 1, 0], getpos('.'))
1144  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1145  call assert_equal([0, 13, 1, 0], getpos('.'))
1146  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1147  call assert_equal([0, 5, 1, 0], getpos('.'))
1148  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1149  call assert_equal([0, 5, 11, 0], getpos('.'))
1150  " <S-Up> is the same as <PageUp>
1151  " <S-Down> is the same as <PageDown>
1152  call cursor(1, 1)
1153  call feedkeys("i\<S-Down>\<esc>", 'tnix')
1154  call assert_equal([0, 9, 1, 0], getpos('.'))
1155  call feedkeys("i\<S-Down>\<esc>", 'tnix')
1156  call assert_equal([0, 17, 1, 0], getpos('.'))
1157  call feedkeys("i\<S-Down>\<esc>", 'tnix')
1158  call assert_equal([0, 25, 1, 0], getpos('.'))
1159  call feedkeys("i\<S-Down>\<esc>", 'tnix')
1160  call assert_equal([0, 30, 1, 0], getpos('.'))
1161  call feedkeys("i\<S-Down>\<esc>", 'tnix')
1162  call assert_equal([0, 30, 1, 0], getpos('.'))
1163  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1164  call assert_equal([0, 29, 1, 0], getpos('.'))
1165  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1166  call assert_equal([0, 21, 1, 0], getpos('.'))
1167  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1168  call assert_equal([0, 13, 1, 0], getpos('.'))
1169  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1170  call assert_equal([0, 5, 1, 0], getpos('.'))
1171  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1172  call assert_equal([0, 5, 11, 0], getpos('.'))
1173  set nostartofline
1174  call cursor(30, 11)
1175  norm! zt
1176  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1177  call assert_equal([0, 29, 11, 0], getpos('.'))
1178  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1179  call assert_equal([0, 21, 11, 0], getpos('.'))
1180  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1181  call assert_equal([0, 13, 11, 0], getpos('.'))
1182  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1183  call assert_equal([0, 5, 11, 0], getpos('.'))
1184  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1185  call assert_equal([0, 5, 11, 0], getpos('.'))
1186  call cursor(1, 1)
1187  call feedkeys("A\<PageDown>\<esc>", 'tnix')
1188  call assert_equal([0, 9, 11, 0], getpos('.'))
1189  call feedkeys("A\<PageDown>\<esc>", 'tnix')
1190  call assert_equal([0, 17, 11, 0], getpos('.'))
1191  call feedkeys("A\<PageDown>\<esc>", 'tnix')
1192  call assert_equal([0, 25, 11, 0], getpos('.'))
1193  call feedkeys("A\<PageDown>\<esc>", 'tnix')
1194  call assert_equal([0, 30, 11, 0], getpos('.'))
1195  call feedkeys("A\<PageDown>\<esc>", 'tnix')
1196  call assert_equal([0, 30, 11, 0], getpos('.'))
1197  " <S-Up> is the same as <PageUp>
1198  " <S-Down> is the same as <PageDown>
1199  call cursor(30, 11)
1200  norm! zt
1201  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1202  call assert_equal([0, 29, 11, 0], getpos('.'))
1203  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1204  call assert_equal([0, 21, 11, 0], getpos('.'))
1205  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1206  call assert_equal([0, 13, 11, 0], getpos('.'))
1207  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1208  call assert_equal([0, 5, 11, 0], getpos('.'))
1209  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1210  call assert_equal([0, 5, 11, 0], getpos('.'))
1211  call cursor(1, 1)
1212  call feedkeys("A\<S-Down>\<esc>", 'tnix')
1213  call assert_equal([0, 9, 11, 0], getpos('.'))
1214  call feedkeys("A\<S-Down>\<esc>", 'tnix')
1215  call assert_equal([0, 17, 11, 0], getpos('.'))
1216  call feedkeys("A\<S-Down>\<esc>", 'tnix')
1217  call assert_equal([0, 25, 11, 0], getpos('.'))
1218  call feedkeys("A\<S-Down>\<esc>", 'tnix')
1219  call assert_equal([0, 30, 11, 0], getpos('.'))
1220  call feedkeys("A\<S-Down>\<esc>", 'tnix')
1221  call assert_equal([0, 30, 11, 0], getpos('.'))
1222  bw!
1223endfunc
1224
1225func! Test_edit_forbidden()
1226  new
1227  " 1) edit in the sandbox is not allowed
1228  call setline(1, 'a')
1229  com! Sandbox :sandbox call feedkeys("i\<del>\<esc>", 'tnix')
1230  call assert_fails(':Sandbox', 'E48:')
1231  com! Sandbox :sandbox exe "norm! i\<del>"
1232  call assert_fails(':Sandbox', 'E48:')
1233  delcom Sandbox
1234  call assert_equal(['a'], getline(1,'$'))
1235  " 2) edit with textlock set
1236  fu! DoIt()
1237    call feedkeys("i\<del>\<esc>", 'tnix')
1238  endfu
1239  au InsertCharPre <buffer> :call DoIt()
1240  try
1241    call feedkeys("ix\<esc>", 'tnix')
1242    call assert_fails(1, 'textlock')
1243  catch /^Vim\%((\a\+)\)\=:E523/ " catch E523: not allowed here
1244  endtry
1245  " TODO: Might be a bug: should x really be inserted here
1246  call assert_equal(['xa'], getline(1, '$'))
1247  delfu DoIt
1248  try
1249    call feedkeys("ix\<esc>", 'tnix')
1250    call assert_fails(1, 'unknown function')
1251  catch /^Vim\%((\a\+)\)\=:E117/ " catch E117: unknown function
1252  endtry
1253  au! InsertCharPre
1254  " 3) edit when completion is shown
1255  fun! Complete(findstart, base)
1256    if a:findstart
1257      return col('.')
1258    else
1259      call feedkeys("i\<del>\<esc>", 'tnix')
1260      return []
1261    endif
1262  endfun
1263  set completefunc=Complete
1264  try
1265    call feedkeys("i\<c-x>\<c-u>\<esc>", 'tnix')
1266    call assert_fails(1, 'change in complete function')
1267  catch /^Vim\%((\a\+)\)\=:E523/ " catch E523
1268  endtry
1269  delfu Complete
1270  set completefunc=
1271  if has("rightleft") && exists("+fkmap")
1272    " 4) 'R' when 'fkmap' and 'revins' is set.
1273    set revins fkmap
1274    try
1275      normal Ri
1276      call assert_fails(1, "R with 'fkmap' and 'ri' set")
1277    catch
1278    finally
1279      set norevins nofkmap
1280    endtry
1281  endif
1282  bw!
1283endfunc
1284
1285func! Test_edit_rightleft()
1286  " Cursor in rightleft mode moves differently
1287  if !exists("+rightleft")
1288    return
1289  endif
1290  call NewWindow(10, 20)
1291  call setline(1, ['abc', 'def', 'ghi'])
1292  call cursor(1, 2)
1293  set rightleft
1294  " Screen looks as expected
1295  let lines = ScreenLines([1, 4], winwidth(0))
1296  let expect = [
1297        \"                 cba",
1298        \"                 fed",
1299        \"                 ihg",
1300        \"                   ~"]
1301  call assert_equal(join(expect, "\n"), join(lines, "\n"))
1302  " 2) right moves to the left
1303  call feedkeys("i\<right>\<esc>x", 'txin')
1304  call assert_equal(['bc', 'def', 'ghi'], getline(1,'$'))
1305  call cursor(1, 2)
1306  call feedkeys("i\<s-right>\<esc>", 'txin')
1307  call cursor(1, 2)
1308  call feedkeys("i\<c-right>\<esc>", 'txin')
1309  " Screen looks as expected
1310  let lines = ScreenLines([1, 4], winwidth(0))
1311  let expect = [
1312        \"                  cb",
1313        \"                 fed",
1314        \"                 ihg",
1315        \"                   ~"]
1316  call assert_equal(join(expect, "\n"), join(lines, "\n"))
1317  " 2) left moves to the right
1318  call setline(1, ['abc', 'def', 'ghi'])
1319  call cursor(1, 2)
1320  call feedkeys("i\<left>\<esc>x", 'txin')
1321  call assert_equal(['ac', 'def', 'ghi'], getline(1,'$'))
1322  call cursor(1, 2)
1323  call feedkeys("i\<s-left>\<esc>", 'txin')
1324  call cursor(1, 2)
1325  call feedkeys("i\<c-left>\<esc>", 'txin')
1326  " Screen looks as expected
1327  let lines = ScreenLines([1, 4], winwidth(0))
1328  let expect = [
1329        \"                  ca",
1330        \"                 fed",
1331        \"                 ihg",
1332        \"                   ~"]
1333  call assert_equal(join(expect, "\n"), join(lines, "\n"))
1334  set norightleft
1335  bw!
1336endfunc
1337
1338func Test_edit_complete_very_long_name()
1339  if !has('unix')
1340    " Long directory names only work on Unix.
1341    return
1342  endif
1343
1344  let dirname = getcwd() . "/Xdir"
1345  let longdirname = dirname . repeat('/' . repeat('d', 255), 4)
1346  try
1347    call mkdir(longdirname, 'p')
1348  catch /E739:/
1349    " Long directory name probably not supported.
1350    call delete(dirname, 'rf')
1351    return
1352  endtry
1353
1354  " Try to get the Vim window position before setting 'columns'.
1355  let winposx = getwinposx()
1356  let winposy = getwinposy()
1357  let save_columns = &columns
1358  " Need at least about 1100 columns to reproduce the problem.
1359  set columns=2000
1360  set noswapfile
1361
1362  let longfilename = longdirname . '/' . repeat('a', 255)
1363  call writefile(['Totum', 'Table'], longfilename)
1364  new
1365  exe "next Xfile " . longfilename
1366  exe "normal iT\<C-N>"
1367
1368  bwipe!
1369  exe 'bwipe! ' . longfilename
1370  call delete(dirname, 'rf')
1371  let &columns = save_columns
1372  if winposx >= 0 && winposy >= 0
1373    exe 'winpos ' . winposx . ' ' . winposy
1374  endif
1375  set swapfile&
1376endfunc
1377
1378func Test_edit_backtick()
1379  next a\`b c
1380  call assert_equal('a`b', expand('%'))
1381  next
1382  call assert_equal('c', expand('%'))
1383  call assert_equal('a\`b c', expand('##'))
1384endfunc
1385
1386func Test_edit_quit()
1387  edit foo.txt
1388  split
1389  new
1390  call setline(1, 'hello')
1391  3wincmd w
1392  redraw!
1393  call assert_fails('1q', 'E37:')
1394  bwipe! foo.txt
1395  only
1396endfunc
1397
1398func Test_edit_alt()
1399  " Keeping the cursor line didn't happen when the first line has indent.
1400  new
1401  call setline(1, ['  one', 'two', 'three'])
1402  w XAltFile
1403  $
1404  call assert_equal(3, line('.'))
1405  e Xother
1406  e #
1407  call assert_equal(3, line('.'))
1408
1409  bwipe XAltFile
1410  call delete('XAltFile')
1411endfunc
1412