19aa15691SBram Moolenaar" Tests for 'virtualedit'.
29aa15691SBram Moolenaar
39aa15691SBram Moolenaarfunc Test_yank_move_change()
4d41babefSBram Moolenaar  new
59aa15691SBram Moolenaar  call setline(1, [
69aa15691SBram Moolenaar	\ "func foo() error {",
79aa15691SBram Moolenaar	\ "\tif n, err := bar();",
89aa15691SBram Moolenaar	\ "\terr != nil {",
99aa15691SBram Moolenaar	\ "\t\treturn err",
109aa15691SBram Moolenaar	\ "\t}",
119aa15691SBram Moolenaar	\ "\tn = n * n",
129aa15691SBram Moolenaar	\ ])
139aa15691SBram Moolenaar  set virtualedit=all
149aa15691SBram Moolenaar  set ts=4
159aa15691SBram Moolenaar  function! MoveSelectionDown(count) abort
169aa15691SBram Moolenaar    normal! m`
179aa15691SBram Moolenaar    silent! exe "'<,'>move'>+".a:count
189aa15691SBram Moolenaar    norm! ``
199aa15691SBram Moolenaar  endfunction
209aa15691SBram Moolenaar
219aa15691SBram Moolenaar  xmap ]e :<C-U>call MoveSelectionDown(v:count1)<CR>
229aa15691SBram Moolenaar  2
239aa15691SBram Moolenaar  normal 2gg
249aa15691SBram Moolenaar  normal J
259aa15691SBram Moolenaar  normal jVj
269aa15691SBram Moolenaar  normal ]e
279aa15691SBram Moolenaar  normal ce
289aa15691SBram Moolenaar  bwipe!
299aa15691SBram Moolenaar  set virtualedit=
309aa15691SBram Moolenaar  set ts=8
319aa15691SBram Moolenaarendfunc
32d41babefSBram Moolenaar
33d41babefSBram Moolenaarfunc Test_paste_end_of_line()
34d41babefSBram Moolenaar  new
35d41babefSBram Moolenaar  set virtualedit=all
36d41babefSBram Moolenaar  call setline(1, ['456', '123'])
37d41babefSBram Moolenaar  normal! gg0"ay$
38d41babefSBram Moolenaar  exe "normal! 2G$lllA\<C-O>:normal! \"agP\r"
39d41babefSBram Moolenaar  call assert_equal('123456', getline(2))
40d41babefSBram Moolenaar
41d41babefSBram Moolenaar  bwipe!
42d41babefSBram Moolenaar  set virtualedit=
43d41babefSBram Moolenaarendfunc
44db0eedecSBram Moolenaar
45630afe88SBram Moolenaarfunc Test_replace_end_of_line()
46630afe88SBram Moolenaar  new
47630afe88SBram Moolenaar  set virtualedit=all
48630afe88SBram Moolenaar  call setline(1, range(20))
49630afe88SBram Moolenaar  exe "normal! gg2jv10lr-"
50630afe88SBram Moolenaar  call assert_equal(["1", "-----------", "3"], getline(2,4))
51630afe88SBram Moolenaar  call setline(1, range(20))
52630afe88SBram Moolenaar  exe "normal! gg2jv10lr\<c-k>hh"
53630afe88SBram Moolenaar  call assert_equal(["1", "───────────", "3"], getline(2,4))
54630afe88SBram Moolenaar
55630afe88SBram Moolenaar  bwipe!
56630afe88SBram Moolenaar  set virtualedit=
57630afe88SBram Moolenaarendfunc
58630afe88SBram Moolenaar
59db0eedecSBram Moolenaarfunc Test_edit_CTRL_G()
60db0eedecSBram Moolenaar  new
61db0eedecSBram Moolenaar  set virtualedit=insert
62db0eedecSBram Moolenaar  call setline(1, ['123', '1', '12'])
63db0eedecSBram Moolenaar  exe "normal! ggA\<c-g>jx\<c-g>jx"
64db0eedecSBram Moolenaar  call assert_equal(['123', '1  x', '12 x'], getline(1,'$'))
65db0eedecSBram Moolenaar
66db0eedecSBram Moolenaar  set virtualedit=all
67db0eedecSBram Moolenaar  %d_
68db0eedecSBram Moolenaar  call setline(1, ['1', '12'])
69db0eedecSBram Moolenaar  exe "normal! ggllix\<c-g>jx"
70db0eedecSBram Moolenaar  call assert_equal(['1 x', '12x'], getline(1,'$'))
71db0eedecSBram Moolenaar
72db0eedecSBram Moolenaar
73db0eedecSBram Moolenaar  bwipe!
74db0eedecSBram Moolenaar  set virtualedit=
75db0eedecSBram Moolenaarendfunc
7677ccc003SBram Moolenaar
7777ccc003SBram Moolenaarfunc Test_edit_change()
7877ccc003SBram Moolenaar  new
7977ccc003SBram Moolenaar  set virtualedit=all
8077ccc003SBram Moolenaar  call setline(1, "\t⒌")
8177ccc003SBram Moolenaar  normal Cx
8277ccc003SBram Moolenaar  call assert_equal('x', getline(1))
833e72dcadSBram Moolenaar  " Do a visual block change
843e72dcadSBram Moolenaar  call setline(1, ['a', 'b', 'c'])
853e72dcadSBram Moolenaar  exe "normal gg3l\<C-V>2jcx"
863e72dcadSBram Moolenaar  call assert_equal(['a  x', 'b  x', 'c  x'], getline(1, '$'))
8777ccc003SBram Moolenaar  bwipe!
886f1f0ca3SBram Moolenaar  set virtualedit=
896f1f0ca3SBram Moolenaarendfunc
906f1f0ca3SBram Moolenaar
9154c8d229SBram Moolenaar" Tests for pasting at the beginning, end and middle of a tab character
9254c8d229SBram Moolenaar" in virtual edit mode.
936f1f0ca3SBram Moolenaarfunc Test_paste_in_tab()
946f1f0ca3SBram Moolenaar  new
9554c8d229SBram Moolenaar  call append(0, '')
966f1f0ca3SBram Moolenaar  set virtualedit=all
9754c8d229SBram Moolenaar
9854c8d229SBram Moolenaar  " Tests for pasting a register with characterwise mode type
9954c8d229SBram Moolenaar  call setreg('"', 'xyz', 'c')
10054c8d229SBram Moolenaar
10154c8d229SBram Moolenaar  " paste (p) unnamed register at the beginning of a tab
1026f1f0ca3SBram Moolenaar  call setline(1, "a\tb")
10354c8d229SBram Moolenaar  call cursor(1, 2, 0)
10454c8d229SBram Moolenaar  normal p
10554c8d229SBram Moolenaar  call assert_equal('a xyz      b', getline(1))
10654c8d229SBram Moolenaar
10754c8d229SBram Moolenaar  " paste (P) unnamed register at the beginning of a tab
10854c8d229SBram Moolenaar  call setline(1, "a\tb")
10954c8d229SBram Moolenaar  call cursor(1, 2, 0)
1106f1f0ca3SBram Moolenaar  normal P
1116f1f0ca3SBram Moolenaar  call assert_equal("axyz\tb", getline(1))
1126f1f0ca3SBram Moolenaar
11354c8d229SBram Moolenaar  " paste (p) unnamed register at the end of a tab
1146f1f0ca3SBram Moolenaar  call setline(1, "a\tb")
1156f1f0ca3SBram Moolenaar  call cursor(1, 2, 6)
1166f1f0ca3SBram Moolenaar  normal p
1176f1f0ca3SBram Moolenaar  call assert_equal("a\txyzb", getline(1))
11854c8d229SBram Moolenaar
11954c8d229SBram Moolenaar  " paste (P) unnamed register at the end of a tab
1206f1f0ca3SBram Moolenaar  call setline(1, "a\tb")
1216f1f0ca3SBram Moolenaar  call cursor(1, 2, 6)
1226f1f0ca3SBram Moolenaar  normal P
12354c8d229SBram Moolenaar  call assert_equal('a      xyz b', getline(1))
1246f1f0ca3SBram Moolenaar
12554c8d229SBram Moolenaar  " Tests for pasting a register with blockwise mode type
12654c8d229SBram Moolenaar  call setreg('"', 'xyz', 'b')
12754c8d229SBram Moolenaar
12854c8d229SBram Moolenaar  " paste (p) unnamed register at the beginning of a tab
12954c8d229SBram Moolenaar  call setline(1, "a\tb")
13054c8d229SBram Moolenaar  call cursor(1, 2, 0)
13154c8d229SBram Moolenaar  normal p
13254c8d229SBram Moolenaar  call assert_equal('a xyz      b', getline(1))
13354c8d229SBram Moolenaar
13454c8d229SBram Moolenaar  " paste (P) unnamed register at the beginning of a tab
13554c8d229SBram Moolenaar  call setline(1, "a\tb")
13654c8d229SBram Moolenaar  call cursor(1, 2, 0)
13754c8d229SBram Moolenaar  normal P
13854c8d229SBram Moolenaar  call assert_equal("axyz\tb", getline(1))
13954c8d229SBram Moolenaar
14054c8d229SBram Moolenaar  " paste (p) unnamed register at the end of a tab
14154c8d229SBram Moolenaar  call setline(1, "a\tb")
14254c8d229SBram Moolenaar  call cursor(1, 2, 6)
14354c8d229SBram Moolenaar  normal p
14454c8d229SBram Moolenaar  call assert_equal("a\txyzb", getline(1))
14554c8d229SBram Moolenaar
14654c8d229SBram Moolenaar  " paste (P) unnamed register at the end of a tab
14754c8d229SBram Moolenaar  call setline(1, "a\tb")
14854c8d229SBram Moolenaar  call cursor(1, 2, 6)
14954c8d229SBram Moolenaar  normal P
15054c8d229SBram Moolenaar  call assert_equal('a      xyz b', getline(1))
15154c8d229SBram Moolenaar
15254c8d229SBram Moolenaar  " Tests for pasting with gp and gP in virtual edit mode
15354c8d229SBram Moolenaar
15454c8d229SBram Moolenaar  " paste (gp) unnamed register at the beginning of a tab
15554c8d229SBram Moolenaar  call setline(1, "a\tb")
15654c8d229SBram Moolenaar  call cursor(1, 2, 0)
15754c8d229SBram Moolenaar  normal gp
15854c8d229SBram Moolenaar  call assert_equal('a xyz      b', getline(1))
15954c8d229SBram Moolenaar  call assert_equal([0, 1, 12, 0, 12], getcurpos())
16054c8d229SBram Moolenaar
16154c8d229SBram Moolenaar  " paste (gP) unnamed register at the beginning of a tab
16254c8d229SBram Moolenaar  call setline(1, "a\tb")
16354c8d229SBram Moolenaar  call cursor(1, 2, 0)
16454c8d229SBram Moolenaar  normal gP
16554c8d229SBram Moolenaar  call assert_equal("axyz\tb", getline(1))
16654c8d229SBram Moolenaar  call assert_equal([0, 1, 5, 0, 5], getcurpos())
16754c8d229SBram Moolenaar
16854c8d229SBram Moolenaar  " paste (gp) unnamed register at the end of a tab
1696f1f0ca3SBram Moolenaar  call setline(1, "a\tb")
1706f1f0ca3SBram Moolenaar  call cursor(1, 2, 6)
1716f1f0ca3SBram Moolenaar  normal gp
1726f1f0ca3SBram Moolenaar  call assert_equal("a\txyzb", getline(1))
1736f1f0ca3SBram Moolenaar  call assert_equal([0, 1, 6, 0, 12], getcurpos())
17454c8d229SBram Moolenaar
17554c8d229SBram Moolenaar  " paste (gP) unnamed register at the end of a tab
1766f1f0ca3SBram Moolenaar  call setline(1, "a\tb")
1776f1f0ca3SBram Moolenaar  call cursor(1, 2, 6)
1786f1f0ca3SBram Moolenaar  normal gP
17954c8d229SBram Moolenaar  call assert_equal('a      xyz b', getline(1))
1806f1f0ca3SBram Moolenaar  call assert_equal([0, 1, 12, 0, 12], getcurpos())
1816f1f0ca3SBram Moolenaar
18254c8d229SBram Moolenaar  " Tests for pasting a named register
18354c8d229SBram Moolenaar  let @r = 'xyz'
18454c8d229SBram Moolenaar
18554c8d229SBram Moolenaar  " paste (gp) named register in the middle of a tab
18654c8d229SBram Moolenaar  call setline(1, "a\tb")
18754c8d229SBram Moolenaar  call cursor(1, 2, 2)
18854c8d229SBram Moolenaar  normal "rgp
18954c8d229SBram Moolenaar  call assert_equal('a   xyz    b', getline(1))
19054c8d229SBram Moolenaar  call assert_equal([0, 1, 8, 0, 8], getcurpos())
19154c8d229SBram Moolenaar
19254c8d229SBram Moolenaar  " paste (gP) named register in the middle of a tab
19354c8d229SBram Moolenaar  call setline(1, "a\tb")
19454c8d229SBram Moolenaar  call cursor(1, 2, 2)
19554c8d229SBram Moolenaar  normal "rgP
19654c8d229SBram Moolenaar  call assert_equal('a  xyz     b', getline(1))
19754c8d229SBram Moolenaar  call assert_equal([0, 1, 7, 0, 7], getcurpos())
19854c8d229SBram Moolenaar
1996f1f0ca3SBram Moolenaar  bwipe!
2006f1f0ca3SBram Moolenaar  set virtualedit=
20177ccc003SBram Moolenaarendfunc
20254c8d229SBram Moolenaar
20354c8d229SBram Moolenaar" Test for yanking a few spaces within a tab to a register
20454c8d229SBram Moolenaarfunc Test_yank_in_tab()
20554c8d229SBram Moolenaar  new
20654c8d229SBram Moolenaar  let @r = ''
20754c8d229SBram Moolenaar  call setline(1, "a\tb")
20854c8d229SBram Moolenaar  set virtualedit=all
20954c8d229SBram Moolenaar  call cursor(1, 2, 2)
21054c8d229SBram Moolenaar  normal "ry5l
21154c8d229SBram Moolenaar  call assert_equal('     ', @r)
21254c8d229SBram Moolenaar
21354c8d229SBram Moolenaar  bwipe!
21454c8d229SBram Moolenaar  set virtualedit=
21554c8d229SBram Moolenaarendfunc
21654c8d229SBram Moolenaar
217079119baSBram Moolenaar" Insert "keyword keyw", ESC, C CTRL-N, shows "keyword ykeyword".
218079119baSBram Moolenaar" Repeating CTRL-N fixes it. (Mary Ellen Foster)
219079119baSBram Moolenaarfunc Test_ve_completion()
220079119baSBram Moolenaar  new
221079119baSBram Moolenaar  set completeopt&vim
222079119baSBram Moolenaar  set virtualedit=all
223079119baSBram Moolenaar  exe "normal ikeyword keyw\<Esc>C\<C-N>"
224079119baSBram Moolenaar  call assert_equal('keyword keyword', getline(1))
225079119baSBram Moolenaar  bwipe!
226079119baSBram Moolenaar  set virtualedit=
227079119baSBram Moolenaarendfunc
228079119baSBram Moolenaar
229079119baSBram Moolenaar" Using "C" then then <CR> moves the last remaining character to the next
230079119baSBram Moolenaar" line.  (Mary Ellen Foster)
231079119baSBram Moolenaarfunc Test_ve_del_to_eol()
232079119baSBram Moolenaar  new
233079119baSBram Moolenaar  set virtualedit=all
234079119baSBram Moolenaar  call append(0, 'all your base are belong to us')
235079119baSBram Moolenaar  call search('are', 'w')
236079119baSBram Moolenaar  exe "normal C\<CR>are belong to vim"
237079119baSBram Moolenaar  call assert_equal(['all your base ', 'are belong to vim'], getline(1, 2))
238079119baSBram Moolenaar  bwipe!
239079119baSBram Moolenaar  set virtualedit=
240079119baSBram Moolenaarendfunc
241079119baSBram Moolenaar
242079119baSBram Moolenaar" When past the end of a line that ends in a single character "b" skips
243079119baSBram Moolenaar" that word.
244079119baSBram Moolenaarfunc Test_ve_b_past_eol()
245079119baSBram Moolenaar  new
246079119baSBram Moolenaar  set virtualedit=all
247079119baSBram Moolenaar  call append(0, '1 2 3 4 5 6')
248079119baSBram Moolenaar  normal gg^$15lbC7
249079119baSBram Moolenaar  call assert_equal('1 2 3 4 5 7', getline(1))
250079119baSBram Moolenaar  bwipe!
251079119baSBram Moolenaar  set virtualedit=
252079119baSBram Moolenaarendfunc
253079119baSBram Moolenaar
254079119baSBram Moolenaar" Make sure 'i', 'C', 'a', 'A' and 'D' works
255079119baSBram Moolenaarfunc Test_ve_ins_del()
256079119baSBram Moolenaar  new
257079119baSBram Moolenaar  set virtualedit=all
258079119baSBram Moolenaar  call append(0, ["'i'", "'C'", "'a'", "'A'", "'D'"])
259079119baSBram Moolenaar  call cursor(1, 1)
260079119baSBram Moolenaar  normal $4lix
261079119baSBram Moolenaar  call assert_equal("'i'   x", getline(1))
262079119baSBram Moolenaar  call cursor(2, 1)
263079119baSBram Moolenaar  normal $4lCx
264079119baSBram Moolenaar  call assert_equal("'C'   x", getline(2))
265079119baSBram Moolenaar  call cursor(3, 1)
266079119baSBram Moolenaar  normal $4lax
267079119baSBram Moolenaar  call assert_equal("'a'    x", getline(3))
268079119baSBram Moolenaar  call cursor(4, 1)
269079119baSBram Moolenaar  normal $4lAx
270079119baSBram Moolenaar  call assert_equal("'A'x", getline(4))
271079119baSBram Moolenaar  call cursor(5, 1)
272079119baSBram Moolenaar  normal $4lDix
273079119baSBram Moolenaar  call assert_equal("'D'   x", getline(5))
274079119baSBram Moolenaar  bwipe!
275079119baSBram Moolenaar  set virtualedit=
276079119baSBram Moolenaarendfunc
277079119baSBram Moolenaar
278079119baSBram Moolenaar" Test for yank bug reported by Mark Waggoner.
279079119baSBram Moolenaarfunc Test_yank_block()
280079119baSBram Moolenaar  new
281079119baSBram Moolenaar  set virtualedit=block
282079119baSBram Moolenaar  call append(0, repeat(['this is a test'], 3))
283079119baSBram Moolenaar  exe "normal gg^2w\<C-V>3jy"
284079119baSBram Moolenaar  call assert_equal("a\na\na\n ", @")
285079119baSBram Moolenaar  bwipe!
286079119baSBram Moolenaar  set virtualedit=
287079119baSBram Moolenaarendfunc
288079119baSBram Moolenaar
289079119baSBram Moolenaar" Test "r" beyond the end of the line
290079119baSBram Moolenaarfunc Test_replace_after_eol()
291079119baSBram Moolenaar  new
292079119baSBram Moolenaar  set virtualedit=all
293079119baSBram Moolenaar  call append(0, '"r"')
294079119baSBram Moolenaar  normal gg$5lrxa
295079119baSBram Moolenaar  call assert_equal('"r"    x', getline(1))
2963e72dcadSBram Moolenaar  " visual block replace
2973e72dcadSBram Moolenaar  %d _
2983e72dcadSBram Moolenaar  call setline(1, ['a', '', 'b'])
2993e72dcadSBram Moolenaar  exe "normal 2l\<C-V>2jrx"
3003e72dcadSBram Moolenaar  call assert_equal(['a x', '  x', 'b x'], getline(1, '$'))
3013e72dcadSBram Moolenaar  " visual characterwise selection replace after eol
3023e72dcadSBram Moolenaar  %d _
3033e72dcadSBram Moolenaar  call setline(1, 'a')
3043e72dcadSBram Moolenaar  normal 4lv2lrx
3053e72dcadSBram Moolenaar  call assert_equal('a   xxx', getline(1))
306079119baSBram Moolenaar  bwipe!
307079119baSBram Moolenaar  set virtualedit=
308079119baSBram Moolenaarendfunc
309079119baSBram Moolenaar
310079119baSBram Moolenaar" Test "r" on a tab
311079119baSBram Moolenaar" Note that for this test, 'ts' must be 8 (the default).
312079119baSBram Moolenaarfunc Test_replace_on_tab()
313079119baSBram Moolenaar  new
314079119baSBram Moolenaar  set virtualedit=all
315079119baSBram Moolenaar  call append(0, "'r'\t")
316079119baSBram Moolenaar  normal gg^5lrxAy
317079119baSBram Moolenaar  call assert_equal("'r'  x  y", getline(1))
318f5f1e10dSBram Moolenaar  call setline(1, 'aaaaaaaaaaaa')
319f5f1e10dSBram Moolenaar  exe "normal! gg2lgR\<Tab>"
320f5f1e10dSBram Moolenaar  call assert_equal("aa\taaaa", getline(1))
321079119baSBram Moolenaar  bwipe!
322079119baSBram Moolenaar  set virtualedit=
323079119baSBram Moolenaarendfunc
324079119baSBram Moolenaar
325079119baSBram Moolenaar" Test to make sure 'x' can delete control characters
326079119baSBram Moolenaarfunc Test_ve_del_ctrl_chars()
327079119baSBram Moolenaar  new
328079119baSBram Moolenaar  set virtualedit=all
329079119baSBram Moolenaar  call append(0, "a\<C-V>b\<CR>sd")
330079119baSBram Moolenaar  set display=uhex
331079119baSBram Moolenaar  normal gg^xxxxxxi[text]
332079119baSBram Moolenaar  set display=
333079119baSBram Moolenaar  call assert_equal('[text]', getline(1))
334079119baSBram Moolenaar  bwipe!
335079119baSBram Moolenaar  set virtualedit=
336079119baSBram Moolenaarendfunc
337079119baSBram Moolenaar
338079119baSBram Moolenaar" Test for ^Y/^E due to bad w_virtcol value, reported by
339079119baSBram Moolenaar" Roy <[email protected]>.
340079119baSBram Moolenaarfunc Test_ins_copy_char()
341079119baSBram Moolenaar  new
342079119baSBram Moolenaar  set virtualedit=all
343079119baSBram Moolenaar  call append(0, 'abcv8efi.him2kl')
344079119baSBram Moolenaar  exe "normal gg^O\<Esc>3li\<C-E>\<Esc>4li\<C-E>\<Esc>4li\<C-E>   <--"
345079119baSBram Moolenaar  exe "normal j^o\<Esc>4li\<C-Y>\<Esc>4li\<C-Y>\<Esc>4li\<C-Y>   <--"
346079119baSBram Moolenaar  call assert_equal('   v   i   m   <--', getline(1))
347079119baSBram Moolenaar  call assert_equal('    8   .   2   <--', getline(3))
348079119baSBram Moolenaar  bwipe!
349079119baSBram Moolenaar  set virtualedit=
350079119baSBram Moolenaarendfunc
351079119baSBram Moolenaar
352079119baSBram Moolenaar" Test for yanking and pasting using the small delete register
353079119baSBram Moolenaarfunc Test_yank_paste_small_del_reg()
354079119baSBram Moolenaar  new
355079119baSBram Moolenaar  set virtualedit=all
356079119baSBram Moolenaar  call append(0, "foo, bar")
357079119baSBram Moolenaar  normal ggdewve"-p
358079119baSBram Moolenaar  call assert_equal(', foo', getline(1))
359079119baSBram Moolenaar  bwipe!
360079119baSBram Moolenaar  set virtualedit=
361079119baSBram Moolenaarendfunc
362079119baSBram Moolenaar
363004a6781SBram Moolenaar" Test for delete that breaks a tab into spaces
364004a6781SBram Moolenaarfunc Test_delete_break_tab()
365004a6781SBram Moolenaar  new
366004a6781SBram Moolenaar  call setline(1, "one\ttwo")
367004a6781SBram Moolenaar  set virtualedit=all
368004a6781SBram Moolenaar  normal v3ld
369004a6781SBram Moolenaar  call assert_equal('    two', getline(1))
370004a6781SBram Moolenaar  set virtualedit&
371004a6781SBram Moolenaar  close!
372004a6781SBram Moolenaarendfunc
373004a6781SBram Moolenaar
374845e0ee5SBram Moolenaar" Test for using <BS>, <C-W> and <C-U> in virtual edit mode
375845e0ee5SBram Moolenaar" to erase character, word and line.
376845e0ee5SBram Moolenaarfunc Test_ve_backspace()
377845e0ee5SBram Moolenaar  new
378845e0ee5SBram Moolenaar  call setline(1, 'sample')
379845e0ee5SBram Moolenaar  set virtualedit=all
380845e0ee5SBram Moolenaar  set backspace=indent,eol,start
381845e0ee5SBram Moolenaar  exe "normal 15|i\<BS>\<BS>"
382845e0ee5SBram Moolenaar  call assert_equal([0, 1, 7, 5], getpos('.'))
383845e0ee5SBram Moolenaar  exe "normal 15|i\<C-W>"
384845e0ee5SBram Moolenaar  call assert_equal([0, 1, 6, 0], getpos('.'))
385845e0ee5SBram Moolenaar  exe "normal 15|i\<C-U>"
386845e0ee5SBram Moolenaar  call assert_equal([0, 1, 1, 0], getpos('.'))
387845e0ee5SBram Moolenaar  set backspace&
388845e0ee5SBram Moolenaar  set virtualedit&
389845e0ee5SBram Moolenaar  close!
390845e0ee5SBram Moolenaarendfunc
391845e0ee5SBram Moolenaar
3923e72dcadSBram Moolenaar" Test for delete (x) on EOL character and after EOL
3933e72dcadSBram Moolenaarfunc Test_delete_past_eol()
3943e72dcadSBram Moolenaar  new
3953e72dcadSBram Moolenaar  call setline(1, "ab")
3963e72dcadSBram Moolenaar  set virtualedit=all
3973e72dcadSBram Moolenaar  exe "normal 2lx"
3983e72dcadSBram Moolenaar  call assert_equal('ab', getline(1))
3993e72dcadSBram Moolenaar  exe "normal 10lx"
4003e72dcadSBram Moolenaar  call assert_equal('ab', getline(1))
4013e72dcadSBram Moolenaar  set virtualedit&
4023e72dcadSBram Moolenaar  bw!
4033e72dcadSBram Moolenaarendfunc
4043e72dcadSBram Moolenaar
40553ba05b0SGary Johnson" After calling s:TryVirtualeditReplace(), line 1 will contain one of these
40653ba05b0SGary Johnson" two strings, depending on whether virtual editing is on or off.
40753ba05b0SGary Johnsonlet s:result_ve_on  = 'a      x'
40853ba05b0SGary Johnsonlet s:result_ve_off = 'x'
40953ba05b0SGary Johnson
410*51ad850fSGary Johnson" Utility function for Test_global_local_virtualedit()
41153ba05b0SGary Johnsonfunc s:TryVirtualeditReplace()
41253ba05b0SGary Johnson  call setline(1, 'a')
41353ba05b0SGary Johnson  normal gg7l
41453ba05b0SGary Johnson  normal rx
41553ba05b0SGary Johnsonendfunc
41653ba05b0SGary Johnson
41753ba05b0SGary Johnson" Test for :set and :setlocal
418*51ad850fSGary Johnsonfunc Test_global_local_virtualedit()
41953ba05b0SGary Johnson  new
42053ba05b0SGary Johnson
42153ba05b0SGary Johnson  " Verify that 'virtualedit' is initialized to empty, can be set globally to
42253ba05b0SGary Johnson  " all and to empty, and can be set locally to all and to empty.
42353ba05b0SGary Johnson  call s:TryVirtualeditReplace()
42453ba05b0SGary Johnson  call assert_equal(s:result_ve_off, getline(1))
42553ba05b0SGary Johnson  set ve=all
42653ba05b0SGary Johnson  call s:TryVirtualeditReplace()
42753ba05b0SGary Johnson  call assert_equal(s:result_ve_on, getline(1))
42853ba05b0SGary Johnson  set ve=
42953ba05b0SGary Johnson  call s:TryVirtualeditReplace()
43053ba05b0SGary Johnson  call assert_equal(s:result_ve_off, getline(1))
43153ba05b0SGary Johnson  setlocal ve=all
43253ba05b0SGary Johnson  call s:TryVirtualeditReplace()
43353ba05b0SGary Johnson  call assert_equal(s:result_ve_on, getline(1))
43453ba05b0SGary Johnson  setlocal ve=
43553ba05b0SGary Johnson  call s:TryVirtualeditReplace()
43653ba05b0SGary Johnson  call assert_equal(s:result_ve_off, getline(1))
43753ba05b0SGary Johnson
438*51ad850fSGary Johnson  " Verify that :set affects multiple windows.
439*51ad850fSGary Johnson  split
44053ba05b0SGary Johnson  set ve=all
44153ba05b0SGary Johnson  call s:TryVirtualeditReplace()
44253ba05b0SGary Johnson  call assert_equal(s:result_ve_on, getline(1))
44353ba05b0SGary Johnson  wincmd p
44453ba05b0SGary Johnson  call s:TryVirtualeditReplace()
44553ba05b0SGary Johnson  call assert_equal(s:result_ve_on, getline(1))
44653ba05b0SGary Johnson  set ve=
44753ba05b0SGary Johnson  wincmd p
44853ba05b0SGary Johnson  call s:TryVirtualeditReplace()
44953ba05b0SGary Johnson  call assert_equal(s:result_ve_off, getline(1))
45053ba05b0SGary Johnson  bwipe!
45153ba05b0SGary Johnson
452*51ad850fSGary Johnson  " Verify that :setlocal affects only the current window.
45353ba05b0SGary Johnson  new
454*51ad850fSGary Johnson  split
45553ba05b0SGary Johnson  setlocal ve=all
45653ba05b0SGary Johnson  call s:TryVirtualeditReplace()
45753ba05b0SGary Johnson  call assert_equal(s:result_ve_on, getline(1))
458*51ad850fSGary Johnson  wincmd p
459*51ad850fSGary Johnson  call s:TryVirtualeditReplace()
460*51ad850fSGary Johnson  call assert_equal(s:result_ve_off, getline(1))
46153ba05b0SGary Johnson  bwipe!
46253ba05b0SGary Johnson  call s:TryVirtualeditReplace()
46353ba05b0SGary Johnson  call assert_equal(s:result_ve_off, getline(1))
46453ba05b0SGary Johnson
46553ba05b0SGary Johnson  " Verify that the buffer 'virtualedit' state follows the global value only
46653ba05b0SGary Johnson  " when empty and that "none" works as expected.
46753ba05b0SGary Johnson  "
46853ba05b0SGary Johnson  "          'virtualedit' State
46953ba05b0SGary Johnson  " +--------+--------------------------+
47053ba05b0SGary Johnson  " | Local  |          Global          |
47153ba05b0SGary Johnson  " |        |                          |
47253ba05b0SGary Johnson  " +--------+--------+--------+--------+
47353ba05b0SGary Johnson  " |        | ""     | "all"  | "none" |
47453ba05b0SGary Johnson  " +--------+--------+--------+--------+
47553ba05b0SGary Johnson  " | ""     |  off   |  on    |  off   |
47653ba05b0SGary Johnson  " | "all"  |  on    |  on    |  on    |
47753ba05b0SGary Johnson  " | "none" |  off   |  off   |  off   |
47853ba05b0SGary Johnson  " +--------+--------+--------+--------+
47953ba05b0SGary Johnson  new
48053ba05b0SGary Johnson
48153ba05b0SGary Johnson  setglobal ve=
48253ba05b0SGary Johnson  setlocal ve=
48353ba05b0SGary Johnson  call s:TryVirtualeditReplace()
48453ba05b0SGary Johnson  call assert_equal(s:result_ve_off, getline(1))
48553ba05b0SGary Johnson  setlocal ve=all
48653ba05b0SGary Johnson  call s:TryVirtualeditReplace()
48753ba05b0SGary Johnson  call assert_equal(s:result_ve_on, getline(1))
48853ba05b0SGary Johnson  setlocal ve=none
48953ba05b0SGary Johnson  call s:TryVirtualeditReplace()
49053ba05b0SGary Johnson  call assert_equal(s:result_ve_off, getline(1))
49153ba05b0SGary Johnson
49253ba05b0SGary Johnson  setglobal ve=all
49353ba05b0SGary Johnson  setlocal ve=
49453ba05b0SGary Johnson  call s:TryVirtualeditReplace()
49553ba05b0SGary Johnson  call assert_equal(s:result_ve_on, getline(1))
49653ba05b0SGary Johnson  setlocal ve=all
49753ba05b0SGary Johnson  call s:TryVirtualeditReplace()
49853ba05b0SGary Johnson  call assert_equal(s:result_ve_on, getline(1))
49953ba05b0SGary Johnson  setlocal ve=none
50053ba05b0SGary Johnson  call s:TryVirtualeditReplace()
50153ba05b0SGary Johnson  call assert_equal(s:result_ve_off, getline(1))
50253ba05b0SGary Johnson  setlocal ve=NONE
50353ba05b0SGary Johnson  call s:TryVirtualeditReplace()
50453ba05b0SGary Johnson  call assert_equal(s:result_ve_off, getline(1))
50553ba05b0SGary Johnson
50653ba05b0SGary Johnson  setglobal ve=none
50753ba05b0SGary Johnson  setlocal ve=
50853ba05b0SGary Johnson  call s:TryVirtualeditReplace()
50953ba05b0SGary Johnson  call assert_equal(s:result_ve_off, getline(1))
51053ba05b0SGary Johnson  setlocal ve=all
51153ba05b0SGary Johnson  call s:TryVirtualeditReplace()
51253ba05b0SGary Johnson  call assert_equal(s:result_ve_on, getline(1))
51353ba05b0SGary Johnson  setlocal ve=none
51453ba05b0SGary Johnson  call s:TryVirtualeditReplace()
51553ba05b0SGary Johnson  call assert_equal(s:result_ve_off, getline(1))
51653ba05b0SGary Johnson
51753ba05b0SGary Johnson  bwipe!
51853ba05b0SGary Johnson
519*51ad850fSGary Johnson  " Verify that the 'virtualedit' state is copied to new windows.
520*51ad850fSGary Johnson  new
521*51ad850fSGary Johnson  call s:TryVirtualeditReplace()
522*51ad850fSGary Johnson  call assert_equal(s:result_ve_off, getline(1))
523*51ad850fSGary Johnson  split
524*51ad850fSGary Johnson  setlocal ve=all
525*51ad850fSGary Johnson  call s:TryVirtualeditReplace()
526*51ad850fSGary Johnson  call assert_equal(s:result_ve_on, getline(1))
527*51ad850fSGary Johnson  split
528*51ad850fSGary Johnson  call s:TryVirtualeditReplace()
529*51ad850fSGary Johnson  call assert_equal(s:result_ve_on, getline(1))
530*51ad850fSGary Johnson  setlocal ve=
531*51ad850fSGary Johnson  split
532*51ad850fSGary Johnson  call s:TryVirtualeditReplace()
533*51ad850fSGary Johnson  call assert_equal(s:result_ve_off, getline(1))
534*51ad850fSGary Johnson  bwipe!
535*51ad850fSGary Johnson
53653ba05b0SGary Johnson  setlocal virtualedit&
53753ba05b0SGary Johnson  set virtualedit&
53853ba05b0SGary Johnsonendfunc
53953ba05b0SGary Johnson
54054c8d229SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
541