xref: /vim-8.2.3635/src/testdir/test_edit.vim (revision a062006b)
1eb992cb9SBram Moolenaar" Test for edit functions
2215ba3b6SBram Moolenaar
3eb992cb9SBram Moolenaarif exists("+t_kD")
4eb992cb9SBram Moolenaar  let &t_kD="[3;*~"
5eb992cb9SBram Moolenaarendif
6eb992cb9SBram Moolenaar
7215ba3b6SBram Moolenaarsource check.vim
8215ba3b6SBram Moolenaar
9eb992cb9SBram Moolenaar" Needed for testing basic rightleft: Test_edit_rightleft
10eb992cb9SBram Moolenaarsource view_util.vim
11eb992cb9SBram Moolenaar
12eb992cb9SBram Moolenaar" Needs to come first until the bug in getchar() is
13eb992cb9SBram Moolenaar" fixed: https://groups.google.com/d/msg/vim_dev/fXL9yme4H4c/bOR-U6_bAQAJ
141e115360SBram Moolenaarfunc Test_edit_00b()
15eb992cb9SBram Moolenaar  new
16eb992cb9SBram Moolenaar  call setline(1, ['abc '])
17eb992cb9SBram Moolenaar  inoreabbr <buffer> h here some more
18eb992cb9SBram Moolenaar  call cursor(1, 4)
19eb992cb9SBram Moolenaar  " <c-l> expands the abbreviation and ends insertmode
20eb992cb9SBram Moolenaar  call feedkeys(":set im\<cr> h\<c-l>:set noim\<cr>", 'tix')
21eb992cb9SBram Moolenaar  call assert_equal(['abc here some more '], getline(1,'$'))
22eb992cb9SBram Moolenaar  iunabbr <buffer> h
23eb992cb9SBram Moolenaar  bw!
24eb992cb9SBram Moolenaarendfunc
25eb992cb9SBram Moolenaar
261e115360SBram Moolenaarfunc Test_edit_01()
27eb992cb9SBram Moolenaar  " set for Travis CI?
28eb992cb9SBram Moolenaar  "  set nocp noesckeys
29eb992cb9SBram Moolenaar  new
30eb992cb9SBram Moolenaar  " 1) empty buffer
31eb992cb9SBram Moolenaar  call assert_equal([''], getline(1,'$'))
32eb992cb9SBram Moolenaar  " 2) delete in an empty line
33eb992cb9SBram Moolenaar  call feedkeys("i\<del>\<esc>", 'tnix')
34eb992cb9SBram Moolenaar  call assert_equal([''], getline(1,'$'))
35eb992cb9SBram Moolenaar  %d
36eb992cb9SBram Moolenaar  " 3) delete one character
37eb992cb9SBram Moolenaar  call setline(1, 'a')
38eb992cb9SBram Moolenaar  call feedkeys("i\<del>\<esc>", 'tnix')
39eb992cb9SBram Moolenaar  call assert_equal([''], getline(1,'$'))
40eb992cb9SBram Moolenaar  %d
41eb992cb9SBram Moolenaar  " 4) delete a multibyte character
42eb992cb9SBram Moolenaar  call setline(1, "\u0401")
43eb992cb9SBram Moolenaar  call feedkeys("i\<del>\<esc>", 'tnix')
44eb992cb9SBram Moolenaar  call assert_equal([''], getline(1,'$'))
45eb992cb9SBram Moolenaar  %d
46eb992cb9SBram Moolenaar  " 5.1) delete linebreak with 'bs' option containing eol
47eb992cb9SBram Moolenaar  let _bs=&bs
48eb992cb9SBram Moolenaar  set bs=eol
49eb992cb9SBram Moolenaar  call setline(1, ["abc def", "ghi jkl"])
50eb992cb9SBram Moolenaar  call cursor(1, 1)
51eb992cb9SBram Moolenaar  call feedkeys("A\<del>\<esc>", 'tnix')
52eb992cb9SBram Moolenaar  call assert_equal(['abc defghi jkl'], getline(1, 2))
53eb992cb9SBram Moolenaar  %d
54eb992cb9SBram Moolenaar  " 5.2) delete linebreak with backspace option w/out eol
55eb992cb9SBram Moolenaar  set bs=
56eb992cb9SBram Moolenaar  call setline(1, ["abc def", "ghi jkl"])
57eb992cb9SBram Moolenaar  call cursor(1, 1)
58eb992cb9SBram Moolenaar  call feedkeys("A\<del>\<esc>", 'tnix')
59eb992cb9SBram Moolenaar  call assert_equal(["abc def", "ghi jkl"], getline(1, 2))
60eb992cb9SBram Moolenaar  let &bs=_bs
61eb992cb9SBram Moolenaar  bw!
62eb992cb9SBram Moolenaarendfunc
63eb992cb9SBram Moolenaar
641e115360SBram Moolenaarfunc Test_edit_02()
65eb992cb9SBram Moolenaar  " Change cursor position in InsertCharPre command
66eb992cb9SBram Moolenaar  new
67eb992cb9SBram Moolenaar  call setline(1, 'abc')
68eb992cb9SBram Moolenaar  call cursor(1, 1)
69eb992cb9SBram Moolenaar  fu! DoIt(...)
70eb992cb9SBram Moolenaar    call cursor(1, 4)
71eb992cb9SBram Moolenaar    if len(a:000)
72eb992cb9SBram Moolenaar      let v:char=a:1
73eb992cb9SBram Moolenaar    endif
74eb992cb9SBram Moolenaar  endfu
75eb992cb9SBram Moolenaar  au InsertCharPre <buffer> :call DoIt('y')
76eb992cb9SBram Moolenaar  call feedkeys("ix\<esc>", 'tnix')
77eb992cb9SBram Moolenaar  call assert_equal(['abcy'], getline(1, '$'))
78eb992cb9SBram Moolenaar  " Setting <Enter> in InsertCharPre
79eb992cb9SBram Moolenaar  au! InsertCharPre <buffer> :call DoIt("\n")
80eb992cb9SBram Moolenaar  call setline(1, 'abc')
81eb992cb9SBram Moolenaar  call cursor(1, 1)
82eb992cb9SBram Moolenaar  call feedkeys("ix\<esc>", 'tnix')
83eb992cb9SBram Moolenaar  call assert_equal(['abc', ''], getline(1, '$'))
84eb992cb9SBram Moolenaar  %d
85eb992cb9SBram Moolenaar  au! InsertCharPre
86eb992cb9SBram Moolenaar  " Change cursor position in InsertEnter command
87eb992cb9SBram Moolenaar  " 1) when setting v:char, keeps changed cursor position
88eb992cb9SBram Moolenaar  au! InsertEnter <buffer> :call DoIt('y')
89eb992cb9SBram Moolenaar  call setline(1, 'abc')
90eb992cb9SBram Moolenaar  call cursor(1, 1)
91eb992cb9SBram Moolenaar  call feedkeys("ix\<esc>", 'tnix')
92eb992cb9SBram Moolenaar  call assert_equal(['abxc'], getline(1, '$'))
93eb992cb9SBram Moolenaar  " 2) when not setting v:char, restores changed cursor position
94eb992cb9SBram Moolenaar  au! InsertEnter <buffer> :call DoIt()
95eb992cb9SBram Moolenaar  call setline(1, 'abc')
96eb992cb9SBram Moolenaar  call cursor(1, 1)
97eb992cb9SBram Moolenaar  call feedkeys("ix\<esc>", 'tnix')
98eb992cb9SBram Moolenaar  call assert_equal(['xabc'], getline(1, '$'))
99eb992cb9SBram Moolenaar  au! InsertEnter
100eb992cb9SBram Moolenaar  delfu DoIt
101eb992cb9SBram Moolenaar  bw!
102eb992cb9SBram Moolenaarendfunc
103eb992cb9SBram Moolenaar
1041e115360SBram Moolenaarfunc Test_edit_03()
105eb992cb9SBram Moolenaar  " Change cursor after <c-o> command to end of line
106eb992cb9SBram Moolenaar  new
107eb992cb9SBram Moolenaar  call setline(1, 'abc')
108eb992cb9SBram Moolenaar  call cursor(1, 1)
109eb992cb9SBram Moolenaar  call feedkeys("i\<c-o>$y\<esc>", 'tnix')
110eb992cb9SBram Moolenaar  call assert_equal(['abcy'], getline(1, '$'))
111eb992cb9SBram Moolenaar  %d
112eb992cb9SBram Moolenaar  call setline(1, 'abc')
113eb992cb9SBram Moolenaar  call cursor(1, 1)
114eb992cb9SBram Moolenaar  call feedkeys("i\<c-o>80|y\<esc>", 'tnix')
115eb992cb9SBram Moolenaar  call assert_equal(['abcy'], getline(1, '$'))
116eb992cb9SBram Moolenaar  %d
117eb992cb9SBram Moolenaar  call setline(1, 'abc')
118eb992cb9SBram Moolenaar  call feedkeys("Ad\<c-o>:s/$/efg/\<cr>hij", 'tnix')
119eb992cb9SBram Moolenaar  call assert_equal(['hijabcdefg'], getline(1, '$'))
120eb992cb9SBram Moolenaar  bw!
121eb992cb9SBram Moolenaarendfunc
122eb992cb9SBram Moolenaar
1231e115360SBram Moolenaarfunc Test_edit_04()
124eb992cb9SBram Moolenaar  " test for :stopinsert
125eb992cb9SBram Moolenaar  new
126eb992cb9SBram Moolenaar  call setline(1, 'abc')
127eb992cb9SBram Moolenaar  call cursor(1, 1)
128eb992cb9SBram Moolenaar  call feedkeys("i\<c-o>:stopinsert\<cr>$", 'tnix')
129eb992cb9SBram Moolenaar  call feedkeys("aX\<esc>", 'tnix')
130eb992cb9SBram Moolenaar  call assert_equal(['abcX'], getline(1, '$'))
131eb992cb9SBram Moolenaar  %d
132eb992cb9SBram Moolenaar  bw!
133eb992cb9SBram Moolenaarendfunc
134eb992cb9SBram Moolenaar
1351e115360SBram Moolenaarfunc Test_edit_05()
136eb992cb9SBram Moolenaar  " test for folds being opened
137eb992cb9SBram Moolenaar  new
138eb992cb9SBram Moolenaar  call setline(1, ['abcX', 'abcX', 'zzzZ'])
139eb992cb9SBram Moolenaar  call cursor(1, 1)
140eb992cb9SBram Moolenaar  set foldmethod=manual foldopen+=insert
141eb992cb9SBram Moolenaar  " create fold for those two lines
142eb992cb9SBram Moolenaar  norm! Vjzf
143eb992cb9SBram Moolenaar  call feedkeys("$ay\<esc>", 'tnix')
144eb992cb9SBram Moolenaar  call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$'))
145eb992cb9SBram Moolenaar  %d
146eb992cb9SBram Moolenaar  call setline(1, ['abcX', 'abcX', 'zzzZ'])
147eb992cb9SBram Moolenaar  call cursor(1, 1)
148eb992cb9SBram Moolenaar  set foldmethod=manual foldopen-=insert
149eb992cb9SBram Moolenaar  " create fold for those two lines
150eb992cb9SBram Moolenaar  norm! Vjzf
151eb992cb9SBram Moolenaar  call feedkeys("$ay\<esc>", 'tnix')
152eb992cb9SBram Moolenaar  call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$'))
153eb992cb9SBram Moolenaar  %d
154eb992cb9SBram Moolenaar  bw!
155eb992cb9SBram Moolenaarendfunc
156eb992cb9SBram Moolenaar
1571e115360SBram Moolenaarfunc Test_edit_06()
158eb992cb9SBram Moolenaar  " Test in diff mode
1596d91bcb4SBram Moolenaar  CheckFeature diff
1606d91bcb4SBram Moolenaar  CheckExecutable diff
161eb992cb9SBram Moolenaar  new
162eb992cb9SBram Moolenaar  call setline(1, ['abc', 'xxx', 'yyy'])
163eb992cb9SBram Moolenaar  vnew
164eb992cb9SBram Moolenaar  call setline(1, ['abc', 'zzz', 'xxx', 'yyy'])
165eb992cb9SBram Moolenaar  wincmd p
166eb992cb9SBram Moolenaar  diffthis
167eb992cb9SBram Moolenaar  wincmd p
168eb992cb9SBram Moolenaar  diffthis
169eb992cb9SBram Moolenaar  wincmd p
170eb992cb9SBram Moolenaar  call cursor(2, 1)
171eb992cb9SBram Moolenaar  norm! zt
172eb992cb9SBram Moolenaar  call feedkeys("Ozzz\<esc>", 'tnix')
173eb992cb9SBram Moolenaar  call assert_equal(['abc', 'zzz', 'xxx', 'yyy'], getline(1,'$'))
174eb992cb9SBram Moolenaar  bw!
175eb992cb9SBram Moolenaar  bw!
176eb992cb9SBram Moolenaarendfunc
177eb992cb9SBram Moolenaar
1781e115360SBram Moolenaarfunc Test_edit_07()
179eb992cb9SBram Moolenaar  " 1) Test with completion <c-l> when popupmenu is visible
180eb992cb9SBram Moolenaar  new
181eb992cb9SBram Moolenaar  call setline(1, 'J')
182eb992cb9SBram Moolenaar
183eb992cb9SBram Moolenaar  func! ListMonths()
184eb992cb9SBram Moolenaar    call complete(col('.')-1, ['January', 'February', 'March',
185eb992cb9SBram Moolenaar    \ 'April', 'May', 'June', 'July', 'August', 'September',
186eb992cb9SBram Moolenaar    \ 'October', 'November', 'December'])
187eb992cb9SBram Moolenaar    return ''
188eb992cb9SBram Moolenaar  endfunc
189eb992cb9SBram Moolenaar  inoremap <buffer> <F5> <C-R>=ListMonths()<CR>
190eb992cb9SBram Moolenaar
191eb992cb9SBram Moolenaar  call feedkeys("A\<f5>\<c-p>". repeat("\<down>", 6)."\<c-l>\<down>\<c-l>\<cr>", 'tx')
192eb992cb9SBram Moolenaar  call assert_equal(['July'], getline(1,'$'))
193eb992cb9SBram Moolenaar  " 1) Test completion when InsertCharPre kicks in
194eb992cb9SBram Moolenaar  %d
195eb992cb9SBram Moolenaar  call setline(1, 'J')
196eb992cb9SBram Moolenaar  fu! DoIt()
197eb992cb9SBram Moolenaar    if v:char=='u'
198eb992cb9SBram Moolenaar      let v:char='an'
199eb992cb9SBram Moolenaar    endif
200eb992cb9SBram Moolenaar  endfu
201eb992cb9SBram Moolenaar  au InsertCharPre <buffer> :call DoIt()
202eb992cb9SBram Moolenaar  call feedkeys("A\<f5>\<c-p>u\<cr>\<c-l>\<cr>", 'tx')
2034c313b13SBram Moolenaar  call assert_equal(["Jan\<c-l>",''], 1->getline('$'))
204eb992cb9SBram Moolenaar  %d
205eb992cb9SBram Moolenaar  call setline(1, 'J')
206eb992cb9SBram Moolenaar  call feedkeys("A\<f5>\<c-p>u\<down>\<c-l>\<cr>", 'tx')
2074c313b13SBram Moolenaar  call assert_equal(["January"], 1->getline('$'))
208eb992cb9SBram Moolenaar
209eb992cb9SBram Moolenaar  delfu ListMonths
210eb992cb9SBram Moolenaar  delfu DoIt
211eb992cb9SBram Moolenaar  iunmap <buffer> <f5>
212eb992cb9SBram Moolenaar  bw!
213eb992cb9SBram Moolenaarendfunc
214eb992cb9SBram Moolenaar
2151e115360SBram Moolenaarfunc Test_edit_08()
216eb992cb9SBram Moolenaar  " reset insertmode from i_ctrl-r_=
2172a45d64dSBram Moolenaar  let g:bufnr = bufnr('%')
218eb992cb9SBram Moolenaar  new
219eb992cb9SBram Moolenaar  call setline(1, ['abc'])
220eb992cb9SBram Moolenaar  call cursor(1, 4)
2212a45d64dSBram Moolenaar  call feedkeys(":set im\<cr>ZZZ\<c-r>=setbufvar(g:bufnr,'&im', 0)\<cr>",'tnix')
222eb992cb9SBram Moolenaar  call assert_equal(['abZZZc'], getline(1,'$'))
223eb992cb9SBram Moolenaar  call assert_equal([0, 1, 1, 0], getpos('.'))
224eb992cb9SBram Moolenaar  call assert_false(0, '&im')
225eb992cb9SBram Moolenaar  bw!
2262a45d64dSBram Moolenaar  unlet g:bufnr
227eb992cb9SBram Moolenaarendfunc
228eb992cb9SBram Moolenaar
2291e115360SBram Moolenaarfunc Test_edit_09()
230eb992cb9SBram Moolenaar  " test i_CTRL-\ combinations
231eb992cb9SBram Moolenaar  new
232eb992cb9SBram Moolenaar  call setline(1, ['abc', 'def', 'ghi'])
233eb992cb9SBram Moolenaar  call cursor(1, 1)
234eb992cb9SBram Moolenaar  " 1) CTRL-\ CTLR-N
235eb992cb9SBram Moolenaar  call feedkeys(":set im\<cr>\<c-\>\<c-n>ccABC\<c-l>", 'txin')
236eb992cb9SBram Moolenaar  call assert_equal(['ABC', 'def', 'ghi'], getline(1,'$'))
237eb992cb9SBram Moolenaar  call setline(1, ['ABC', 'def', 'ghi'])
238eb992cb9SBram Moolenaar  " 2) CTRL-\ CTLR-G
239eb992cb9SBram Moolenaar  call feedkeys("j0\<c-\>\<c-g>ZZZ\<cr>\<c-l>", 'txin')
240eb992cb9SBram Moolenaar  call assert_equal(['ABC', 'ZZZ', 'def', 'ghi'], getline(1,'$'))
241eb992cb9SBram Moolenaar  call feedkeys("I\<c-\>\<c-g>YYY\<c-l>", 'txin')
242eb992cb9SBram Moolenaar  call assert_equal(['ABC', 'ZZZ', 'YYYdef', 'ghi'], getline(1,'$'))
243eb992cb9SBram Moolenaar  set noinsertmode
244eb992cb9SBram Moolenaar  " 3) CTRL-\ CTRL-O
245eb992cb9SBram Moolenaar  call setline(1, ['ABC', 'ZZZ', 'def', 'ghi'])
246eb992cb9SBram Moolenaar  call cursor(1, 1)
247eb992cb9SBram Moolenaar  call feedkeys("A\<c-o>ix", 'txin')
248eb992cb9SBram Moolenaar  call assert_equal(['ABxC', 'ZZZ', 'def', 'ghi'], getline(1,'$'))
249eb992cb9SBram Moolenaar  call feedkeys("A\<c-\>\<c-o>ix", 'txin')
250eb992cb9SBram Moolenaar  call assert_equal(['ABxCx', 'ZZZ', 'def', 'ghi'], getline(1,'$'))
251eb992cb9SBram Moolenaar  " 4) CTRL-\ a (should be inserted literally, not special after <c-\>
252eb992cb9SBram Moolenaar  call setline(1, ['ABC', 'ZZZ', 'def', 'ghi'])
253eb992cb9SBram Moolenaar  call cursor(1, 1)
254eb992cb9SBram Moolenaar  call feedkeys("A\<c-\>a", 'txin')
255eb992cb9SBram Moolenaar  call assert_equal(["ABC\<c-\>a", 'ZZZ', 'def', 'ghi'], getline(1, '$'))
256eb992cb9SBram Moolenaar  bw!
257eb992cb9SBram Moolenaarendfunc
258eb992cb9SBram Moolenaar
2591e115360SBram Moolenaarfunc Test_edit_11()
260eb992cb9SBram Moolenaar  " Test that indenting kicks in
261eb992cb9SBram Moolenaar  new
262eb992cb9SBram Moolenaar  set cindent
263eb992cb9SBram Moolenaar  call setline(1, ['{', '', ''])
264eb992cb9SBram Moolenaar  call cursor(2, 1)
265eb992cb9SBram Moolenaar  call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
266eb992cb9SBram Moolenaar  call cursor(3, 1)
2671671f448SBram Moolenaar  call feedkeys("\<Insert>/* comment */", 'tnix')
268eb992cb9SBram Moolenaar  call assert_equal(['{', "\<tab>int c;", "/* comment */"], getline(1, '$'))
269eb992cb9SBram Moolenaar  " added changed cindentkeys slightly
270eb992cb9SBram Moolenaar  set cindent cinkeys+=*/
271eb992cb9SBram Moolenaar  call setline(1, ['{', '', ''])
272eb992cb9SBram Moolenaar  call cursor(2, 1)
273eb992cb9SBram Moolenaar  call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
274eb992cb9SBram Moolenaar  call cursor(3, 1)
275eb992cb9SBram Moolenaar  call feedkeys("i/* comment */", 'tnix')
276eb992cb9SBram Moolenaar  call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */"], getline(1, '$'))
277eb992cb9SBram Moolenaar  set cindent cinkeys+==end
278eb992cb9SBram Moolenaar  call feedkeys("oend\<cr>\<esc>", 'tnix')
279eb992cb9SBram Moolenaar  call assert_equal(['{', "\<tab>int c;", "\<tab>/* comment */", "\tend", ''], getline(1, '$'))
280eb992cb9SBram Moolenaar  set cinkeys-==end
281eb992cb9SBram Moolenaar  %d
282eb992cb9SBram Moolenaar  " Use indentexpr instead of cindenting
283eb992cb9SBram Moolenaar  func! Do_Indent()
284eb992cb9SBram Moolenaar    if v:lnum == 3
285eb992cb9SBram Moolenaar      return 3*shiftwidth()
286eb992cb9SBram Moolenaar    else
287eb992cb9SBram Moolenaar      return 2*shiftwidth()
288eb992cb9SBram Moolenaar    endif
289eb992cb9SBram Moolenaar  endfunc
290eb992cb9SBram Moolenaar  setl indentexpr=Do_Indent() indentkeys+=*/
291eb992cb9SBram Moolenaar  call setline(1, ['{', '', ''])
292eb992cb9SBram Moolenaar  call cursor(2, 1)
293eb992cb9SBram Moolenaar  call feedkeys("i\<c-f>int c;\<esc>", 'tnix')
294eb992cb9SBram Moolenaar  call cursor(3, 1)
295eb992cb9SBram Moolenaar  call feedkeys("i/* comment */", 'tnix')
296eb992cb9SBram Moolenaar  call assert_equal(['{', "\<tab>\<tab>int c;", "\<tab>\<tab>\<tab>/* comment */"], getline(1, '$'))
297eb992cb9SBram Moolenaar  set cinkeys&vim indentkeys&vim
298eb992cb9SBram Moolenaar  set nocindent indentexpr=
299eb992cb9SBram Moolenaar  delfu Do_Indent
300eb992cb9SBram Moolenaar  bw!
301eb992cb9SBram Moolenaarendfunc
302eb992cb9SBram Moolenaar
3031e115360SBram Moolenaarfunc Test_edit_11_indentexpr()
3041b38344eSBram Moolenaar  " Test that indenting kicks in
3051b38344eSBram Moolenaar  new
3061b38344eSBram Moolenaar  " Use indentexpr instead of cindenting
3071b38344eSBram Moolenaar  func! Do_Indent()
3081b38344eSBram Moolenaar    let pline=prevnonblank(v:lnum)
3091b38344eSBram Moolenaar    if empty(getline(v:lnum))
3101b38344eSBram Moolenaar      if getline(pline) =~ 'if\|then'
3111b38344eSBram Moolenaar        return shiftwidth()
3121b38344eSBram Moolenaar      else
3131b38344eSBram Moolenaar        return 0
3141b38344eSBram Moolenaar      endif
3151b38344eSBram Moolenaar    else
3161b38344eSBram Moolenaar        return 0
3171b38344eSBram Moolenaar    endif
3181b38344eSBram Moolenaar  endfunc
3191b38344eSBram Moolenaar  setl indentexpr=Do_Indent() indentkeys+=0=then,0=fi
3201b38344eSBram Moolenaar  call setline(1, ['if [ $this ]'])
3211b38344eSBram Moolenaar  call cursor(1, 1)
3221b38344eSBram Moolenaar  call feedkeys("othen\<cr>that\<cr>fi", 'tnix')
3231b38344eSBram Moolenaar  call assert_equal(['if [ $this ]', "then", "\<tab>that", "fi"], getline(1, '$'))
3241b38344eSBram Moolenaar  set cinkeys&vim indentkeys&vim
3251b38344eSBram Moolenaar  set nocindent indentexpr=
3261b38344eSBram Moolenaar  delfu Do_Indent
3271b38344eSBram Moolenaar  bw!
3281b38344eSBram Moolenaarendfunc
3291b38344eSBram Moolenaar
330eb992cb9SBram Moolenaar" Test changing indent in replace mode
331f9ab52e1SBram Moolenaarfunc Test_edit_12()
332eb992cb9SBram Moolenaar  new
333eb992cb9SBram Moolenaar  call setline(1, ["\tabc", "\tdef"])
334eb992cb9SBram Moolenaar  call cursor(2, 4)
335eb992cb9SBram Moolenaar  call feedkeys("R^\<c-d>", 'tnix')
336eb992cb9SBram Moolenaar  call assert_equal(["\tabc", "def"], getline(1, '$'))
3374c313b13SBram Moolenaar  call assert_equal([0, 2, 2, 0], '.'->getpos())
338eb992cb9SBram Moolenaar  %d
339eb992cb9SBram Moolenaar  call setline(1, ["\tabc", "\t\tdef"])
340eb992cb9SBram Moolenaar  call cursor(2, 2)
341eb992cb9SBram Moolenaar  call feedkeys("R^\<c-d>", 'tnix')
342eb992cb9SBram Moolenaar  call assert_equal(["\tabc", "def"], getline(1, '$'))
343eb992cb9SBram Moolenaar  call assert_equal([0, 2, 1, 0], getpos('.'))
344eb992cb9SBram Moolenaar  %d
345eb992cb9SBram Moolenaar  call setline(1, ["\tabc", "\t\tdef"])
346eb992cb9SBram Moolenaar  call cursor(2, 2)
347eb992cb9SBram Moolenaar  call feedkeys("R\<c-t>", 'tnix')
348eb992cb9SBram Moolenaar  call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
349eb992cb9SBram Moolenaar  call assert_equal([0, 2, 2, 0], getpos('.'))
350eb992cb9SBram Moolenaar  bw!
351eb992cb9SBram Moolenaar  10vnew
352eb992cb9SBram Moolenaar  call setline(1, ["\tabc", "\t\tdef"])
353eb992cb9SBram Moolenaar  call cursor(2, 2)
354eb992cb9SBram Moolenaar  call feedkeys("R\<c-t>", 'tnix')
355eb992cb9SBram Moolenaar  call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
356eb992cb9SBram Moolenaar  call assert_equal([0, 2, 2, 0], getpos('.'))
357eb992cb9SBram Moolenaar  %d
358eb992cb9SBram Moolenaar  set sw=4
359eb992cb9SBram Moolenaar  call setline(1, ["\tabc", "\t\tdef"])
360eb992cb9SBram Moolenaar  call cursor(2, 2)
361eb992cb9SBram Moolenaar  call feedkeys("R\<c-t>\<c-t>", 'tnix')
362eb992cb9SBram Moolenaar  call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
363eb992cb9SBram Moolenaar  call assert_equal([0, 2, 2, 0], getpos('.'))
364eb992cb9SBram Moolenaar  %d
365eb992cb9SBram Moolenaar  call setline(1, ["\tabc", "\t\tdef"])
366eb992cb9SBram Moolenaar  call cursor(2, 2)
367eb992cb9SBram Moolenaar  call feedkeys("R\<c-t>\<c-t>", 'tnix')
368eb992cb9SBram Moolenaar  call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$'))
369eb992cb9SBram Moolenaar  call assert_equal([0, 2, 2, 0], getpos('.'))
370f9ab52e1SBram Moolenaar  set sw&
371f9ab52e1SBram Moolenaar
372f9ab52e1SBram Moolenaar  " In replace mode, after hitting enter in a line with tab characters,
373f9ab52e1SBram Moolenaar  " pressing backspace should restore the tab characters.
374eb992cb9SBram Moolenaar  %d
375f9ab52e1SBram Moolenaar  setlocal autoindent backspace=2
376f9ab52e1SBram Moolenaar  call setline(1, "\tone\t\ttwo")
377f9ab52e1SBram Moolenaar  exe "normal ggRred\<CR>six" .. repeat("\<BS>", 8)
378f9ab52e1SBram Moolenaar  call assert_equal(["\tone\t\ttwo"], getline(1, '$'))
379eb992cb9SBram Moolenaar  bw!
380eb992cb9SBram Moolenaarendfunc
381eb992cb9SBram Moolenaar
3821e115360SBram Moolenaarfunc Test_edit_13()
383eb992cb9SBram Moolenaar  " Test smartindenting
384eb992cb9SBram Moolenaar  if exists("+smartindent")
385eb992cb9SBram Moolenaar    new
386eb992cb9SBram Moolenaar    set smartindent autoindent
387eb992cb9SBram Moolenaar    call setline(1, ["\tabc"])
388eb992cb9SBram Moolenaar    call feedkeys("A {\<cr>more\<cr>}\<esc>", 'tnix')
389eb992cb9SBram Moolenaar    call assert_equal(["\tabc {", "\t\tmore", "\t}"], getline(1, '$'))
390eb992cb9SBram Moolenaar    set smartindent& autoindent&
3912ba42388SBram Moolenaar    bwipe!
392eb992cb9SBram Moolenaar  endif
3932ba42388SBram Moolenaar
3942ba42388SBram Moolenaar  " Test autoindent removing indent of blank line.
3952ba42388SBram Moolenaar  new
3962ba42388SBram Moolenaar  call setline(1, '    foo bar baz')
3972ba42388SBram Moolenaar  set autoindent
3982ba42388SBram Moolenaar  exe "normal 0eea\<CR>\<CR>\<Esc>"
3992ba42388SBram Moolenaar  call assert_equal("    foo bar", getline(1))
4002ba42388SBram Moolenaar  call assert_equal("", getline(2))
4012ba42388SBram Moolenaar  call assert_equal("    baz", getline(3))
4022ba42388SBram Moolenaar  set autoindent&
403845e0ee5SBram Moolenaar
404845e0ee5SBram Moolenaar  " pressing <C-U> to erase line should keep the indent with 'autoindent'
405845e0ee5SBram Moolenaar  set backspace=2 autoindent
406845e0ee5SBram Moolenaar  %d
407845e0ee5SBram Moolenaar  exe "normal i\tone\<CR>three\<C-U>two"
408845e0ee5SBram Moolenaar  call assert_equal(["\tone", "\ttwo"], getline(1, '$'))
409845e0ee5SBram Moolenaar  set backspace& autoindent&
410845e0ee5SBram Moolenaar
4112ba42388SBram Moolenaar  bwipe!
412eb992cb9SBram Moolenaarendfunc
413eb992cb9SBram Moolenaar
4141f448d90SBram Moolenaar" Test for autoindent removing indent when insert mode is stopped.  Some parts
4151f448d90SBram Moolenaar" of the code is exercised only when interactive mode is used. So use Vim in a
4161f448d90SBram Moolenaar" terminal.
4171f448d90SBram Moolenaarfunc Test_autoindent_remove_indent()
4181f448d90SBram Moolenaar  CheckRunVimInTerminal
4191f448d90SBram Moolenaar  let buf = RunVimInTerminal('-N Xfile', {'rows': 6, 'cols' : 20})
4201f448d90SBram Moolenaar  call TermWait(buf)
4211f448d90SBram Moolenaar  call term_sendkeys(buf, ":set autoindent\n")
4221f448d90SBram Moolenaar  " leaving insert mode in a new line with indent added by autoindent, should
4231f448d90SBram Moolenaar  " remove the indent.
4241f448d90SBram Moolenaar  call term_sendkeys(buf, "i\<Tab>foo\<CR>\<Esc>")
4251f448d90SBram Moolenaar  " Need to delay for sometime, otherwise the code in getchar.c will not be
4261f448d90SBram Moolenaar  " exercised.
4271f448d90SBram Moolenaar  call TermWait(buf, 50)
4281f448d90SBram Moolenaar  " when a line is wrapped and the cursor is at the start of the second line,
4291f448d90SBram Moolenaar  " leaving insert mode, should move the cursor back to the first line.
4301f448d90SBram Moolenaar  call term_sendkeys(buf, "o" .. repeat('x', 20) .. "\<Esc>")
4311f448d90SBram Moolenaar  " Need to delay for sometime, otherwise the code in getchar.c will not be
4321f448d90SBram Moolenaar  " exercised.
4331f448d90SBram Moolenaar  call TermWait(buf, 50)
4341f448d90SBram Moolenaar  call term_sendkeys(buf, ":w\n")
4351f448d90SBram Moolenaar  call TermWait(buf)
4361f448d90SBram Moolenaar  call StopVimInTerminal(buf)
4371f448d90SBram Moolenaar  call assert_equal(["\tfoo", '', repeat('x', 20)], readfile('Xfile'))
4381f448d90SBram Moolenaar  call delete('Xfile')
4391f448d90SBram Moolenaarendfunc
4401f448d90SBram Moolenaar
4411e115360SBram Moolenaarfunc Test_edit_CR()
442eb992cb9SBram Moolenaar  " Test for <CR> in insert mode
443eb992cb9SBram Moolenaar  " basically only in quickfix mode ist tested, the rest
444eb992cb9SBram Moolenaar  " has been taken care of by other tests
4456d91bcb4SBram Moolenaar  CheckFeature quickfix
446eb992cb9SBram Moolenaar  botright new
447eb992cb9SBram Moolenaar  call writefile(range(1, 10), 'Xqflist.txt')
448eb992cb9SBram Moolenaar  call setqflist([{'filename': 'Xqflist.txt', 'lnum': 2}])
449eb992cb9SBram Moolenaar  copen
450eb992cb9SBram Moolenaar  set modifiable
451eb992cb9SBram Moolenaar  call feedkeys("A\<cr>", 'tnix')
452eb992cb9SBram Moolenaar  call assert_equal('Xqflist.txt', bufname(''))
453eb992cb9SBram Moolenaar  call assert_equal(2, line('.'))
454eb992cb9SBram Moolenaar  cclose
455eb992cb9SBram Moolenaar  botright new
456eb992cb9SBram Moolenaar  call setloclist(0, [{'filename': 'Xqflist.txt', 'lnum': 10}])
457eb992cb9SBram Moolenaar  lopen
458eb992cb9SBram Moolenaar  set modifiable
459eb992cb9SBram Moolenaar  call feedkeys("A\<cr>", 'tnix')
460eb992cb9SBram Moolenaar  call assert_equal('Xqflist.txt', bufname(''))
461eb992cb9SBram Moolenaar  call assert_equal(10, line('.'))
462eb992cb9SBram Moolenaar  call feedkeys("A\<Enter>", 'tnix')
463eb992cb9SBram Moolenaar  call feedkeys("A\<kEnter>", 'tnix')
464eb992cb9SBram Moolenaar  call feedkeys("A\n", 'tnix')
465eb992cb9SBram Moolenaar  call feedkeys("A\r", 'tnix')
466eb992cb9SBram Moolenaar  call assert_equal(map(range(1, 10), 'string(v:val)') + ['', '', '', ''], getline(1, '$'))
467eb992cb9SBram Moolenaar  bw!
468eb992cb9SBram Moolenaar  lclose
469eb992cb9SBram Moolenaar  call delete('Xqflist.txt')
470eb992cb9SBram Moolenaarendfunc
471eb992cb9SBram Moolenaar
4721e115360SBram Moolenaarfunc Test_edit_CTRL_()
4736d91bcb4SBram Moolenaar  CheckFeature rightleft
474eb992cb9SBram Moolenaar  " disabled for Windows builds, why?
4756d91bcb4SBram Moolenaar  CheckNotMSWindows
476eb992cb9SBram Moolenaar  let _encoding=&encoding
477eb992cb9SBram Moolenaar  set encoding=utf-8
478eb992cb9SBram Moolenaar  " Test for CTRL-_
479eb992cb9SBram Moolenaar  new
480eb992cb9SBram Moolenaar  call setline(1, ['abc'])
481eb992cb9SBram Moolenaar  call cursor(1, 1)
482eb992cb9SBram Moolenaar  call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
483eb992cb9SBram Moolenaar  call assert_equal(["\<C-_>xyzabc"], getline(1, '$'))
484eb992cb9SBram Moolenaar  call assert_false(&revins)
485eb992cb9SBram Moolenaar  set ari
486eb992cb9SBram Moolenaar  call setline(1, ['abc'])
487eb992cb9SBram Moolenaar  call cursor(1, 1)
488eb992cb9SBram Moolenaar  call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
489eb992cb9SBram Moolenaar  call assert_equal(["æèñabc"], getline(1, '$'))
490eb992cb9SBram Moolenaar  call assert_true(&revins)
491eb992cb9SBram Moolenaar  call setline(1, ['abc'])
492eb992cb9SBram Moolenaar  call cursor(1, 1)
493eb992cb9SBram Moolenaar  call feedkeys("i\<c-_>xyz\<esc>", 'tnix')
494eb992cb9SBram Moolenaar  call assert_equal(["xyzabc"], getline(1, '$'))
495eb992cb9SBram Moolenaar  call assert_false(&revins)
496eb992cb9SBram Moolenaar  set noari
497eb992cb9SBram Moolenaar  let &encoding=_encoding
498eb992cb9SBram Moolenaar  bw!
499eb992cb9SBram Moolenaarendfunc
500eb992cb9SBram Moolenaar
501eb992cb9SBram Moolenaar" needs to come first, to have the @. register empty
5021e115360SBram Moolenaarfunc Test_edit_00a_CTRL_A()
503eb992cb9SBram Moolenaar  " Test pressing CTRL-A
504eb992cb9SBram Moolenaar  new
505eb992cb9SBram Moolenaar  call setline(1, repeat([''], 5))
506eb992cb9SBram Moolenaar  call cursor(1, 1)
507eb992cb9SBram Moolenaar  try
508eb992cb9SBram Moolenaar    call feedkeys("A\<NUL>", 'tnix')
509eb992cb9SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E29/
510eb992cb9SBram Moolenaar    call assert_true(1, 'E29 error caught')
511eb992cb9SBram Moolenaar  endtry
512eb992cb9SBram Moolenaar  call cursor(1, 1)
513eb992cb9SBram Moolenaar  call feedkeys("Afoobar \<esc>", 'tnix')
514eb992cb9SBram Moolenaar  call cursor(2, 1)
515eb992cb9SBram Moolenaar  call feedkeys("A\<c-a>more\<esc>", 'tnix')
516eb992cb9SBram Moolenaar  call cursor(3, 1)
517eb992cb9SBram Moolenaar  call feedkeys("A\<NUL>and more\<esc>", 'tnix')
518eb992cb9SBram Moolenaar  call assert_equal(['foobar ', 'foobar more', 'foobar morend more', '', ''], getline(1, '$'))
519eb992cb9SBram Moolenaar  bw!
520eb992cb9SBram Moolenaarendfunc
521eb992cb9SBram Moolenaar
5221e115360SBram Moolenaarfunc Test_edit_CTRL_EY()
523eb992cb9SBram Moolenaar  " Ctrl-E/ Ctrl-Y in insert mode completion to scroll
524eb992cb9SBram Moolenaar  10new
525eb992cb9SBram Moolenaar  call setline(1, range(1, 100))
526eb992cb9SBram Moolenaar  call cursor(30, 1)
527eb992cb9SBram Moolenaar  norm! z.
528eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix')
529eb992cb9SBram Moolenaar  call assert_equal(30, winsaveview()['topline'])
530eb992cb9SBram Moolenaar  call assert_equal([0, 30, 2, 0], getpos('.'))
531eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-e>\<c-e>\<c-e>\<c-e>\<c-e>", 'tnix')
532eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>".repeat("\<c-y>", 10), 'tnix')
533eb992cb9SBram Moolenaar  call assert_equal(21, winsaveview()['topline'])
534eb992cb9SBram Moolenaar  call assert_equal([0, 30, 2, 0], getpos('.'))
535eb992cb9SBram Moolenaar  bw!
536eb992cb9SBram Moolenaarendfunc
537eb992cb9SBram Moolenaar
5381e115360SBram Moolenaarfunc Test_edit_CTRL_G()
539eb992cb9SBram Moolenaar  new
540eb992cb9SBram Moolenaar  call setline(1, ['foobar', 'foobar', 'foobar'])
541eb992cb9SBram Moolenaar  call cursor(2, 4)
542eb992cb9SBram Moolenaar  call feedkeys("ioooooooo\<c-g>k\<c-r>.\<esc>", 'tnix')
543eb992cb9SBram Moolenaar  call assert_equal(['foooooooooobar', 'foooooooooobar', 'foobar'], getline(1, '$'))
544eb992cb9SBram Moolenaar  call assert_equal([0, 1, 11, 0], getpos('.'))
545eb992cb9SBram Moolenaar  call feedkeys("i\<c-g>k\<esc>", 'tnix')
546eb992cb9SBram Moolenaar  call assert_equal([0, 1, 10, 0], getpos('.'))
547eb992cb9SBram Moolenaar  call cursor(2, 4)
548eb992cb9SBram Moolenaar  call feedkeys("i\<c-g>jzzzz\<esc>", 'tnix')
549eb992cb9SBram Moolenaar  call assert_equal(['foooooooooobar', 'foooooooooobar', 'foozzzzbar'], getline(1, '$'))
550eb992cb9SBram Moolenaar  call assert_equal([0, 3, 7, 0], getpos('.'))
551eb992cb9SBram Moolenaar  call feedkeys("i\<c-g>j\<esc>", 'tnix')
552eb992cb9SBram Moolenaar  call assert_equal([0, 3, 6, 0], getpos('.'))
553eb992cb9SBram Moolenaar  bw!
554eb992cb9SBram Moolenaarendfunc
555eb992cb9SBram Moolenaar
5561e115360SBram Moolenaarfunc Test_edit_CTRL_I()
557eb992cb9SBram Moolenaar  " Tab in completion mode
558eb992cb9SBram Moolenaar  let path=expand("%:p:h")
559eb992cb9SBram Moolenaar  new
560eb992cb9SBram Moolenaar  call setline(1, [path. "/", ''])
561c5379471SBram Moolenaar  call feedkeys("Arunt\<c-x>\<c-f>\<tab>\<cr>\<esc>", 'tnix')
562c5379471SBram Moolenaar  call assert_match('runtest\.vim', getline(1))
563eb992cb9SBram Moolenaar  %d
564eb992cb9SBram Moolenaar  call writefile(['one', 'two', 'three'], 'Xinclude.txt')
565eb992cb9SBram Moolenaar  let include='#include Xinclude.txt'
566eb992cb9SBram Moolenaar  call setline(1, [include, ''])
567eb992cb9SBram Moolenaar  call cursor(2, 1)
568eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<tab>\<cr>\<esc>", 'tnix')
569eb992cb9SBram Moolenaar  call assert_equal([include, 'one', ''], getline(1, '$'))
570eb992cb9SBram Moolenaar  call feedkeys("2ggC\<c-x>\<tab>\<down>\<cr>\<esc>", 'tnix')
571eb992cb9SBram Moolenaar  call assert_equal([include, 'two', ''], getline(1, '$'))
572eb992cb9SBram Moolenaar  call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<cr>\<esc>", 'tnix')
573eb992cb9SBram Moolenaar  call assert_equal([include, 'three', ''], getline(1, '$'))
574eb992cb9SBram Moolenaar  call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
575eb992cb9SBram Moolenaar  call assert_equal([include, '', ''], getline(1, '$'))
576eb992cb9SBram Moolenaar  call delete("Xinclude.txt")
577eb992cb9SBram Moolenaar  bw!
578eb992cb9SBram Moolenaarendfunc
579eb992cb9SBram Moolenaar
5801e115360SBram Moolenaarfunc Test_edit_CTRL_K()
581eb992cb9SBram Moolenaar  " Test pressing CTRL-K (basically only dictionary completion and digraphs
582eb992cb9SBram Moolenaar  " the rest is already covered
583eb992cb9SBram Moolenaar  call writefile(['A', 'AA', 'AAA', 'AAAA'], 'Xdictionary.txt')
584eb992cb9SBram Moolenaar  set dictionary=Xdictionary.txt
585eb992cb9SBram Moolenaar  new
586eb992cb9SBram Moolenaar  call setline(1, 'A')
587eb992cb9SBram Moolenaar  call cursor(1, 1)
588eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-k>\<cr>\<esc>", 'tnix')
589eb992cb9SBram Moolenaar  call assert_equal(['AA', ''], getline(1, '$'))
590eb992cb9SBram Moolenaar  %d
591eb992cb9SBram Moolenaar  call setline(1, 'A')
592eb992cb9SBram Moolenaar  call cursor(1, 1)
593eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-k>\<down>\<cr>\<esc>", 'tnix')
594eb992cb9SBram Moolenaar  call assert_equal(['AAA'], getline(1, '$'))
595eb992cb9SBram Moolenaar  %d
596eb992cb9SBram Moolenaar  call setline(1, 'A')
597eb992cb9SBram Moolenaar  call cursor(1, 1)
598eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<cr>\<esc>", 'tnix')
599eb992cb9SBram Moolenaar  call assert_equal(['AAAA'], getline(1, '$'))
600eb992cb9SBram Moolenaar  %d
601eb992cb9SBram Moolenaar  call setline(1, 'A')
602eb992cb9SBram Moolenaar  call cursor(1, 1)
603eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
604eb992cb9SBram Moolenaar  call assert_equal(['A'], getline(1, '$'))
605eb992cb9SBram Moolenaar  %d
606eb992cb9SBram Moolenaar  call setline(1, 'A')
607eb992cb9SBram Moolenaar  call cursor(1, 1)
608eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
609eb992cb9SBram Moolenaar  call assert_equal(['AA'], getline(1, '$'))
610eb992cb9SBram Moolenaar
6114b96df5aSBram Moolenaar  " press an unexpected key after dictionary completion
612eb992cb9SBram Moolenaar  %d
613eb992cb9SBram Moolenaar  call setline(1, 'A')
614eb992cb9SBram Moolenaar  call cursor(1, 1)
615eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-k>\<c-]>\<cr>\<esc>", 'tnix')
616eb992cb9SBram Moolenaar  call assert_equal(['AA', ''], getline(1, '$'))
617eb992cb9SBram Moolenaar  %d
618eb992cb9SBram Moolenaar  call setline(1, 'A')
619eb992cb9SBram Moolenaar  call cursor(1, 1)
620eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-k>\<c-s>\<cr>\<esc>", 'tnix')
621eb992cb9SBram Moolenaar  call assert_equal(["AA\<c-s>", ''], getline(1, '$'))
622eb992cb9SBram Moolenaar  %d
623eb992cb9SBram Moolenaar  call setline(1, 'A')
624eb992cb9SBram Moolenaar  call cursor(1, 1)
625eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-k>\<c-f>\<cr>\<esc>", 'tnix')
626eb992cb9SBram Moolenaar  call assert_equal(["AA\<c-f>", ''], getline(1, '$'))
627eb992cb9SBram Moolenaar
628eb992cb9SBram Moolenaar  set dictionary=
629eb992cb9SBram Moolenaar  %d
630eb992cb9SBram Moolenaar  call setline(1, 'A')
631eb992cb9SBram Moolenaar  call cursor(1, 1)
632eb992cb9SBram Moolenaar  let v:testing = 1
633eb992cb9SBram Moolenaar  try
634eb992cb9SBram Moolenaar    call feedkeys("A\<c-x>\<c-k>\<esc>", 'tnix')
635eb992cb9SBram Moolenaar  catch
636eb992cb9SBram Moolenaar    " error sleeps 2 seconds, when v:testing is not set
637eb992cb9SBram Moolenaar    let v:testing = 0
638eb992cb9SBram Moolenaar  endtry
639eb992cb9SBram Moolenaar  call delete('Xdictionary.txt')
640eb992cb9SBram Moolenaar
641eb992cb9SBram Moolenaar  call test_override("char_avail", 1)
642eb992cb9SBram Moolenaar  set showcmd
643eb992cb9SBram Moolenaar  %d
644eb992cb9SBram Moolenaar  call feedkeys("A\<c-k>a:\<esc>", 'tnix')
645eb992cb9SBram Moolenaar  call assert_equal(['ä'], getline(1, '$'))
646eb992cb9SBram Moolenaar  call test_override("char_avail", 0)
647eb992cb9SBram Moolenaar  set noshowcmd
64830276f2bSBram Moolenaar
649eb992cb9SBram Moolenaar  bw!
650eb992cb9SBram Moolenaarendfunc
651eb992cb9SBram Moolenaar
6521e115360SBram Moolenaarfunc Test_edit_CTRL_L()
653eb992cb9SBram Moolenaar  " Test Ctrl-X Ctrl-L (line completion)
654eb992cb9SBram Moolenaar  new
655eb992cb9SBram Moolenaar  set complete=.
656eb992cb9SBram Moolenaar  call setline(1, ['one', 'two', 'three', '', '', '', ''])
657eb992cb9SBram Moolenaar  call cursor(4, 1)
658eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-l>\<esc>", 'tnix')
659eb992cb9SBram Moolenaar  call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
660eb992cb9SBram Moolenaar  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<esc>", 'tnix')
661eb992cb9SBram Moolenaar  call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
662eb992cb9SBram Moolenaar  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<esc>", 'tnix')
663eb992cb9SBram Moolenaar  call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$'))
66402ae9b4aSBram Moolenaar  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
665eb992cb9SBram Moolenaar  call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
66602ae9b4aSBram Moolenaar  call feedkeys("cct\<c-x>\<c-l>\<c-n>\<c-n>\<c-n>\<c-n>\<esc>", 'tnix')
66702ae9b4aSBram Moolenaar  call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
668eb992cb9SBram Moolenaar  call feedkeys("cct\<c-x>\<c-l>\<c-p>\<esc>", 'tnix')
669eb992cb9SBram Moolenaar  call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$'))
670eb992cb9SBram Moolenaar  call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<esc>", 'tnix')
671eb992cb9SBram Moolenaar  call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$'))
672eb992cb9SBram Moolenaar  call feedkeys("cct\<c-x>\<c-l>\<c-p>\<c-p>\<c-p>\<esc>", 'tnix')
673eb992cb9SBram Moolenaar  call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$'))
674eb992cb9SBram Moolenaar  set complete=
675eb992cb9SBram Moolenaar  call cursor(5, 1)
676eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-l>\<c-p>\<c-n>\<esc>", 'tnix')
677eb992cb9SBram Moolenaar  call assert_equal(['one', 'two', 'three', 'three', "\<c-l>\<c-p>\<c-n>", '', ''], getline(1, '$'))
678eb992cb9SBram Moolenaar  set complete&
679eb992cb9SBram Moolenaar  %d
680eb992cb9SBram Moolenaar  if has("conceal") && has("syntax")
681eb992cb9SBram Moolenaar    call setline(1, ['foo', 'bar', 'foobar'])
682eb992cb9SBram Moolenaar    call test_override("char_avail", 1)
683eb992cb9SBram Moolenaar    set conceallevel=2 concealcursor=n
684eb992cb9SBram Moolenaar    syn on
685eb992cb9SBram Moolenaar    syn match ErrorMsg "^bar"
686eb992cb9SBram Moolenaar    call matchadd("Conceal", 'oo', 10, -1, {'conceal': 'X'})
687eb992cb9SBram Moolenaar    func! DoIt()
688eb992cb9SBram Moolenaar      let g:change=1
689eb992cb9SBram Moolenaar    endfunc
690eb992cb9SBram Moolenaar    au! TextChangedI <buffer> :call DoIt()
691eb992cb9SBram Moolenaar
692eb992cb9SBram Moolenaar    call cursor(2, 1)
693eb992cb9SBram Moolenaar    call assert_false(exists("g:change"))
694eb992cb9SBram Moolenaar    call feedkeys("A \<esc>", 'tnix')
695eb992cb9SBram Moolenaar    call assert_equal(['foo', 'bar ', 'foobar'], getline(1, '$'))
696eb992cb9SBram Moolenaar    call assert_equal(1, g:change)
697eb992cb9SBram Moolenaar
698eb992cb9SBram Moolenaar    call test_override("char_avail", 0)
699eb992cb9SBram Moolenaar    call clearmatches()
700eb992cb9SBram Moolenaar    syn off
701eb992cb9SBram Moolenaar    au! TextChangedI
702eb992cb9SBram Moolenaar    delfu DoIt
703eb992cb9SBram Moolenaar    unlet! g:change
704eb992cb9SBram Moolenaar  endif
705eb992cb9SBram Moolenaar  bw!
706eb992cb9SBram Moolenaarendfunc
707eb992cb9SBram Moolenaar
7081e115360SBram Moolenaarfunc Test_edit_CTRL_N()
709eb992cb9SBram Moolenaar  " Check keyword completion
710a1070eaeSBram Moolenaar  for e in ['latin1', 'utf-8']
711a1070eaeSBram Moolenaar    exe 'set encoding=' .. e
712eb992cb9SBram Moolenaar    new
713eb992cb9SBram Moolenaar    set complete=.
714eb992cb9SBram Moolenaar    call setline(1, ['INFER', 'loWER', '', '', ])
715eb992cb9SBram Moolenaar    call cursor(3, 1)
716eb992cb9SBram Moolenaar    call feedkeys("Ai\<c-n>\<cr>\<esc>", "tnix")
717eb992cb9SBram Moolenaar    call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix')
718a1070eaeSBram Moolenaar    call assert_equal(['INFER', 'loWER', 'i', 'LO', '', ''], getline(1, '$'), e)
719eb992cb9SBram Moolenaar    %d
720eb992cb9SBram Moolenaar    call setline(1, ['INFER', 'loWER', '', '', ])
721eb992cb9SBram Moolenaar    call cursor(3, 1)
722eb992cb9SBram Moolenaar    set ignorecase infercase
723eb992cb9SBram Moolenaar    call feedkeys("Ii\<c-n>\<cr>\<esc>", "tnix")
724eb992cb9SBram Moolenaar    call feedkeys("ILO\<c-n>\<cr>\<esc>", 'tnix')
725a1070eaeSBram Moolenaar    call assert_equal(['INFER', 'loWER', 'infer', 'LOWER', '', ''], getline(1, '$'), e)
726eb992cb9SBram Moolenaar
727eb992cb9SBram Moolenaar    set noignorecase noinfercase complete&
728eb992cb9SBram Moolenaar    bw!
729a1070eaeSBram Moolenaar  endfor
730eb992cb9SBram Moolenaarendfunc
731eb992cb9SBram Moolenaar
7321e115360SBram Moolenaarfunc Test_edit_CTRL_O()
733eb992cb9SBram Moolenaar  " Check for CTRL-O in insert mode
734eb992cb9SBram Moolenaar  new
735eb992cb9SBram Moolenaar  inoreabbr <buffer> h here some more
736eb992cb9SBram Moolenaar  call setline(1, ['abc', 'def'])
737eb992cb9SBram Moolenaar  call cursor(1, 1)
738eb992cb9SBram Moolenaar  " Ctrl-O after an abbreviation
739eb992cb9SBram Moolenaar  exe "norm A h\<c-o>:set nu\<cr> text"
740eb992cb9SBram Moolenaar  call assert_equal(['abc here some more text', 'def'], getline(1, '$'))
741eb992cb9SBram Moolenaar  call assert_true(&nu)
742eb992cb9SBram Moolenaar  set nonu
743eb992cb9SBram Moolenaar  iunabbr <buffer> h
744eb992cb9SBram Moolenaar  " Ctrl-O at end of line with 've'=onemore
745eb992cb9SBram Moolenaar  call cursor(1, 1)
746eb992cb9SBram Moolenaar  call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix')
747eb992cb9SBram Moolenaar  call assert_equal([0, 1, 23, 0], g:a)
748eb992cb9SBram Moolenaar  call cursor(1, 1)
749eb992cb9SBram Moolenaar  set ve=onemore
750eb992cb9SBram Moolenaar  call feedkeys("A\<c-o>:let g:a=getpos('.')\<cr>\<esc>", 'tnix')
751eb992cb9SBram Moolenaar  call assert_equal([0, 1, 24, 0], g:a)
752eb992cb9SBram Moolenaar  set ve=
753eb992cb9SBram Moolenaar  unlet! g:a
754eb992cb9SBram Moolenaar  bw!
755eb992cb9SBram Moolenaarendfunc
756eb992cb9SBram Moolenaar
7571e115360SBram Moolenaarfunc Test_edit_CTRL_R()
758eb992cb9SBram Moolenaar  " Insert Register
759eb992cb9SBram Moolenaar  new
760eb992cb9SBram Moolenaar  call test_override("ALL", 1)
761eb992cb9SBram Moolenaar  set showcmd
762eb992cb9SBram Moolenaar  call feedkeys("AFOOBAR eins zwei\<esc>", 'tnix')
763eb992cb9SBram Moolenaar  call feedkeys("O\<c-r>.", 'tnix')
764eb992cb9SBram Moolenaar  call feedkeys("O\<c-r>=10*500\<cr>\<esc>", 'tnix')
765eb992cb9SBram Moolenaar  call feedkeys("O\<c-r>=getreg('=', 1)\<cr>\<esc>", 'tnix')
766eb992cb9SBram Moolenaar  call assert_equal(["getreg('=', 1)", '5000', "FOOBAR eins zwei", "FOOBAR eins zwei"], getline(1, '$'))
767eb992cb9SBram Moolenaar  call test_override("ALL", 0)
768eb992cb9SBram Moolenaar  set noshowcmd
769eb992cb9SBram Moolenaar  bw!
770eb992cb9SBram Moolenaarendfunc
771eb992cb9SBram Moolenaar
7721e115360SBram Moolenaarfunc Test_edit_CTRL_S()
773eb992cb9SBram Moolenaar  " Test pressing CTRL-S (basically only spellfile completion)
774eb992cb9SBram Moolenaar  " the rest is already covered
775eb992cb9SBram Moolenaar  new
776eb992cb9SBram Moolenaar  if !has("spell")
777eb992cb9SBram Moolenaar    call setline(1, 'vim')
778eb992cb9SBram Moolenaar    call feedkeys("A\<c-x>ss\<cr>\<esc>", 'tnix')
779eb992cb9SBram Moolenaar    call assert_equal(['vims', ''], getline(1, '$'))
780eb992cb9SBram Moolenaar    bw!
781eb992cb9SBram Moolenaar    return
782eb992cb9SBram Moolenaar  endif
783eb992cb9SBram Moolenaar  call setline(1, 'vim')
784eb992cb9SBram Moolenaar  " spell option not yet set
785eb992cb9SBram Moolenaar  try
786eb992cb9SBram Moolenaar    call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix')
787eb992cb9SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E756/
788eb992cb9SBram Moolenaar    call assert_true(1, 'error caught')
789eb992cb9SBram Moolenaar  endtry
790eb992cb9SBram Moolenaar  call assert_equal(['vim', ''], getline(1, '$'))
791eb992cb9SBram Moolenaar  %d
792eb992cb9SBram Moolenaar  setl spell spelllang=en
793eb992cb9SBram Moolenaar  call setline(1, 'vim')
794eb992cb9SBram Moolenaar  call cursor(1, 1)
795eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-s>\<cr>\<esc>", 'tnix')
796eb992cb9SBram Moolenaar  call assert_equal(['Vim', ''], getline(1, '$'))
797eb992cb9SBram Moolenaar  %d
798eb992cb9SBram Moolenaar  call setline(1, 'vim')
799eb992cb9SBram Moolenaar  call cursor(1, 1)
800eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-s>\<down>\<cr>\<esc>", 'tnix')
801eb992cb9SBram Moolenaar  call assert_equal(['Aim'], getline(1, '$'))
802eb992cb9SBram Moolenaar  %d
803eb992cb9SBram Moolenaar  call setline(1, 'vim')
804eb992cb9SBram Moolenaar  call cursor(1, 1)
805eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix')
806eb992cb9SBram Moolenaar  call assert_equal(['vim', ''], getline(1, '$'))
807eb992cb9SBram Moolenaar  %d
808eb992cb9SBram Moolenaar  " empty buffer
809eb992cb9SBram Moolenaar  call cursor(1, 1)
810eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-s>\<c-p>\<cr>\<esc>", 'tnix')
811eb992cb9SBram Moolenaar  call assert_equal(['', ''], getline(1, '$'))
812eb992cb9SBram Moolenaar  setl nospell
813eb992cb9SBram Moolenaar  bw!
814eb992cb9SBram Moolenaarendfunc
815eb992cb9SBram Moolenaar
8161e115360SBram Moolenaarfunc Test_edit_CTRL_T()
817eb992cb9SBram Moolenaar  " Check for CTRL-T and CTRL-X CTRL-T in insert mode
818eb992cb9SBram Moolenaar  " 1) increase indent
819eb992cb9SBram Moolenaar  new
820eb992cb9SBram Moolenaar  call setline(1, "abc")
821eb992cb9SBram Moolenaar  call cursor(1, 1)
822eb992cb9SBram Moolenaar  call feedkeys("A\<c-t>xyz", 'tnix')
823eb992cb9SBram Moolenaar  call assert_equal(["\<tab>abcxyz"], getline(1, '$'))
824eb992cb9SBram Moolenaar  " 2) also when paste option is set
825eb992cb9SBram Moolenaar  set paste
826eb992cb9SBram Moolenaar  call setline(1, "abc")
827eb992cb9SBram Moolenaar  call cursor(1, 1)
828eb992cb9SBram Moolenaar  call feedkeys("A\<c-t>xyz", 'tnix')
829eb992cb9SBram Moolenaar  call assert_equal(["\<tab>abcxyz"], getline(1, '$'))
830eb992cb9SBram Moolenaar  set nopaste
831eb992cb9SBram Moolenaar  " CTRL-X CTRL-T (thesaurus complete)
832eb992cb9SBram Moolenaar  call writefile(['angry furious mad enraged'], 'Xthesaurus')
833eb992cb9SBram Moolenaar  set thesaurus=Xthesaurus
834eb992cb9SBram Moolenaar  call setline(1, 'mad')
835eb992cb9SBram Moolenaar  call cursor(1, 1)
836eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-t>\<cr>\<esc>", 'tnix')
837eb992cb9SBram Moolenaar  call assert_equal(['mad', ''], getline(1, '$'))
838eb992cb9SBram Moolenaar  %d
839eb992cb9SBram Moolenaar  call setline(1, 'mad')
840eb992cb9SBram Moolenaar  call cursor(1, 1)
841eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix')
842eb992cb9SBram Moolenaar  call assert_equal(['angry', ''], getline(1, '$'))
843eb992cb9SBram Moolenaar  %d
844eb992cb9SBram Moolenaar  call setline(1, 'mad')
845eb992cb9SBram Moolenaar  call cursor(1, 1)
846eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
847eb992cb9SBram Moolenaar  call assert_equal(['furious', ''], getline(1, '$'))
848eb992cb9SBram Moolenaar  %d
849eb992cb9SBram Moolenaar  call setline(1, 'mad')
850eb992cb9SBram Moolenaar  call cursor(1, 1)
851eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
852eb992cb9SBram Moolenaar  call assert_equal(['enraged', ''], getline(1, '$'))
853eb992cb9SBram Moolenaar  %d
854eb992cb9SBram Moolenaar  call setline(1, 'mad')
855eb992cb9SBram Moolenaar  call cursor(1, 1)
856eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
857eb992cb9SBram Moolenaar  call assert_equal(['mad', ''], getline(1, '$'))
858eb992cb9SBram Moolenaar  %d
859eb992cb9SBram Moolenaar  call setline(1, 'mad')
860eb992cb9SBram Moolenaar  call cursor(1, 1)
861eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-t>\<c-n>\<c-n>\<c-n>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
862eb992cb9SBram Moolenaar  call assert_equal(['mad', ''], getline(1, '$'))
863eb992cb9SBram Moolenaar  " Using <c-p> <c-n> when 'complete' is empty
864eb992cb9SBram Moolenaar  set complete=
865eb992cb9SBram Moolenaar  %d
866eb992cb9SBram Moolenaar  call setline(1, 'mad')
867eb992cb9SBram Moolenaar  call cursor(1, 1)
868eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix')
869eb992cb9SBram Moolenaar  call assert_equal(['angry', ''], getline(1, '$'))
870eb992cb9SBram Moolenaar  %d
871eb992cb9SBram Moolenaar  call setline(1, 'mad')
872eb992cb9SBram Moolenaar  call cursor(1, 1)
873eb992cb9SBram Moolenaar  call feedkeys("A\<c-x>\<c-t>\<c-p>\<cr>\<esc>", 'tnix')
874eb992cb9SBram Moolenaar  call assert_equal(['mad', ''], getline(1, '$'))
875eb992cb9SBram Moolenaar  set complete&
876eb992cb9SBram Moolenaar
877eb992cb9SBram Moolenaar  set thesaurus=
878eb992cb9SBram Moolenaar  %d
879eb992cb9SBram Moolenaar  call setline(1, 'mad')
880eb992cb9SBram Moolenaar  call cursor(1, 1)
881eb992cb9SBram Moolenaar  let v:testing = 1
882eb992cb9SBram Moolenaar  try
883eb992cb9SBram Moolenaar    call feedkeys("A\<c-x>\<c-t>\<esc>", 'tnix')
884eb992cb9SBram Moolenaar  catch
885eb992cb9SBram Moolenaar    " error sleeps 2 seconds, when v:testing is not set
886eb992cb9SBram Moolenaar    let v:testing = 0
887eb992cb9SBram Moolenaar  endtry
888eb992cb9SBram Moolenaar  call assert_equal(['mad'], getline(1, '$'))
889eb992cb9SBram Moolenaar  call delete('Xthesaurus')
890eb992cb9SBram Moolenaar  bw!
891eb992cb9SBram Moolenaarendfunc
892eb992cb9SBram Moolenaar
893160e994dSYegappan Lakshmanan" Test 'thesaurusfunc'
894160e994dSYegappan Lakshmananfunc MyThesaurus(findstart, base)
895160e994dSYegappan Lakshmanan  let mythesaurus = [
896160e994dSYegappan Lakshmanan        \ #{word: "happy",
897160e994dSYegappan Lakshmanan        \   synonyms: "cheerful,blissful,flying high,looking good,peppy"},
898160e994dSYegappan Lakshmanan        \ #{word: "kind",
899160e994dSYegappan Lakshmanan        \   synonyms: "amiable,bleeding-heart,heart in right place"}]
900160e994dSYegappan Lakshmanan  if a:findstart
901160e994dSYegappan Lakshmanan    " locate the start of the word
902160e994dSYegappan Lakshmanan    let line = getline('.')
903160e994dSYegappan Lakshmanan    let start = col('.') - 1
904160e994dSYegappan Lakshmanan    while start > 0 && line[start - 1] =~ '\a'
905160e994dSYegappan Lakshmanan      let start -= 1
906160e994dSYegappan Lakshmanan    endwhile
907160e994dSYegappan Lakshmanan    return start
908160e994dSYegappan Lakshmanan  else
909160e994dSYegappan Lakshmanan    " find strings matching with "a:base"
910160e994dSYegappan Lakshmanan    let res = []
911160e994dSYegappan Lakshmanan    for w in mythesaurus
912160e994dSYegappan Lakshmanan      if w.word =~ '^' . a:base
913160e994dSYegappan Lakshmanan        call add(res, w.word)
914160e994dSYegappan Lakshmanan        call extend(res, split(w.synonyms, ","))
915160e994dSYegappan Lakshmanan      endif
916160e994dSYegappan Lakshmanan    endfor
917160e994dSYegappan Lakshmanan    return res
918160e994dSYegappan Lakshmanan  endif
919160e994dSYegappan Lakshmananendfunc
920160e994dSYegappan Lakshmanan
921160e994dSYegappan Lakshmananfunc Test_thesaurus_func()
922160e994dSYegappan Lakshmanan  new
923f4d8b76dSBram Moolenaar  set thesaurus=notused
924f4d8b76dSBram Moolenaar  set thesaurusfunc=NotUsed
925f4d8b76dSBram Moolenaar  setlocal thesaurusfunc=MyThesaurus
926160e994dSYegappan Lakshmanan  call setline(1, "an ki")
927160e994dSYegappan Lakshmanan  call cursor(1, 1)
928160e994dSYegappan Lakshmanan  call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix')
929160e994dSYegappan Lakshmanan  call assert_equal(['an amiable', ''], getline(1, '$'))
930f4d8b76dSBram Moolenaar
931f4d8b76dSBram Moolenaar  setlocal thesaurusfunc=NonExistingFunc
932f4d8b76dSBram Moolenaar  call assert_fails("normal $a\<C-X>\<C-T>", 'E117:')
933f4d8b76dSBram Moolenaar
934f4d8b76dSBram Moolenaar  setlocal thesaurusfunc=
935160e994dSYegappan Lakshmanan  set thesaurusfunc=NonExistingFunc
936160e994dSYegappan Lakshmanan  call assert_fails("normal $a\<C-X>\<C-T>", 'E117:')
937160e994dSYegappan Lakshmanan  %bw!
938f4d8b76dSBram Moolenaar
939f4d8b76dSBram Moolenaar  set thesaurusfunc=
940f4d8b76dSBram Moolenaar  set thesaurus=
941160e994dSYegappan Lakshmananendfunc
942160e994dSYegappan Lakshmanan
9431e115360SBram Moolenaarfunc Test_edit_CTRL_U()
944eb992cb9SBram Moolenaar  " Test 'completefunc'
945eb992cb9SBram Moolenaar  new
946eb992cb9SBram Moolenaar  " -1, -2 and -3 are special return values
947eb992cb9SBram Moolenaar  let g:special=0
948eb992cb9SBram Moolenaar  fun! CompleteMonths(findstart, base)
949eb992cb9SBram Moolenaar    if a:findstart
950eb992cb9SBram Moolenaar      " locate the start of the word
951eb992cb9SBram Moolenaar      return g:special
952eb992cb9SBram Moolenaar    else
953eb992cb9SBram Moolenaar      " find months matching with "a:base"
954eb992cb9SBram Moolenaar      let res = []
955eb992cb9SBram Moolenaar      for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
956eb992cb9SBram Moolenaar        if m =~ '^\c'.a:base
957eb992cb9SBram Moolenaar          call add(res, {'word': m, 'abbr': m.' Month', 'icase': 0})
958eb992cb9SBram Moolenaar        endif
959eb992cb9SBram Moolenaar      endfor
960eb992cb9SBram Moolenaar      return {'words': res, 'refresh': 'always'}
961eb992cb9SBram Moolenaar    endif
962eb992cb9SBram Moolenaar  endfun
963eb992cb9SBram Moolenaar  set completefunc=CompleteMonths
964eb992cb9SBram Moolenaar  call setline(1, ['', ''])
965eb992cb9SBram Moolenaar  call cursor(1, 1)
966eb992cb9SBram Moolenaar  call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
967eb992cb9SBram Moolenaar  call assert_equal(['X', '', ''], getline(1, '$'))
968eb992cb9SBram Moolenaar  %d
969eb992cb9SBram Moolenaar  let g:special=-1
970eb992cb9SBram Moolenaar  call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
971eb992cb9SBram Moolenaar  call assert_equal(['XJan', ''], getline(1, '$'))
972eb992cb9SBram Moolenaar  %d
973eb992cb9SBram Moolenaar  let g:special=-2
974eb992cb9SBram Moolenaar  call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
975eb992cb9SBram Moolenaar  call assert_equal(['X', ''], getline(1, '$'))
976eb992cb9SBram Moolenaar  %d
977eb992cb9SBram Moolenaar  let g:special=-3
978eb992cb9SBram Moolenaar  call feedkeys("AX\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
979eb992cb9SBram Moolenaar  call assert_equal(['X', ''], getline(1, '$'))
980eb992cb9SBram Moolenaar  %d
981eb992cb9SBram Moolenaar  let g:special=0
982eb992cb9SBram Moolenaar  call feedkeys("AM\<c-x>\<c-u>\<cr>\<esc>", 'tnix')
983eb992cb9SBram Moolenaar  call assert_equal(['Mar', ''], getline(1, '$'))
984eb992cb9SBram Moolenaar  %d
985eb992cb9SBram Moolenaar  call feedkeys("AM\<c-x>\<c-u>\<c-n>\<cr>\<esc>", 'tnix')
986eb992cb9SBram Moolenaar  call assert_equal(['May', ''], getline(1, '$'))
987eb992cb9SBram Moolenaar  %d
988eb992cb9SBram Moolenaar  call feedkeys("AM\<c-x>\<c-u>\<c-n>\<c-n>\<cr>\<esc>", 'tnix')
989eb992cb9SBram Moolenaar  call assert_equal(['M', ''], getline(1, '$'))
990eb992cb9SBram Moolenaar  delfu CompleteMonths
991eb992cb9SBram Moolenaar  %d
992eb992cb9SBram Moolenaar  try
993eb992cb9SBram Moolenaar    call feedkeys("A\<c-x>\<c-u>", 'tnix')
994eb992cb9SBram Moolenaar    call assert_fails(1, 'unknown completion function')
995eb992cb9SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E117/
996eb992cb9SBram Moolenaar    call assert_true(1, 'E117 error caught')
997eb992cb9SBram Moolenaar  endtry
998eb992cb9SBram Moolenaar  set completefunc=
999eb992cb9SBram Moolenaar  bw!
1000eb992cb9SBram Moolenaarendfunc
1001eb992cb9SBram Moolenaar
1002ff06f283SBram Moolenaarfunc Test_edit_completefunc_delete()
1003ff06f283SBram Moolenaar  func CompleteFunc(findstart, base)
1004ff06f283SBram Moolenaar    if a:findstart == 1
1005ff06f283SBram Moolenaar      return col('.') - 1
1006ff06f283SBram Moolenaar    endif
1007ff06f283SBram Moolenaar    normal dd
1008ff06f283SBram Moolenaar    return ['a', 'b']
1009ff06f283SBram Moolenaar  endfunc
1010ff06f283SBram Moolenaar  new
1011ff06f283SBram Moolenaar  set completefunc=CompleteFunc
1012ff06f283SBram Moolenaar  call setline(1, ['', 'abcd', ''])
1013ff06f283SBram Moolenaar  2d
10146adb9ea0SBram Moolenaar  call assert_fails("normal 2G$a\<C-X>\<C-U>", 'E578:')
1015ff06f283SBram Moolenaar  bwipe!
1016ff06f283SBram Moolenaarendfunc
1017ff06f283SBram Moolenaar
1018ff06f283SBram Moolenaar
10191e115360SBram Moolenaarfunc Test_edit_CTRL_Z()
1020eb992cb9SBram Moolenaar  " Ctrl-Z when insertmode is not set inserts it literally
1021eb992cb9SBram Moolenaar  new
1022eb992cb9SBram Moolenaar  call setline(1, 'abc')
1023eb992cb9SBram Moolenaar  call feedkeys("A\<c-z>\<esc>", 'tnix')
1024eb992cb9SBram Moolenaar  call assert_equal(["abc\<c-z>"], getline(1,'$'))
1025eb992cb9SBram Moolenaar  bw!
1026eb992cb9SBram Moolenaar  " TODO: How to Test Ctrl-Z in insert mode, e.g. suspend?
1027eb992cb9SBram Moolenaarendfunc
1028eb992cb9SBram Moolenaar
10291e115360SBram Moolenaarfunc Test_edit_DROP()
10306d91bcb4SBram Moolenaar  CheckFeature dnd
1031eb992cb9SBram Moolenaar  new
1032eb992cb9SBram Moolenaar  call setline(1, ['abc def ghi'])
1033eb992cb9SBram Moolenaar  call cursor(1, 1)
1034eb992cb9SBram Moolenaar  try
1035eb992cb9SBram Moolenaar    call feedkeys("i\<Drop>\<Esc>", 'tnix')
1036eb992cb9SBram Moolenaar    call assert_fails(1, 'Invalid register name')
1037eb992cb9SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E353/
1038eb992cb9SBram Moolenaar    call assert_true(1, 'error caught')
1039eb992cb9SBram Moolenaar  endtry
1040eb992cb9SBram Moolenaar  bw!
1041eb992cb9SBram Moolenaarendfunc
1042eb992cb9SBram Moolenaar
10431e115360SBram Moolenaarfunc Test_edit_CTRL_V()
10446d91bcb4SBram Moolenaar  CheckFeature ebcdic
1045eb992cb9SBram Moolenaar  new
1046eb992cb9SBram Moolenaar  call setline(1, ['abc'])
1047eb992cb9SBram Moolenaar  call cursor(2, 1)
1048eb992cb9SBram Moolenaar  " force some redraws
1049eb992cb9SBram Moolenaar  set showmode showcmd
1050eb992cb9SBram Moolenaar  "call test_override_char_avail(1)
1051eb992cb9SBram Moolenaar  call test_override('ALL', 1)
1052eb992cb9SBram Moolenaar  call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix')
1053eb992cb9SBram Moolenaar  call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$'))
1054eb992cb9SBram Moolenaar
1055eb992cb9SBram Moolenaar  if has("rightleft") && exists("+rl")
1056eb992cb9SBram Moolenaar    set rl
1057eb992cb9SBram Moolenaar    call setline(1, ['abc'])
1058eb992cb9SBram Moolenaar    call cursor(2, 1)
1059eb992cb9SBram Moolenaar    call feedkeys("A\<c-v>\<c-n>\<c-v>\<c-l>\<c-v>\<c-b>\<esc>", 'tnix')
1060eb992cb9SBram Moolenaar    call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$'))
1061eb992cb9SBram Moolenaar    set norl
1062eb992cb9SBram Moolenaar  endif
1063eb992cb9SBram Moolenaar
1064eb992cb9SBram Moolenaar  call test_override('ALL', 0)
1065eb992cb9SBram Moolenaar  set noshowmode showcmd
1066eb992cb9SBram Moolenaar  bw!
1067eb992cb9SBram Moolenaarendfunc
1068eb992cb9SBram Moolenaar
10691e115360SBram Moolenaarfunc Test_edit_F1()
10705a4c3082SBram Moolenaar  CheckFeature quickfix
10715a4c3082SBram Moolenaar
1072eb992cb9SBram Moolenaar  " Pressing <f1>
1073eb992cb9SBram Moolenaar  new
1074eb992cb9SBram Moolenaar  call feedkeys(":set im\<cr>\<f1>\<c-l>", 'tnix')
1075eb992cb9SBram Moolenaar  set noinsertmode
1076eb992cb9SBram Moolenaar  call assert_equal('help', &buftype)
1077eb992cb9SBram Moolenaar  bw
1078eb992cb9SBram Moolenaar  bw
1079eb992cb9SBram Moolenaarendfunc
1080eb992cb9SBram Moolenaar
10811e115360SBram Moolenaarfunc Test_edit_F21()
1082eb992cb9SBram Moolenaar  " Pressing <f21>
1083eb992cb9SBram Moolenaar  " sends a netbeans command
10846d91bcb4SBram Moolenaar  CheckFeature netbeans_intg
1085eb992cb9SBram Moolenaar  new
1086eb992cb9SBram Moolenaar  " I have no idea what this is supposed to do :)
1087eb992cb9SBram Moolenaar  call feedkeys("A\<F21>\<F1>\<esc>", 'tnix')
1088eb992cb9SBram Moolenaar  bw
1089eb992cb9SBram Moolenaarendfunc
1090eb992cb9SBram Moolenaar
10911e115360SBram Moolenaarfunc Test_edit_HOME_END()
1092eb992cb9SBram Moolenaar  " Test Home/End Keys
1093eb992cb9SBram Moolenaar  new
1094eb992cb9SBram Moolenaar  set foldopen+=hor
1095eb992cb9SBram Moolenaar  call setline(1, ['abc', 'def'])
1096eb992cb9SBram Moolenaar  call cursor(1, 1)
1097eb992cb9SBram Moolenaar  call feedkeys("AX\<Home>Y\<esc>", 'tnix')
1098eb992cb9SBram Moolenaar  call cursor(2, 1)
1099eb992cb9SBram Moolenaar  call feedkeys("iZ\<End>Y\<esc>", 'tnix')
1100eb992cb9SBram Moolenaar  call assert_equal(['YabcX', 'ZdefY'], getline(1, '$'))
1101eb992cb9SBram Moolenaar
1102eb992cb9SBram Moolenaar  set foldopen-=hor
1103eb992cb9SBram Moolenaar  bw!
1104eb992cb9SBram Moolenaarendfunc
1105eb992cb9SBram Moolenaar
11061e115360SBram Moolenaarfunc Test_edit_INS()
1107eb992cb9SBram Moolenaar  " Test for Pressing <Insert>
1108eb992cb9SBram Moolenaar  new
1109eb992cb9SBram Moolenaar  call setline(1, ['abc', 'def'])
1110eb992cb9SBram Moolenaar  call cursor(1, 1)
1111eb992cb9SBram Moolenaar  call feedkeys("i\<Insert>ZYX>", 'tnix')
1112eb992cb9SBram Moolenaar  call assert_equal(['ZYX>', 'def'], getline(1, '$'))
1113eb992cb9SBram Moolenaar  call setline(1, ['abc', 'def'])
1114eb992cb9SBram Moolenaar  call cursor(1, 1)
1115eb992cb9SBram Moolenaar  call feedkeys("i\<Insert>Z\<Insert>YX>", 'tnix')
1116eb992cb9SBram Moolenaar  call assert_equal(['ZYX>bc', 'def'], getline(1, '$'))
1117eb992cb9SBram Moolenaar  bw!
1118eb992cb9SBram Moolenaarendfunc
1119eb992cb9SBram Moolenaar
11201e115360SBram Moolenaarfunc Test_edit_LEFT_RIGHT()
1121eb992cb9SBram Moolenaar  " Left, Shift-Left, Right, Shift-Right
1122eb992cb9SBram Moolenaar  new
1123eb992cb9SBram Moolenaar  call setline(1, ['abc def ghi', 'ABC DEF GHI', 'ZZZ YYY XXX'])
1124eb992cb9SBram Moolenaar  let _ww=&ww
1125eb992cb9SBram Moolenaar  set ww=
1126eb992cb9SBram Moolenaar  call cursor(2, 1)
1127eb992cb9SBram Moolenaar  call feedkeys("i\<left>\<esc>", 'tnix')
1128eb992cb9SBram Moolenaar  call assert_equal([0, 2, 1, 0], getpos('.'))
1129eb992cb9SBram Moolenaar  " Is this a bug, <s-left> does not respect whichwrap option
1130eb992cb9SBram Moolenaar  call feedkeys("i\<s-left>\<esc>", 'tnix')
1131eb992cb9SBram Moolenaar  call assert_equal([0, 1, 8, 0], getpos('.'))
1132eb992cb9SBram Moolenaar  call feedkeys("i". repeat("\<s-left>", 3). "\<esc>", 'tnix')
1133eb992cb9SBram Moolenaar  call assert_equal([0, 1, 1, 0], getpos('.'))
1134eb992cb9SBram Moolenaar  call feedkeys("i\<right>\<esc>", 'tnix')
1135eb992cb9SBram Moolenaar  call assert_equal([0, 1, 1, 0], getpos('.'))
1136eb992cb9SBram Moolenaar  call feedkeys("i\<right>\<right>\<esc>", 'tnix')
1137eb992cb9SBram Moolenaar  call assert_equal([0, 1, 2, 0], getpos('.'))
1138eb992cb9SBram Moolenaar  call feedkeys("A\<right>\<esc>", 'tnix')
1139eb992cb9SBram Moolenaar  call assert_equal([0, 1, 11, 0], getpos('.'))
1140eb992cb9SBram Moolenaar  call feedkeys("A\<s-right>\<esc>", 'tnix')
1141eb992cb9SBram Moolenaar  call assert_equal([0, 2, 1, 0], getpos('.'))
1142eb992cb9SBram Moolenaar  call feedkeys("i\<s-right>\<esc>", 'tnix')
1143eb992cb9SBram Moolenaar  call assert_equal([0, 2, 4, 0], getpos('.'))
1144eb992cb9SBram Moolenaar  call cursor(3, 11)
1145eb992cb9SBram Moolenaar  call feedkeys("A\<right>\<esc>", 'tnix')
1146eb992cb9SBram Moolenaar  call feedkeys("A\<s-right>\<esc>", 'tnix')
1147eb992cb9SBram Moolenaar  call assert_equal([0, 3, 11, 0], getpos('.'))
1148eb992cb9SBram Moolenaar  call cursor(2, 11)
1149eb992cb9SBram Moolenaar  " <S-Right> does not respect 'whichwrap' option
1150eb992cb9SBram Moolenaar  call feedkeys("A\<s-right>\<esc>", 'tnix')
1151eb992cb9SBram Moolenaar  call assert_equal([0, 3, 1, 0], getpos('.'))
1152eb992cb9SBram Moolenaar  " Check motion when 'whichwrap' contains cursor keys for insert mode
1153eb992cb9SBram Moolenaar  set ww+=[,]
1154eb992cb9SBram Moolenaar  call cursor(2, 1)
1155eb992cb9SBram Moolenaar  call feedkeys("i\<left>\<esc>", 'tnix')
1156eb992cb9SBram Moolenaar  call assert_equal([0, 1, 11, 0], getpos('.'))
1157eb992cb9SBram Moolenaar  call cursor(2, 11)
1158eb992cb9SBram Moolenaar  call feedkeys("A\<right>\<esc>", 'tnix')
1159eb992cb9SBram Moolenaar  call assert_equal([0, 3, 1, 0], getpos('.'))
1160eb992cb9SBram Moolenaar  call cursor(2, 11)
1161eb992cb9SBram Moolenaar  call feedkeys("A\<s-right>\<esc>", 'tnix')
1162eb992cb9SBram Moolenaar  call assert_equal([0, 3, 1, 0], getpos('.'))
1163eb992cb9SBram Moolenaar  let &ww = _ww
1164eb992cb9SBram Moolenaar  bw!
1165eb992cb9SBram Moolenaarendfunc
1166eb992cb9SBram Moolenaar
11671e115360SBram Moolenaarfunc Test_edit_MOUSE()
1168eb992cb9SBram Moolenaar  " This is a simple test, since we not really using the mouse here
11696d91bcb4SBram Moolenaar  CheckFeature mouse
1170eb992cb9SBram Moolenaar  10new
1171eb992cb9SBram Moolenaar  call setline(1, range(1, 100))
1172eb992cb9SBram Moolenaar  call cursor(1, 1)
1173eb992cb9SBram Moolenaar  set mouse=a
1174eb992cb9SBram Moolenaar  call feedkeys("A\<ScrollWheelDown>\<esc>", 'tnix')
1175eb992cb9SBram Moolenaar  call assert_equal([0, 4, 1, 0], getpos('.'))
1176eb992cb9SBram Moolenaar  " This should move by one pageDown, but only moves
1177eb992cb9SBram Moolenaar  " by one line when the test is run...
1178eb992cb9SBram Moolenaar  call feedkeys("A\<S-ScrollWheelDown>\<esc>", 'tnix')
1179eb992cb9SBram Moolenaar  call assert_equal([0, 5, 1, 0], getpos('.'))
1180eb992cb9SBram Moolenaar  set nostartofline
1181eb992cb9SBram Moolenaar  call feedkeys("A\<C-ScrollWheelDown>\<esc>", 'tnix')
1182eb992cb9SBram Moolenaar  call assert_equal([0, 6, 1, 0], getpos('.'))
1183eb992cb9SBram Moolenaar  call feedkeys("A\<LeftMouse>\<esc>", 'tnix')
1184eb992cb9SBram Moolenaar  call assert_equal([0, 6, 1, 0], getpos('.'))
1185eb992cb9SBram Moolenaar  call feedkeys("A\<RightMouse>\<esc>", 'tnix')
1186eb992cb9SBram Moolenaar  call assert_equal([0, 6, 1, 0], getpos('.'))
1187eb992cb9SBram Moolenaar  call cursor(1, 100)
1188eb992cb9SBram Moolenaar  norm! zt
1189eb992cb9SBram Moolenaar  " this should move by a screen up, but when the test
1190eb992cb9SBram Moolenaar  " is run, it moves up to the top of the buffer...
1191eb992cb9SBram Moolenaar  call feedkeys("A\<ScrollWheelUp>\<esc>", 'tnix')
1192eb992cb9SBram Moolenaar  call assert_equal([0, 1, 1, 0], getpos('.'))
1193eb992cb9SBram Moolenaar  call cursor(1, 30)
1194eb992cb9SBram Moolenaar  norm! zt
1195eb992cb9SBram Moolenaar  call feedkeys("A\<S-ScrollWheelUp>\<esc>", 'tnix')
1196eb992cb9SBram Moolenaar  call assert_equal([0, 1, 1, 0], getpos('.'))
1197eb992cb9SBram Moolenaar  call cursor(1, 30)
1198eb992cb9SBram Moolenaar  norm! zt
1199eb992cb9SBram Moolenaar  call feedkeys("A\<C-ScrollWheelUp>\<esc>", 'tnix')
1200eb992cb9SBram Moolenaar  call assert_equal([0, 1, 1, 0], getpos('.'))
1201eb992cb9SBram Moolenaar  %d
1202eb992cb9SBram Moolenaar  call setline(1, repeat(["12345678901234567890"], 100))
1203eb992cb9SBram Moolenaar  call cursor(2, 1)
1204eb992cb9SBram Moolenaar  call feedkeys("A\<ScrollWheelRight>\<esc>", 'tnix')
1205eb992cb9SBram Moolenaar  call assert_equal([0, 2, 20, 0], getpos('.'))
1206eb992cb9SBram Moolenaar  call feedkeys("A\<ScrollWheelLeft>\<esc>", 'tnix')
1207eb992cb9SBram Moolenaar  call assert_equal([0, 2, 20, 0], getpos('.'))
1208eb992cb9SBram Moolenaar  call feedkeys("A\<S-ScrollWheelRight>\<esc>", 'tnix')
1209eb992cb9SBram Moolenaar  call assert_equal([0, 2, 20, 0], getpos('.'))
1210eb992cb9SBram Moolenaar  call feedkeys("A\<S-ScrollWheelLeft>\<esc>", 'tnix')
1211eb992cb9SBram Moolenaar  call assert_equal([0, 2, 20, 0], getpos('.'))
1212eb992cb9SBram Moolenaar  call feedkeys("A\<C-ScrollWheelRight>\<esc>", 'tnix')
1213eb992cb9SBram Moolenaar  call assert_equal([0, 2, 20, 0], getpos('.'))
1214eb992cb9SBram Moolenaar  call feedkeys("A\<C-ScrollWheelLeft>\<esc>", 'tnix')
1215eb992cb9SBram Moolenaar  call assert_equal([0, 2, 20, 0], getpos('.'))
1216eb992cb9SBram Moolenaar  set mouse& startofline
1217eb992cb9SBram Moolenaar  bw!
1218eb992cb9SBram Moolenaarendfunc
1219eb992cb9SBram Moolenaar
12201e115360SBram Moolenaarfunc Test_edit_PAGEUP_PAGEDOWN()
1221eb992cb9SBram Moolenaar  10new
1222eb992cb9SBram Moolenaar  call setline(1, repeat(['abc def ghi'], 30))
1223eb992cb9SBram Moolenaar  call cursor(1, 1)
1224eb992cb9SBram Moolenaar  call feedkeys("i\<PageDown>\<esc>", 'tnix')
1225eb992cb9SBram Moolenaar  call assert_equal([0, 9, 1, 0], getpos('.'))
1226eb992cb9SBram Moolenaar  call feedkeys("i\<PageDown>\<esc>", 'tnix')
1227eb992cb9SBram Moolenaar  call assert_equal([0, 17, 1, 0], getpos('.'))
1228eb992cb9SBram Moolenaar  call feedkeys("i\<PageDown>\<esc>", 'tnix')
1229eb992cb9SBram Moolenaar  call assert_equal([0, 25, 1, 0], getpos('.'))
1230eb992cb9SBram Moolenaar  call feedkeys("i\<PageDown>\<esc>", 'tnix')
1231eb992cb9SBram Moolenaar  call assert_equal([0, 30, 1, 0], getpos('.'))
1232eb992cb9SBram Moolenaar  call feedkeys("i\<PageDown>\<esc>", 'tnix')
1233eb992cb9SBram Moolenaar  call assert_equal([0, 30, 1, 0], getpos('.'))
1234eb992cb9SBram Moolenaar  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1235eb992cb9SBram Moolenaar  call assert_equal([0, 29, 1, 0], getpos('.'))
1236eb992cb9SBram Moolenaar  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1237eb992cb9SBram Moolenaar  call assert_equal([0, 21, 1, 0], getpos('.'))
1238eb992cb9SBram Moolenaar  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1239eb992cb9SBram Moolenaar  call assert_equal([0, 13, 1, 0], getpos('.'))
1240eb992cb9SBram Moolenaar  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1241eb992cb9SBram Moolenaar  call assert_equal([0, 5, 1, 0], getpos('.'))
1242eb992cb9SBram Moolenaar  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1243eb992cb9SBram Moolenaar  call assert_equal([0, 5, 11, 0], getpos('.'))
1244eb992cb9SBram Moolenaar  " <S-Up> is the same as <PageUp>
1245eb992cb9SBram Moolenaar  " <S-Down> is the same as <PageDown>
1246eb992cb9SBram Moolenaar  call cursor(1, 1)
1247eb992cb9SBram Moolenaar  call feedkeys("i\<S-Down>\<esc>", 'tnix')
1248eb992cb9SBram Moolenaar  call assert_equal([0, 9, 1, 0], getpos('.'))
1249eb992cb9SBram Moolenaar  call feedkeys("i\<S-Down>\<esc>", 'tnix')
1250eb992cb9SBram Moolenaar  call assert_equal([0, 17, 1, 0], getpos('.'))
1251eb992cb9SBram Moolenaar  call feedkeys("i\<S-Down>\<esc>", 'tnix')
1252eb992cb9SBram Moolenaar  call assert_equal([0, 25, 1, 0], getpos('.'))
1253eb992cb9SBram Moolenaar  call feedkeys("i\<S-Down>\<esc>", 'tnix')
1254eb992cb9SBram Moolenaar  call assert_equal([0, 30, 1, 0], getpos('.'))
1255eb992cb9SBram Moolenaar  call feedkeys("i\<S-Down>\<esc>", 'tnix')
1256eb992cb9SBram Moolenaar  call assert_equal([0, 30, 1, 0], getpos('.'))
1257eb992cb9SBram Moolenaar  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1258eb992cb9SBram Moolenaar  call assert_equal([0, 29, 1, 0], getpos('.'))
1259eb992cb9SBram Moolenaar  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1260eb992cb9SBram Moolenaar  call assert_equal([0, 21, 1, 0], getpos('.'))
1261eb992cb9SBram Moolenaar  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1262eb992cb9SBram Moolenaar  call assert_equal([0, 13, 1, 0], getpos('.'))
1263eb992cb9SBram Moolenaar  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1264eb992cb9SBram Moolenaar  call assert_equal([0, 5, 1, 0], getpos('.'))
1265eb992cb9SBram Moolenaar  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1266eb992cb9SBram Moolenaar  call assert_equal([0, 5, 11, 0], getpos('.'))
1267eb992cb9SBram Moolenaar  set nostartofline
1268eb992cb9SBram Moolenaar  call cursor(30, 11)
1269eb992cb9SBram Moolenaar  norm! zt
1270eb992cb9SBram Moolenaar  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1271eb992cb9SBram Moolenaar  call assert_equal([0, 29, 11, 0], getpos('.'))
1272eb992cb9SBram Moolenaar  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1273eb992cb9SBram Moolenaar  call assert_equal([0, 21, 11, 0], getpos('.'))
1274eb992cb9SBram Moolenaar  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1275eb992cb9SBram Moolenaar  call assert_equal([0, 13, 11, 0], getpos('.'))
1276eb992cb9SBram Moolenaar  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1277eb992cb9SBram Moolenaar  call assert_equal([0, 5, 11, 0], getpos('.'))
1278eb992cb9SBram Moolenaar  call feedkeys("A\<PageUp>\<esc>", 'tnix')
1279eb992cb9SBram Moolenaar  call assert_equal([0, 5, 11, 0], getpos('.'))
1280eb992cb9SBram Moolenaar  call cursor(1, 1)
1281eb992cb9SBram Moolenaar  call feedkeys("A\<PageDown>\<esc>", 'tnix')
1282eb992cb9SBram Moolenaar  call assert_equal([0, 9, 11, 0], getpos('.'))
1283eb992cb9SBram Moolenaar  call feedkeys("A\<PageDown>\<esc>", 'tnix')
1284eb992cb9SBram Moolenaar  call assert_equal([0, 17, 11, 0], getpos('.'))
1285eb992cb9SBram Moolenaar  call feedkeys("A\<PageDown>\<esc>", 'tnix')
1286eb992cb9SBram Moolenaar  call assert_equal([0, 25, 11, 0], getpos('.'))
1287eb992cb9SBram Moolenaar  call feedkeys("A\<PageDown>\<esc>", 'tnix')
1288eb992cb9SBram Moolenaar  call assert_equal([0, 30, 11, 0], getpos('.'))
1289eb992cb9SBram Moolenaar  call feedkeys("A\<PageDown>\<esc>", 'tnix')
1290eb992cb9SBram Moolenaar  call assert_equal([0, 30, 11, 0], getpos('.'))
1291eb992cb9SBram Moolenaar  " <S-Up> is the same as <PageUp>
1292eb992cb9SBram Moolenaar  " <S-Down> is the same as <PageDown>
1293eb992cb9SBram Moolenaar  call cursor(30, 11)
1294eb992cb9SBram Moolenaar  norm! zt
1295eb992cb9SBram Moolenaar  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1296eb992cb9SBram Moolenaar  call assert_equal([0, 29, 11, 0], getpos('.'))
1297eb992cb9SBram Moolenaar  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1298eb992cb9SBram Moolenaar  call assert_equal([0, 21, 11, 0], getpos('.'))
1299eb992cb9SBram Moolenaar  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1300eb992cb9SBram Moolenaar  call assert_equal([0, 13, 11, 0], getpos('.'))
1301eb992cb9SBram Moolenaar  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1302eb992cb9SBram Moolenaar  call assert_equal([0, 5, 11, 0], getpos('.'))
1303eb992cb9SBram Moolenaar  call feedkeys("A\<S-Up>\<esc>", 'tnix')
1304eb992cb9SBram Moolenaar  call assert_equal([0, 5, 11, 0], getpos('.'))
1305eb992cb9SBram Moolenaar  call cursor(1, 1)
1306eb992cb9SBram Moolenaar  call feedkeys("A\<S-Down>\<esc>", 'tnix')
1307eb992cb9SBram Moolenaar  call assert_equal([0, 9, 11, 0], getpos('.'))
1308eb992cb9SBram Moolenaar  call feedkeys("A\<S-Down>\<esc>", 'tnix')
1309eb992cb9SBram Moolenaar  call assert_equal([0, 17, 11, 0], getpos('.'))
1310eb992cb9SBram Moolenaar  call feedkeys("A\<S-Down>\<esc>", 'tnix')
1311eb992cb9SBram Moolenaar  call assert_equal([0, 25, 11, 0], getpos('.'))
1312eb992cb9SBram Moolenaar  call feedkeys("A\<S-Down>\<esc>", 'tnix')
1313eb992cb9SBram Moolenaar  call assert_equal([0, 30, 11, 0], getpos('.'))
1314eb992cb9SBram Moolenaar  call feedkeys("A\<S-Down>\<esc>", 'tnix')
1315eb992cb9SBram Moolenaar  call assert_equal([0, 30, 11, 0], getpos('.'))
1316eb992cb9SBram Moolenaar  bw!
1317eb992cb9SBram Moolenaarendfunc
1318eb992cb9SBram Moolenaar
13191e115360SBram Moolenaarfunc Test_edit_forbidden()
1320eb992cb9SBram Moolenaar  new
1321eb992cb9SBram Moolenaar  " 1) edit in the sandbox is not allowed
1322eb992cb9SBram Moolenaar  call setline(1, 'a')
1323eb992cb9SBram Moolenaar  com! Sandbox :sandbox call feedkeys("i\<del>\<esc>", 'tnix')
1324eb992cb9SBram Moolenaar  call assert_fails(':Sandbox', 'E48:')
1325eb992cb9SBram Moolenaar  com! Sandbox :sandbox exe "norm! i\<del>"
1326eb992cb9SBram Moolenaar  call assert_fails(':Sandbox', 'E48:')
1327eb992cb9SBram Moolenaar  delcom Sandbox
1328eb992cb9SBram Moolenaar  call assert_equal(['a'], getline(1,'$'))
1329eb992cb9SBram Moolenaar  " 2) edit with textlock set
1330eb992cb9SBram Moolenaar  fu! DoIt()
1331eb992cb9SBram Moolenaar    call feedkeys("i\<del>\<esc>", 'tnix')
1332eb992cb9SBram Moolenaar  endfu
1333eb992cb9SBram Moolenaar  au InsertCharPre <buffer> :call DoIt()
1334eb992cb9SBram Moolenaar  try
1335eb992cb9SBram Moolenaar    call feedkeys("ix\<esc>", 'tnix')
1336eb992cb9SBram Moolenaar    call assert_fails(1, 'textlock')
1337ff06f283SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E565/ " catch E565: not allowed here
1338eb992cb9SBram Moolenaar  endtry
1339eb992cb9SBram Moolenaar  " TODO: Might be a bug: should x really be inserted here
1340eb992cb9SBram Moolenaar  call assert_equal(['xa'], getline(1, '$'))
1341eb992cb9SBram Moolenaar  delfu DoIt
1342eb992cb9SBram Moolenaar  try
1343eb992cb9SBram Moolenaar    call feedkeys("ix\<esc>", 'tnix')
1344eb992cb9SBram Moolenaar    call assert_fails(1, 'unknown function')
1345eb992cb9SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E117/ " catch E117: unknown function
1346eb992cb9SBram Moolenaar  endtry
1347eb992cb9SBram Moolenaar  au! InsertCharPre
1348eb992cb9SBram Moolenaar  " 3) edit when completion is shown
1349eb992cb9SBram Moolenaar  fun! Complete(findstart, base)
1350eb992cb9SBram Moolenaar    if a:findstart
1351eb992cb9SBram Moolenaar      return col('.')
1352eb992cb9SBram Moolenaar    else
1353eb992cb9SBram Moolenaar      call feedkeys("i\<del>\<esc>", 'tnix')
1354eb992cb9SBram Moolenaar      return []
1355eb992cb9SBram Moolenaar    endif
1356eb992cb9SBram Moolenaar  endfun
1357eb992cb9SBram Moolenaar  set completefunc=Complete
1358eb992cb9SBram Moolenaar  try
1359eb992cb9SBram Moolenaar    call feedkeys("i\<c-x>\<c-u>\<esc>", 'tnix')
1360eb992cb9SBram Moolenaar    call assert_fails(1, 'change in complete function')
1361ff06f283SBram Moolenaar  catch /^Vim\%((\a\+)\)\=:E565/ " catch E565
1362eb992cb9SBram Moolenaar  endtry
1363eb992cb9SBram Moolenaar  delfu Complete
1364eb992cb9SBram Moolenaar  set completefunc=
1365eb992cb9SBram Moolenaar  if has("rightleft") && exists("+fkmap")
1366eb992cb9SBram Moolenaar    " 4) 'R' when 'fkmap' and 'revins' is set.
1367eb992cb9SBram Moolenaar    set revins fkmap
1368eb992cb9SBram Moolenaar    try
1369eb992cb9SBram Moolenaar      normal Ri
1370eb992cb9SBram Moolenaar      call assert_fails(1, "R with 'fkmap' and 'ri' set")
1371eb992cb9SBram Moolenaar    catch
1372eb992cb9SBram Moolenaar    finally
1373eb992cb9SBram Moolenaar      set norevins nofkmap
1374eb992cb9SBram Moolenaar    endtry
1375eb992cb9SBram Moolenaar  endif
1376eb992cb9SBram Moolenaar  bw!
1377eb992cb9SBram Moolenaarendfunc
1378eb992cb9SBram Moolenaar
13791e115360SBram Moolenaarfunc Test_edit_rightleft()
1380eb992cb9SBram Moolenaar  " Cursor in rightleft mode moves differently
1381845e0ee5SBram Moolenaar  CheckFeature rightleft
1382eb992cb9SBram Moolenaar  call NewWindow(10, 20)
1383eb992cb9SBram Moolenaar  call setline(1, ['abc', 'def', 'ghi'])
1384eb992cb9SBram Moolenaar  call cursor(1, 2)
1385eb992cb9SBram Moolenaar  set rightleft
1386eb992cb9SBram Moolenaar  " Screen looks as expected
1387eb992cb9SBram Moolenaar  let lines = ScreenLines([1, 4], winwidth(0))
1388eb992cb9SBram Moolenaar  let expect = [
1389eb992cb9SBram Moolenaar        \"                 cba",
1390eb992cb9SBram Moolenaar        \"                 fed",
1391eb992cb9SBram Moolenaar        \"                 ihg",
1392eb992cb9SBram Moolenaar        \"                   ~"]
1393eb992cb9SBram Moolenaar  call assert_equal(join(expect, "\n"), join(lines, "\n"))
1394eb992cb9SBram Moolenaar  " 2) right moves to the left
1395eb992cb9SBram Moolenaar  call feedkeys("i\<right>\<esc>x", 'txin')
1396eb992cb9SBram Moolenaar  call assert_equal(['bc', 'def', 'ghi'], getline(1,'$'))
1397eb992cb9SBram Moolenaar  call cursor(1, 2)
1398eb992cb9SBram Moolenaar  call feedkeys("i\<s-right>\<esc>", 'txin')
1399eb992cb9SBram Moolenaar  call cursor(1, 2)
1400eb992cb9SBram Moolenaar  call feedkeys("i\<c-right>\<esc>", 'txin')
1401eb992cb9SBram Moolenaar  " Screen looks as expected
1402eb992cb9SBram Moolenaar  let lines = ScreenLines([1, 4], winwidth(0))
1403eb992cb9SBram Moolenaar  let expect = [
1404eb992cb9SBram Moolenaar        \"                  cb",
1405eb992cb9SBram Moolenaar        \"                 fed",
1406eb992cb9SBram Moolenaar        \"                 ihg",
1407eb992cb9SBram Moolenaar        \"                   ~"]
1408eb992cb9SBram Moolenaar  call assert_equal(join(expect, "\n"), join(lines, "\n"))
1409eb992cb9SBram Moolenaar  " 2) left moves to the right
1410eb992cb9SBram Moolenaar  call setline(1, ['abc', 'def', 'ghi'])
1411eb992cb9SBram Moolenaar  call cursor(1, 2)
1412eb992cb9SBram Moolenaar  call feedkeys("i\<left>\<esc>x", 'txin')
1413eb992cb9SBram Moolenaar  call assert_equal(['ac', 'def', 'ghi'], getline(1,'$'))
1414eb992cb9SBram Moolenaar  call cursor(1, 2)
1415eb992cb9SBram Moolenaar  call feedkeys("i\<s-left>\<esc>", 'txin')
1416eb992cb9SBram Moolenaar  call cursor(1, 2)
1417eb992cb9SBram Moolenaar  call feedkeys("i\<c-left>\<esc>", 'txin')
1418eb992cb9SBram Moolenaar  " Screen looks as expected
1419eb992cb9SBram Moolenaar  let lines = ScreenLines([1, 4], winwidth(0))
1420eb992cb9SBram Moolenaar  let expect = [
1421eb992cb9SBram Moolenaar        \"                  ca",
1422eb992cb9SBram Moolenaar        \"                 fed",
1423eb992cb9SBram Moolenaar        \"                 ihg",
1424eb992cb9SBram Moolenaar        \"                   ~"]
1425eb992cb9SBram Moolenaar  call assert_equal(join(expect, "\n"), join(lines, "\n"))
1426845e0ee5SBram Moolenaar  %d _
1427845e0ee5SBram Moolenaar  call test_override('redraw_flag', 1)
1428845e0ee5SBram Moolenaar  call test_override('char_avail', 1)
1429845e0ee5SBram Moolenaar  call feedkeys("a\<C-V>x41", "xt")
1430845e0ee5SBram Moolenaar  redraw!
1431845e0ee5SBram Moolenaar  call assert_equal(repeat(' ', 19) .. 'A', Screenline(1))
1432845e0ee5SBram Moolenaar  call test_override('ALL', 0)
1433eb992cb9SBram Moolenaar  set norightleft
1434eb992cb9SBram Moolenaar  bw!
1435eb992cb9SBram Moolenaarendfunc
1436658a3a2cSBram Moolenaar
1437658a3a2cSBram Moolenaarfunc Test_edit_complete_very_long_name()
14389b81079dSBram Moolenaar  " Long directory names only work on Unix.
14396d91bcb4SBram Moolenaar  CheckUnix
144015ecbd6fSBram Moolenaar
144115ecbd6fSBram Moolenaar  let dirname = getcwd() . "/Xdir"
144215ecbd6fSBram Moolenaar  let longdirname = dirname . repeat('/' . repeat('d', 255), 4)
144315ecbd6fSBram Moolenaar  try
144415ecbd6fSBram Moolenaar    call mkdir(longdirname, 'p')
144515ecbd6fSBram Moolenaar  catch /E739:/
144615ecbd6fSBram Moolenaar    " Long directory name probably not supported.
144715ecbd6fSBram Moolenaar    call delete(dirname, 'rf')
144815ecbd6fSBram Moolenaar    return
144915ecbd6fSBram Moolenaar  endtry
145015ecbd6fSBram Moolenaar
1451f8191c5fSBram Moolenaar  " Try to get the Vim window position before setting 'columns', so that we can
1452f8191c5fSBram Moolenaar  " move the window back to where it was.
1453ba6ec182SBram Moolenaar  let winposx = getwinposx()
1454ba6ec182SBram Moolenaar  let winposy = getwinposy()
1455f8191c5fSBram Moolenaar
1456f8191c5fSBram Moolenaar  if winposx >= 0 && winposy >= 0 && !has('gui_running')
1457f8191c5fSBram Moolenaar    " We did get the window position, but xterm may report the wrong numbers.
1458f8191c5fSBram Moolenaar    " Move the window to the reported position and compute any offset.
1459f8191c5fSBram Moolenaar    exe 'winpos ' . winposx . ' ' . winposy
1460f8191c5fSBram Moolenaar    sleep 100m
1461f8191c5fSBram Moolenaar    let x = getwinposx()
1462f8191c5fSBram Moolenaar    if x >= 0
1463f8191c5fSBram Moolenaar      let winposx += winposx - x
1464f8191c5fSBram Moolenaar    endif
1465f8191c5fSBram Moolenaar    let y = getwinposy()
1466f8191c5fSBram Moolenaar    if y >= 0
1467f8191c5fSBram Moolenaar      let winposy += winposy - y
1468f8191c5fSBram Moolenaar    endif
1469f8191c5fSBram Moolenaar  endif
1470f8191c5fSBram Moolenaar
1471658a3a2cSBram Moolenaar  let save_columns = &columns
147215ecbd6fSBram Moolenaar  " Need at least about 1100 columns to reproduce the problem.
1473ba6ec182SBram Moolenaar  set columns=2000
1474658a3a2cSBram Moolenaar  set noswapfile
1475ba6ec182SBram Moolenaar
1476658a3a2cSBram Moolenaar  let longfilename = longdirname . '/' . repeat('a', 255)
1477658a3a2cSBram Moolenaar  call writefile(['Totum', 'Table'], longfilename)
1478658a3a2cSBram Moolenaar  new
1479658a3a2cSBram Moolenaar  exe "next Xfile " . longfilename
1480658a3a2cSBram Moolenaar  exe "normal iT\<C-N>"
1481658a3a2cSBram Moolenaar
1482658a3a2cSBram Moolenaar  bwipe!
1483658a3a2cSBram Moolenaar  exe 'bwipe! ' . longfilename
1484658a3a2cSBram Moolenaar  call delete(dirname, 'rf')
1485658a3a2cSBram Moolenaar  let &columns = save_columns
1486ba6ec182SBram Moolenaar  if winposx >= 0 && winposy >= 0
1487ba6ec182SBram Moolenaar    exe 'winpos ' . winposx . ' ' . winposy
1488ba6ec182SBram Moolenaar  endif
1489658a3a2cSBram Moolenaar  set swapfile&
1490658a3a2cSBram Moolenaarendfunc
1491ff930cadSBram Moolenaar
14922c8c681bSBram Moolenaarfunc Test_edit_backtick()
14932c8c681bSBram Moolenaar  next a\`b c
14942c8c681bSBram Moolenaar  call assert_equal('a`b', expand('%'))
14952c8c681bSBram Moolenaar  next
14962c8c681bSBram Moolenaar  call assert_equal('c', expand('%'))
14972c8c681bSBram Moolenaar  call assert_equal('a\`b c', expand('##'))
14982c8c681bSBram Moolenaarendfunc
14992c8c681bSBram Moolenaar
1500ff930cadSBram Moolenaarfunc Test_edit_quit()
1501ff930cadSBram Moolenaar  edit foo.txt
1502ff930cadSBram Moolenaar  split
1503ff930cadSBram Moolenaar  new
1504ff930cadSBram Moolenaar  call setline(1, 'hello')
1505ff930cadSBram Moolenaar  3wincmd w
1506ff930cadSBram Moolenaar  redraw!
1507ff930cadSBram Moolenaar  call assert_fails('1q', 'E37:')
1508ff930cadSBram Moolenaar  bwipe! foo.txt
1509ff930cadSBram Moolenaar  only
1510ff930cadSBram Moolenaarendfunc
1511ff930cadSBram Moolenaar
1512adb8fbecSBram Moolenaarfunc Test_edit_alt()
1513adb8fbecSBram Moolenaar  " Keeping the cursor line didn't happen when the first line has indent.
1514adb8fbecSBram Moolenaar  new
1515adb8fbecSBram Moolenaar  call setline(1, ['  one', 'two', 'three'])
1516adb8fbecSBram Moolenaar  w XAltFile
1517adb8fbecSBram Moolenaar  $
1518adb8fbecSBram Moolenaar  call assert_equal(3, line('.'))
1519adb8fbecSBram Moolenaar  e Xother
1520adb8fbecSBram Moolenaar  e #
1521adb8fbecSBram Moolenaar  call assert_equal(3, line('.'))
1522adb8fbecSBram Moolenaar
1523adb8fbecSBram Moolenaar  bwipe XAltFile
1524adb8fbecSBram Moolenaar  call delete('XAltFile')
1525adb8fbecSBram Moolenaarendfunc
15264dbc2627SBram Moolenaar
1527db93495dSBram Moolenaarfunc Test_edit_InsertLeave()
15284dbc2627SBram Moolenaar  new
1529b53e13a9SBram Moolenaar  au InsertLeavePre * let g:did_au_pre = 1
15304dbc2627SBram Moolenaar  au InsertLeave * let g:did_au = 1
1531b53e13a9SBram Moolenaar  let g:did_au_pre = 0
15324dbc2627SBram Moolenaar  let g:did_au = 0
15334dbc2627SBram Moolenaar  call feedkeys("afoo\<Esc>", 'tx')
1534b53e13a9SBram Moolenaar  call assert_equal(1, g:did_au_pre)
15354dbc2627SBram Moolenaar  call assert_equal(1, g:did_au)
15364dbc2627SBram Moolenaar  call assert_equal('foo', getline(1))
15374dbc2627SBram Moolenaar
1538b53e13a9SBram Moolenaar  let g:did_au_pre = 0
15394dbc2627SBram Moolenaar  let g:did_au = 0
15404dbc2627SBram Moolenaar  call feedkeys("Sbar\<C-C>", 'tx')
1541b53e13a9SBram Moolenaar  call assert_equal(1, g:did_au_pre)
15424dbc2627SBram Moolenaar  call assert_equal(0, g:did_au)
15434dbc2627SBram Moolenaar  call assert_equal('bar', getline(1))
15444dbc2627SBram Moolenaar
15454dbc2627SBram Moolenaar  inoremap x xx<Esc>
1546b53e13a9SBram Moolenaar  let g:did_au_pre = 0
15474dbc2627SBram Moolenaar  let g:did_au = 0
15484dbc2627SBram Moolenaar  call feedkeys("Saax", 'tx')
1549b53e13a9SBram Moolenaar  call assert_equal(1, g:did_au_pre)
15504dbc2627SBram Moolenaar  call assert_equal(1, g:did_au)
15514dbc2627SBram Moolenaar  call assert_equal('aaxx', getline(1))
15524dbc2627SBram Moolenaar
15534dbc2627SBram Moolenaar  inoremap x xx<C-C>
1554b53e13a9SBram Moolenaar  let g:did_au_pre = 0
15554dbc2627SBram Moolenaar  let g:did_au = 0
15564dbc2627SBram Moolenaar  call feedkeys("Sbbx", 'tx')
1557b53e13a9SBram Moolenaar  call assert_equal(1, g:did_au_pre)
15584dbc2627SBram Moolenaar  call assert_equal(0, g:did_au)
15594dbc2627SBram Moolenaar  call assert_equal('bbxx', getline(1))
15604dbc2627SBram Moolenaar
15614dbc2627SBram Moolenaar  bwipe!
1562b53e13a9SBram Moolenaar  au! InsertLeave InsertLeavePre
15634dbc2627SBram Moolenaar  iunmap x
15644dbc2627SBram Moolenaarendfunc
1565c6b37db1SBram Moolenaar
1566db93495dSBram Moolenaarfunc Test_edit_InsertLeave_undo()
1567db93495dSBram Moolenaar  new XtestUndo
1568db93495dSBram Moolenaar  set undofile
1569db93495dSBram Moolenaar  au InsertLeave * wall
1570db93495dSBram Moolenaar  exe "normal ofoo\<Esc>"
1571db93495dSBram Moolenaar  call assert_equal(2, line('$'))
1572db93495dSBram Moolenaar  normal u
1573db93495dSBram Moolenaar  call assert_equal(1, line('$'))
1574db93495dSBram Moolenaar
1575db93495dSBram Moolenaar  bwipe!
1576db93495dSBram Moolenaar  au! InsertLeave
1577db93495dSBram Moolenaar  call delete('XtestUndo')
1578b340baedSBram Moolenaar  call delete(undofile('XtestUndo'))
1579db93495dSBram Moolenaar  set undofile&
1580db93495dSBram Moolenaarendfunc
1581db93495dSBram Moolenaar
1582c6b37db1SBram Moolenaar" Test for inserting characters using CTRL-V followed by a number.
1583c6b37db1SBram Moolenaarfunc Test_edit_special_chars()
1584c6b37db1SBram Moolenaar  new
1585c6b37db1SBram Moolenaar
1586c6b37db1SBram Moolenaar  if has("ebcdic")
1587c6b37db1SBram Moolenaar    let t = "o\<C-V>193\<C-V>xc2\<C-V>o303 \<C-V>90a\<C-V>xfg\<C-V>o578\<Esc>"
1588c6b37db1SBram Moolenaar  else
1589c6b37db1SBram Moolenaar    let t = "o\<C-V>65\<C-V>x42\<C-V>o103 \<C-V>33a\<C-V>xfg\<C-V>o78\<Esc>"
1590c6b37db1SBram Moolenaar  endif
1591c6b37db1SBram Moolenaar
1592c6b37db1SBram Moolenaar  exe "normal " . t
1593c6b37db1SBram Moolenaar  call assert_equal("ABC !a\<C-O>g\<C-G>8", getline(2))
1594c6b37db1SBram Moolenaar
1595c6b37db1SBram Moolenaar  close!
1596c6b37db1SBram Moolenaarendfunc
15978d3b5108SBram Moolenaar
15988d3b5108SBram Moolenaarfunc Test_edit_startinsert()
15998d3b5108SBram Moolenaar  new
16008d3b5108SBram Moolenaar  set backspace+=start
16018d3b5108SBram Moolenaar  call setline(1, 'foobar')
16028d3b5108SBram Moolenaar  call feedkeys("A\<C-U>\<Esc>", 'xt')
16038d3b5108SBram Moolenaar  call assert_equal('', getline(1))
16048d3b5108SBram Moolenaar
16058d3b5108SBram Moolenaar  call setline(1, 'foobar')
16068d3b5108SBram Moolenaar  call feedkeys(":startinsert!\<CR>\<C-U>\<Esc>", 'xt')
16078d3b5108SBram Moolenaar  call assert_equal('', getline(1))
16088d3b5108SBram Moolenaar
16098d3b5108SBram Moolenaar  set backspace&
16108d3b5108SBram Moolenaar  bwipe!
16118d3b5108SBram Moolenaarendfunc
1612177c9f2fSBram Moolenaar
1613bc2b71d4SBram Moolenaar" Test for :startreplace and :startgreplace
1614bc2b71d4SBram Moolenaarfunc Test_edit_startreplace()
1615bc2b71d4SBram Moolenaar  new
1616bc2b71d4SBram Moolenaar  call setline(1, 'abc')
1617bc2b71d4SBram Moolenaar  call feedkeys("l:startreplace\<CR>xyz\e", 'xt')
1618bc2b71d4SBram Moolenaar  call assert_equal('axyz', getline(1))
1619bc2b71d4SBram Moolenaar  call feedkeys("0:startreplace!\<CR>abc\e", 'xt')
1620bc2b71d4SBram Moolenaar  call assert_equal('axyzabc', getline(1))
1621bc2b71d4SBram Moolenaar  call setline(1, "a\tb")
1622bc2b71d4SBram Moolenaar  call feedkeys("0l:startgreplace\<CR>xyz\e", 'xt')
1623bc2b71d4SBram Moolenaar  call assert_equal("axyz\tb", getline(1))
1624bc2b71d4SBram Moolenaar  call feedkeys("0i\<C-R>=execute('startreplace')\<CR>12\e", 'xt')
1625bc2b71d4SBram Moolenaar  call assert_equal("12axyz\tb", getline(1))
1626bc2b71d4SBram Moolenaar  close!
1627bc2b71d4SBram Moolenaarendfunc
1628bc2b71d4SBram Moolenaar
1629177c9f2fSBram Moolenaarfunc Test_edit_noesckeys()
1630215ba3b6SBram Moolenaar  CheckNotGui
1631177c9f2fSBram Moolenaar  new
1632177c9f2fSBram Moolenaar
1633177c9f2fSBram Moolenaar  " <Left> moves cursor when 'esckeys' is set
1634177c9f2fSBram Moolenaar  exe "set t_kl=\<Esc>OD"
1635177c9f2fSBram Moolenaar  set esckeys
1636177c9f2fSBram Moolenaar  call feedkeys("axyz\<Esc>ODX", "xt")
1637177c9f2fSBram Moolenaar  call assert_equal("xyXz", getline(1))
1638177c9f2fSBram Moolenaar
1639177c9f2fSBram Moolenaar  " <Left> exits Insert mode when 'esckeys' is off
1640177c9f2fSBram Moolenaar  set noesckeys
1641177c9f2fSBram Moolenaar  call setline(1, '')
1642177c9f2fSBram Moolenaar  call feedkeys("axyz\<Esc>ODX", "xt")
1643177c9f2fSBram Moolenaar  call assert_equal(["DX", "xyz"], getline(1, 2))
1644177c9f2fSBram Moolenaar
1645177c9f2fSBram Moolenaar  bwipe!
1646177c9f2fSBram Moolenaar  set esckeys
1647177c9f2fSBram Moolenaarendfunc
1648bc2b71d4SBram Moolenaar
16491671f448SBram Moolenaar" Test for running an invalid ex command in insert mode using CTRL-O
16501671f448SBram Moolenaarfunc Test_edit_ctrl_o_invalid_cmd()
16511671f448SBram Moolenaar  new
16521671f448SBram Moolenaar  set showmode showcmd
1653b340baedSBram Moolenaar  " Avoid a sleep of 3 seconds. Zero might have side effects.
1654b340baedSBram Moolenaar  call test_override('ui_delay', 50)
16551671f448SBram Moolenaar  let caught_e492 = 0
16561671f448SBram Moolenaar  try
16571671f448SBram Moolenaar    call feedkeys("i\<C-O>:invalid\<CR>abc\<Esc>", "xt")
16581671f448SBram Moolenaar  catch /E492:/
16591671f448SBram Moolenaar    let caught_e492 = 1
16601671f448SBram Moolenaar  endtry
16611671f448SBram Moolenaar  call assert_equal(1, caught_e492)
16621671f448SBram Moolenaar  call assert_equal('abc', getline(1))
16631671f448SBram Moolenaar  set showmode& showcmd&
1664b340baedSBram Moolenaar  call test_override('ui_delay', 0)
16651671f448SBram Moolenaar  close!
16661671f448SBram Moolenaarendfunc
16671671f448SBram Moolenaar
1668b340baedSBram Moolenaar" Test for editing a file with a very long name
1669b340baedSBram Moolenaarfunc Test_edit_illegal_filename()
1670b340baedSBram Moolenaar  CheckEnglish
1671b340baedSBram Moolenaar  new
1672b340baedSBram Moolenaar  redir => msg
1673b340baedSBram Moolenaar  exe 'edit ' . repeat('f', 5000)
1674b340baedSBram Moolenaar  redir END
1675b340baedSBram Moolenaar  call assert_match("Illegal file name$", split(msg, "\n")[0])
1676b340baedSBram Moolenaar  close!
1677b340baedSBram Moolenaarendfunc
1678b340baedSBram Moolenaar
1679c8fe645cSBram Moolenaar" Test for editing a directory
1680c8fe645cSBram Moolenaarfunc Test_edit_is_a_directory()
1681c8fe645cSBram Moolenaar  CheckEnglish
1682c8fe645cSBram Moolenaar  let dirname = getcwd() . "/Xdir"
1683c8fe645cSBram Moolenaar  call mkdir(dirname, 'p')
1684c8fe645cSBram Moolenaar
1685c8fe645cSBram Moolenaar  new
1686c8fe645cSBram Moolenaar  redir => msg
1687c8fe645cSBram Moolenaar  exe 'edit' dirname
1688c8fe645cSBram Moolenaar  redir END
1689c8fe645cSBram Moolenaar  call assert_match("is a directory$", split(msg, "\n")[0])
1690c8fe645cSBram Moolenaar  bwipe!
1691c8fe645cSBram Moolenaar
1692c8fe645cSBram Moolenaar  let dirname .= '/'
1693c8fe645cSBram Moolenaar
1694c8fe645cSBram Moolenaar  new
1695c8fe645cSBram Moolenaar  redir => msg
1696c8fe645cSBram Moolenaar  exe 'edit' dirname
1697c8fe645cSBram Moolenaar  redir END
1698c8fe645cSBram Moolenaar  call assert_match("is a directory$", split(msg, "\n")[0])
1699c8fe645cSBram Moolenaar  bwipe!
1700c8fe645cSBram Moolenaar
1701c8fe645cSBram Moolenaar  call delete(dirname, 'rf')
1702c8fe645cSBram Moolenaarendfunc
1703c8fe645cSBram Moolenaar
1704b340baedSBram Moolenaar" Test for editing a file using invalid file encoding
1705b340baedSBram Moolenaarfunc Test_edit_invalid_encoding()
1706b340baedSBram Moolenaar  CheckEnglish
1707b340baedSBram Moolenaar  call writefile([], 'Xfile')
1708b340baedSBram Moolenaar  redir => msg
1709b340baedSBram Moolenaar  new ++enc=axbyc Xfile
1710b340baedSBram Moolenaar  redir END
1711b340baedSBram Moolenaar  call assert_match('\[NOT converted\]', msg)
1712b340baedSBram Moolenaar  call delete('Xfile')
1713b340baedSBram Moolenaar  close!
1714b340baedSBram Moolenaarendfunc
1715b340baedSBram Moolenaar
1716b340baedSBram Moolenaar" Test for the "charconvert" option
1717b340baedSBram Moolenaarfunc Test_edit_charconvert()
1718b340baedSBram Moolenaar  CheckEnglish
1719b340baedSBram Moolenaar  call writefile(['one', 'two'], 'Xfile')
1720b340baedSBram Moolenaar
1721b340baedSBram Moolenaar  " set 'charconvert' to a non-existing function
1722b340baedSBram Moolenaar  set charconvert=NonExitingFunc()
1723b340baedSBram Moolenaar  new
1724b340baedSBram Moolenaar  let caught_e117 = v:false
1725b340baedSBram Moolenaar  try
1726b340baedSBram Moolenaar    redir => msg
1727b340baedSBram Moolenaar    edit ++enc=axbyc Xfile
1728b340baedSBram Moolenaar  catch /E117:/
1729b340baedSBram Moolenaar    let caught_e117 = v:true
1730b340baedSBram Moolenaar  finally
1731b340baedSBram Moolenaar    redir END
1732b340baedSBram Moolenaar  endtry
1733b340baedSBram Moolenaar  call assert_true(caught_e117)
1734b340baedSBram Moolenaar  call assert_equal(['one', 'two'], getline(1, '$'))
1735b340baedSBram Moolenaar  call assert_match("Conversion with 'charconvert' failed", msg)
1736b340baedSBram Moolenaar  close!
1737b340baedSBram Moolenaar  set charconvert&
1738b340baedSBram Moolenaar
1739b340baedSBram Moolenaar  " 'charconvert' function doesn't create a output file
1740b340baedSBram Moolenaar  func Cconv1()
1741b340baedSBram Moolenaar  endfunc
1742b340baedSBram Moolenaar  set charconvert=Cconv1()
1743b340baedSBram Moolenaar  new
1744b340baedSBram Moolenaar  redir => msg
1745b340baedSBram Moolenaar  edit ++enc=axbyc Xfile
1746b340baedSBram Moolenaar  redir END
1747b340baedSBram Moolenaar  call assert_equal(['one', 'two'], getline(1, '$'))
1748b340baedSBram Moolenaar  call assert_match("can't read output of 'charconvert'", msg)
1749b340baedSBram Moolenaar  close!
1750b340baedSBram Moolenaar  delfunc Cconv1
1751b340baedSBram Moolenaar  set charconvert&
1752b340baedSBram Moolenaar
1753b340baedSBram Moolenaar  " 'charconvert' function to convert to upper case
1754b340baedSBram Moolenaar  func Cconv2()
1755b340baedSBram Moolenaar    let data = readfile(v:fname_in)
1756b340baedSBram Moolenaar    call map(data, 'toupper(v:val)')
1757b340baedSBram Moolenaar    call writefile(data, v:fname_out)
1758b340baedSBram Moolenaar  endfunc
1759b340baedSBram Moolenaar  set charconvert=Cconv2()
1760b340baedSBram Moolenaar  new Xfile
1761b340baedSBram Moolenaar  write ++enc=ucase Xfile1
1762b340baedSBram Moolenaar  call assert_equal(['ONE', 'TWO'], readfile('Xfile1'))
1763b340baedSBram Moolenaar  call delete('Xfile1')
1764b340baedSBram Moolenaar  close!
1765b340baedSBram Moolenaar  delfunc Cconv2
1766b340baedSBram Moolenaar  set charconvert&
1767b340baedSBram Moolenaar
1768b340baedSBram Moolenaar  " 'charconvert' function removes the input file
1769b340baedSBram Moolenaar  func Cconv3()
1770b340baedSBram Moolenaar    call delete(v:fname_in)
1771b340baedSBram Moolenaar  endfunc
1772b340baedSBram Moolenaar  set charconvert=Cconv3()
1773b340baedSBram Moolenaar  new
1774b340baedSBram Moolenaar  call assert_fails('edit ++enc=lcase Xfile', 'E202:')
1775b340baedSBram Moolenaar  call assert_equal([''], getline(1, '$'))
1776b340baedSBram Moolenaar  close!
1777b340baedSBram Moolenaar  delfunc Cconv3
1778b340baedSBram Moolenaar  set charconvert&
1779b340baedSBram Moolenaar
1780b340baedSBram Moolenaar  call delete('Xfile')
1781b340baedSBram Moolenaarendfunc
1782b340baedSBram Moolenaar
1783b340baedSBram Moolenaar" Test for editing a file without read permission
1784b340baedSBram Moolenaarfunc Test_edit_file_no_read_perm()
1785b340baedSBram Moolenaar  CheckUnix
178617709e28SBram Moolenaar  CheckNotRoot
178717709e28SBram Moolenaar
1788b340baedSBram Moolenaar  call writefile(['one', 'two'], 'Xfile')
1789b340baedSBram Moolenaar  call setfperm('Xfile', '-w-------')
1790b340baedSBram Moolenaar  new
1791b340baedSBram Moolenaar  redir => msg
1792b340baedSBram Moolenaar  edit Xfile
1793b340baedSBram Moolenaar  redir END
1794b340baedSBram Moolenaar  call assert_equal(1, &readonly)
1795b340baedSBram Moolenaar  call assert_equal([''], getline(1, '$'))
1796b340baedSBram Moolenaar  call assert_match('\[Permission Denied\]', msg)
1797b340baedSBram Moolenaar  close!
1798b340baedSBram Moolenaar  call delete('Xfile')
1799b340baedSBram Moolenaarendfunc
1800b340baedSBram Moolenaar
1801845e0ee5SBram Moolenaar" Pressing escape in 'insertmode' should beep
1802845e0ee5SBram Moolenaarfunc Test_edit_insertmode_esc_beeps()
1803845e0ee5SBram Moolenaar  new
1804845e0ee5SBram Moolenaar  set insertmode
1805845e0ee5SBram Moolenaar  call assert_beeps("call feedkeys(\"one\<Esc>\", 'xt')")
1806845e0ee5SBram Moolenaar  set insertmode&
1807845e0ee5SBram Moolenaar  " unsupported CTRL-G command should beep in insert mode.
1808845e0ee5SBram Moolenaar  call assert_beeps("normal i\<C-G>l")
1809845e0ee5SBram Moolenaar  close!
1810845e0ee5SBram Moolenaarendfunc
1811845e0ee5SBram Moolenaar
1812845e0ee5SBram Moolenaar" Test for 'hkmap' and 'hkmapp'
1813845e0ee5SBram Moolenaarfunc Test_edit_hkmap()
1814845e0ee5SBram Moolenaar  CheckFeature rightleft
1815845e0ee5SBram Moolenaar  if has('win32') && !has('gui')
18166d91bcb4SBram Moolenaar    throw 'Skipped: fails on the MS-Windows terminal version'
1817845e0ee5SBram Moolenaar  endif
1818845e0ee5SBram Moolenaar  new
1819845e0ee5SBram Moolenaar
1820845e0ee5SBram Moolenaar  set revins hkmap
1821845e0ee5SBram Moolenaar  let str = 'abcdefghijklmnopqrstuvwxyz'
1822845e0ee5SBram Moolenaar  let str ..= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
1823845e0ee5SBram Moolenaar  let str ..= '`/'',.;'
1824845e0ee5SBram Moolenaar  call feedkeys('i' .. str, 'xt')
1825845e0ee5SBram Moolenaar  let expected = "óõú,.;"
1826845e0ee5SBram Moolenaar  let expected ..= "ZYXWVUTSRQPONMLKJIHGFEDCBA"
1827845e0ee5SBram Moolenaar  let expected ..= "æèñ'äåàãø/ôíîöêìçïéòë÷âáðù"
1828845e0ee5SBram Moolenaar  call assert_equal(expected, getline(1))
1829845e0ee5SBram Moolenaar
1830845e0ee5SBram Moolenaar  %d
1831845e0ee5SBram Moolenaar  set revins hkmap hkmapp
1832845e0ee5SBram Moolenaar  let str = 'abcdefghijklmnopqrstuvwxyz'
1833845e0ee5SBram Moolenaar  let str ..= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
1834845e0ee5SBram Moolenaar  call feedkeys('i' .. str, 'xt')
1835845e0ee5SBram Moolenaar  let expected = "õYXWVUTSRQóOïíLKJIHGFEDêBA"
1836845e0ee5SBram Moolenaar  let expected ..= "öòXùåèúæø'ôñðîì÷çéäâóǟãëáà"
1837845e0ee5SBram Moolenaar  call assert_equal(expected, getline(1))
1838845e0ee5SBram Moolenaar
1839845e0ee5SBram Moolenaar  set revins& hkmap& hkmapp&
1840845e0ee5SBram Moolenaar  close!
1841845e0ee5SBram Moolenaarendfunc
1842845e0ee5SBram Moolenaar
1843845e0ee5SBram Moolenaar" Test for 'allowrevins' and using CTRL-_ in insert mode
1844845e0ee5SBram Moolenaarfunc Test_edit_allowrevins()
1845845e0ee5SBram Moolenaar  CheckFeature rightleft
1846845e0ee5SBram Moolenaar  new
1847845e0ee5SBram Moolenaar  set allowrevins
1848845e0ee5SBram Moolenaar  call feedkeys("iABC\<C-_>DEF\<C-_>GHI", 'xt')
1849845e0ee5SBram Moolenaar  call assert_equal('ABCFEDGHI', getline(1))
1850845e0ee5SBram Moolenaar  set allowrevins&
1851845e0ee5SBram Moolenaar  close!
1852845e0ee5SBram Moolenaarendfunc
1853845e0ee5SBram Moolenaar
1854845e0ee5SBram Moolenaar" Test for inserting a register in insert mode using CTRL-R
1855845e0ee5SBram Moolenaarfunc Test_edit_insert_reg()
1856845e0ee5SBram Moolenaar  new
1857845e0ee5SBram Moolenaar  let g:Line = ''
1858845e0ee5SBram Moolenaar  func SaveFirstLine()
1859845e0ee5SBram Moolenaar    let g:Line = Screenline(1)
1860845e0ee5SBram Moolenaar    return 'r'
1861845e0ee5SBram Moolenaar  endfunc
1862845e0ee5SBram Moolenaar  inoremap <expr> <buffer> <F2> SaveFirstLine()
1863845e0ee5SBram Moolenaar  call test_override('redraw_flag', 1)
1864845e0ee5SBram Moolenaar  call test_override('char_avail', 1)
1865845e0ee5SBram Moolenaar  let @r = 'sample'
1866845e0ee5SBram Moolenaar  call feedkeys("a\<C-R>=SaveFirstLine()\<CR>", "xt")
1867845e0ee5SBram Moolenaar  call assert_equal('"', g:Line)
1868845e0ee5SBram Moolenaar  call test_override('ALL', 0)
1869845e0ee5SBram Moolenaar  close!
1870845e0ee5SBram Moolenaarendfunc
1871845e0ee5SBram Moolenaar
1872845e0ee5SBram Moolenaar" When a character is inserted at the last position of the last line in a
1873845e0ee5SBram Moolenaar" window, the window contents should be scrolled one line up. If the top line
1874845e0ee5SBram Moolenaar" is part of a fold, then the entire fold should be scrolled up.
1875845e0ee5SBram Moolenaarfunc Test_edit_lastline_scroll()
1876845e0ee5SBram Moolenaar  new
1877845e0ee5SBram Moolenaar  let h = winheight(0)
1878845e0ee5SBram Moolenaar  let lines = ['one', 'two', 'three']
1879845e0ee5SBram Moolenaar  let lines += repeat(['vim'], h - 4)
1880845e0ee5SBram Moolenaar  call setline(1, lines)
1881845e0ee5SBram Moolenaar  call setline(h, repeat('x', winwidth(0) - 1))
1882845e0ee5SBram Moolenaar  call feedkeys("GAx", 'xt')
1883845e0ee5SBram Moolenaar  redraw!
1884845e0ee5SBram Moolenaar  call assert_equal(h - 1, winline())
1885845e0ee5SBram Moolenaar  call assert_equal(2, line('w0'))
1886845e0ee5SBram Moolenaar
1887845e0ee5SBram Moolenaar  " scroll with a fold
1888845e0ee5SBram Moolenaar  1,2fold
1889845e0ee5SBram Moolenaar  normal gg
1890845e0ee5SBram Moolenaar  call setline(h + 1, repeat('x', winwidth(0) - 1))
1891845e0ee5SBram Moolenaar  call feedkeys("GAx", 'xt')
1892845e0ee5SBram Moolenaar  redraw!
1893845e0ee5SBram Moolenaar  call assert_equal(h - 1, winline())
1894845e0ee5SBram Moolenaar  call assert_equal(3, line('w0'))
1895845e0ee5SBram Moolenaar
1896845e0ee5SBram Moolenaar  close!
1897845e0ee5SBram Moolenaarendfunc
1898845e0ee5SBram Moolenaar
189921cbe175SBram Moolenaarfunc Test_edit_browse()
190021cbe175SBram Moolenaar  " in the GUI this opens a file picker, we only test the terminal behavior
190121cbe175SBram Moolenaar  CheckNotGui
190221cbe175SBram Moolenaar
190321cbe175SBram Moolenaar  " ":browse xxx" checks for the FileExplorer augroup and assumes editing "."
190421cbe175SBram Moolenaar  " works then.
190521cbe175SBram Moolenaar  augroup FileExplorer
190621cbe175SBram Moolenaar    au!
190721cbe175SBram Moolenaar  augroup END
190821cbe175SBram Moolenaar
190921cbe175SBram Moolenaar  " When the USE_FNAME_CASE is defined this used to cause a crash.
191021cbe175SBram Moolenaar  browse enew
191121cbe175SBram Moolenaar  bwipe!
191221cbe175SBram Moolenaar
191321cbe175SBram Moolenaar  browse split
191421cbe175SBram Moolenaar  bwipe!
191521cbe175SBram Moolenaarendfunc
191621cbe175SBram Moolenaar
1917caf73dcfSBram Moolenaarfunc Test_read_invalid()
1918caf73dcfSBram Moolenaar  set encoding=latin1
1919caf73dcfSBram Moolenaar  " This was not properly checking for going past the end.
1920caf73dcfSBram Moolenaar  call assert_fails('r`=', 'E484')
1921caf73dcfSBram Moolenaar  set encoding=utf-8
1922caf73dcfSBram Moolenaarendfunc
1923caf73dcfSBram Moolenaar
192459585497SYegappan Lakshmanan" Test for the 'revins' option
192559585497SYegappan Lakshmananfunc Test_edit_revins()
192659585497SYegappan Lakshmanan  CheckFeature rightleft
192759585497SYegappan Lakshmanan  new
192859585497SYegappan Lakshmanan  set revins
192959585497SYegappan Lakshmanan  exe "normal! ione\ttwo three"
193059585497SYegappan Lakshmanan  call assert_equal("eerht owt\teno", getline(1))
193159585497SYegappan Lakshmanan  call setline(1, "one\ttwo three")
193259585497SYegappan Lakshmanan  normal! gg$bi a
193359585497SYegappan Lakshmanan  call assert_equal("one\ttwo a three", getline(1))
193459585497SYegappan Lakshmanan  exe "normal! $bi\<BS>\<BS>"
193559585497SYegappan Lakshmanan  call assert_equal("one\ttwo a ree", getline(1))
193659585497SYegappan Lakshmanan  exe "normal! 0wi\<C-W>"
193759585497SYegappan Lakshmanan  call assert_equal("one\t a ree", getline(1))
193859585497SYegappan Lakshmanan  exe "normal! 0wi\<C-U>"
193959585497SYegappan Lakshmanan  call assert_equal("one\t ", getline(1))
194059585497SYegappan Lakshmanan  " newline in insert mode starts at the end of the line
194159585497SYegappan Lakshmanan  call setline(1, 'one two three')
194259585497SYegappan Lakshmanan  exe "normal! wi\nfour"
194359585497SYegappan Lakshmanan  call assert_equal(['one two three', 'ruof'], getline(1, '$'))
194459585497SYegappan Lakshmanan  set revins&
194559585497SYegappan Lakshmanan  bw!
194659585497SYegappan Lakshmananendfunc
194759585497SYegappan Lakshmanan
194835a9a00aSBram Moolenaar" Test for getting the character of the line below after "p"
194935a9a00aSBram Moolenaarfunc Test_edit_put_CTRL_E()
195035a9a00aSBram Moolenaar  set encoding=latin1
195135a9a00aSBram Moolenaar  new
195235a9a00aSBram Moolenaar  let @" = ''
195335a9a00aSBram Moolenaar  sil! norm orggRx
195435a9a00aSBram Moolenaar  sil! norm pr
195535a9a00aSBram Moolenaar  call assert_equal(['r', 'r'], getline(1, 2))
195635a9a00aSBram Moolenaar  bwipe!
195735a9a00aSBram Moolenaar  set encoding=utf-8
195835a9a00aSBram Moolenaarendfunc
195935a9a00aSBram Moolenaar
1960f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=" Test for ModeChanged pattern
1961f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=func Test_mode_changes()
1962f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=  let g:index = 0
196325def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  let g:mode_seq = ['n', 'i', 'n', 'v', 'V', 'i', 'ix', 'i', 'ic', 'i', 'n', 'no', 'n', 'V', 'v', 's', 'n']
1964f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=  func! TestMode()
1965f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=    call assert_equal(g:mode_seq[g:index], get(v:event, "old_mode"))
1966f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=    call assert_equal(g:mode_seq[g:index + 1], get(v:event, "new_mode"))
1967d85931e6SBram Moolenaar    call assert_equal(mode(1), get(v:event, "new_mode"))
1968f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=    let g:index += 1
1969f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=  endfunc
1970f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=
1971f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=  au ModeChanged * :call TestMode()
197225def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  let g:n_to_any = 0
197325def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  au ModeChanged n:* let g:n_to_any += 1
197425def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  call feedkeys("i\<esc>vVca\<CR>\<C-X>\<C-L>\<esc>ggdG", 'tnix')
1975f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=
197625def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  let g:V_to_v = 0
197725def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  au ModeChanged V:v let g:V_to_v += 1
197825def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  call feedkeys("Vv\<C-G>\<esc>", 'tnix')
197925def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  call assert_equal(len(filter(g:mode_seq[1:], {idx, val -> val == 'n'})), g:n_to_any)
198025def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  call assert_equal(1, g:V_to_v)
1981d85931e6SBram Moolenaar  call assert_equal(len(g:mode_seq) - 1, g:index)
1982f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=
198372d2fa69SBram Moolenaar  let g:n_to_i = 0
198472d2fa69SBram Moolenaar  au ModeChanged n:i let g:n_to_i += 1
198572d2fa69SBram Moolenaar  let g:n_to_niI = 0
198672d2fa69SBram Moolenaar  au ModeChanged i:niI let g:n_to_niI += 1
198772d2fa69SBram Moolenaar  let g:niI_to_i = 0
198872d2fa69SBram Moolenaar  au ModeChanged niI:i let g:niI_to_i += 1
198972d2fa69SBram Moolenaar  let g:nany_to_i = 0
199072d2fa69SBram Moolenaar  au ModeChanged n*:i let g:nany_to_i += 1
199172d2fa69SBram Moolenaar  let g:i_to_n = 0
199272d2fa69SBram Moolenaar  au ModeChanged i:n let g:i_to_n += 1
199372d2fa69SBram Moolenaar  let g:nori_to_any = 0
199472d2fa69SBram Moolenaar  au ModeChanged [ni]:* let g:nori_to_any += 1
199572d2fa69SBram Moolenaar  let g:i_to_any = 0
199672d2fa69SBram Moolenaar  au ModeChanged i:* let g:i_to_any += 1
1997d85931e6SBram Moolenaar  let g:index = 0
1998d85931e6SBram Moolenaar  let g:mode_seq = ['n', 'i', 'niI', 'i', 'n']
1999d85931e6SBram Moolenaar  call feedkeys("a\<C-O>l\<esc>", 'tnix')
2000f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=  call assert_equal(len(g:mode_seq) - 1, g:index)
200172d2fa69SBram Moolenaar  call assert_equal(1, g:n_to_i)
200272d2fa69SBram Moolenaar  call assert_equal(1, g:n_to_niI)
200372d2fa69SBram Moolenaar  call assert_equal(1, g:niI_to_i)
200472d2fa69SBram Moolenaar  call assert_equal(2, g:nany_to_i)
200572d2fa69SBram Moolenaar  call assert_equal(1, g:i_to_n)
200672d2fa69SBram Moolenaar  call assert_equal(2, g:i_to_any)
200772d2fa69SBram Moolenaar  call assert_equal(3, g:nori_to_any)
2008f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=
200925def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  if has('terminal')
201025def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=    let g:mode_seq += ['c', 'n', 't', 'nt', 'c', 'nt', 'n']
201125def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=    call feedkeys(":term\<CR>\<C-W>N:bd!\<CR>", 'tnix')
201225def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=    call assert_equal(len(g:mode_seq) - 1, g:index)
201325def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=    call assert_equal(1, g:n_to_i)
201425def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=    call assert_equal(1, g:n_to_niI)
201525def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=    call assert_equal(1, g:niI_to_i)
201625def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=    call assert_equal(2, g:nany_to_i)
201725def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=    call assert_equal(1, g:i_to_n)
201825def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=    call assert_equal(2, g:i_to_any)
201925def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=    call assert_equal(5, g:nori_to_any)
202025def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  endif
202125def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=
2022f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=  au! ModeChanged
2023f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=  delfunc TestMode
2024f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=  unlet! g:mode_seq
2025f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=  unlet! g:index
202625def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  unlet! g:n_to_any
202725def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  unlet! g:V_to_v
202825def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  unlet! g:n_to_i
202925def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  unlet! g:n_to_niI
203025def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  unlet! g:niI_to_i
203125def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  unlet! g:nany_to_i
203225def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  unlet! g:i_to_n
203325def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  unlet! g:nori_to_any
203425def2c8S=?UTF-8?q?Magnus=20Gro=C3=9F?=  unlet! g:i_to_any
2035f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=endfunc
2036f1e8876fS=?UTF-8?q?Magnus=20Gro=C3=9F?=
20373075a455SBram Moolenaarfunc Test_recursive_ModeChanged()
20383075a455SBram Moolenaar  au! ModeChanged * norm 0u
20393075a455SBram Moolenaar  sil! norm 
2040*a062006bSBram Moolenaar  au! ModeChanged
2041*a062006bSBram Moolenaarendfunc
2042*a062006bSBram Moolenaar
2043*a062006bSBram Moolenaarfunc Test_ModeChanged_starts_visual()
2044*a062006bSBram Moolenaar  " This was triggering ModeChanged before setting VIsual, causing a crash.
2045*a062006bSBram Moolenaar  au! ModeChanged * norm 0u
2046*a062006bSBram Moolenaar  sil! norm 
2047*a062006bSBram Moolenaar
2048*a062006bSBram Moolenaar  au! ModeChanged
20493075a455SBram Moolenaarendfunc
20503075a455SBram Moolenaar
20519cd063e3SDominique Pelle" Test toggling of input method. See :help i_CTRL-^
20529cd063e3SDominique Pellefunc Test_edit_CTRL_hat()
20539cd063e3SDominique Pelle  CheckFeature xim
20548753c1ddSDominique Pelle
20558753c1ddSDominique Pelle  " FIXME: test fails with Athena and Motif GUI.
20568753c1ddSDominique Pelle  "        test also fails when running in the GUI.
20578753c1ddSDominique Pelle  CheckFeature gui_gtk
20588753c1ddSDominique Pelle  CheckNotGui
20599cd063e3SDominique Pelle
20609cd063e3SDominique Pelle  new
20619cd063e3SDominique Pelle
20629cd063e3SDominique Pelle  call assert_equal(0, &iminsert)
20639cd063e3SDominique Pelle  call feedkeys("i\<C-^>", 'xt')
20649cd063e3SDominique Pelle  call assert_equal(2, &iminsert)
20659cd063e3SDominique Pelle  call feedkeys("i\<C-^>", 'xt')
20669cd063e3SDominique Pelle  call assert_equal(0, &iminsert)
20679cd063e3SDominique Pelle
20689cd063e3SDominique Pelle  bwipe!
20699cd063e3SDominique Pelleendfunc
20709cd063e3SDominique Pelle
20719cd063e3SDominique Pelle
2072bc2b71d4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
2073