blob: 25ca33f8ebc46e66cb40a4450441f3a02b64c55c [file] [log] [blame]
Bram Moolenaar9aa15692017-08-19 15:05:32 +02001" Tests for 'virtualedit'.
2
3func Test_yank_move_change()
Bram Moolenaard41babe2017-08-30 17:01:35 +02004 new
Bram Moolenaar9aa15692017-08-19 15:05:32 +02005 call setline(1, [
6 \ "func foo() error {",
7 \ "\tif n, err := bar();",
8 \ "\terr != nil {",
9 \ "\t\treturn err",
10 \ "\t}",
11 \ "\tn = n * n",
12 \ ])
13 set virtualedit=all
14 set ts=4
15 function! MoveSelectionDown(count) abort
16 normal! m`
17 silent! exe "'<,'>move'>+".a:count
18 norm! ``
19 endfunction
20
21 xmap ]e :<C-U>call MoveSelectionDown(v:count1)<CR>
22 2
23 normal 2gg
24 normal J
25 normal jVj
26 normal ]e
27 normal ce
28 bwipe!
29 set virtualedit=
30 set ts=8
31endfunc
Bram Moolenaard41babe2017-08-30 17:01:35 +020032
33func Test_paste_end_of_line()
34 new
35 set virtualedit=all
36 call setline(1, ['456', '123'])
37 normal! gg0"ay$
38 exe "normal! 2G$lllA\<C-O>:normal! \"agP\r"
39 call assert_equal('123456', getline(2))
40
41 bwipe!
42 set virtualedit=
43endfunc
Bram Moolenaardb0eede2018-04-25 22:38:17 +020044
Bram Moolenaar630afe82018-06-28 19:26:28 +020045func Test_replace_end_of_line()
46 new
47 set virtualedit=all
48 call setline(1, range(20))
49 exe "normal! gg2jv10lr-"
50 call assert_equal(["1", "-----------", "3"], getline(2,4))
Bram Moolenaar30276f22019-01-24 17:59:39 +010051 call setline(1, range(20))
52 exe "normal! gg2jv10lr\<c-k>hh"
53 call assert_equal(["1", "───────────", "3"], getline(2,4))
Bram Moolenaar630afe82018-06-28 19:26:28 +020054
55 bwipe!
56 set virtualedit=
57endfunc
58
Bram Moolenaardb0eede2018-04-25 22:38:17 +020059func Test_edit_CTRL_G()
60 new
61 set virtualedit=insert
62 call setline(1, ['123', '1', '12'])
63 exe "normal! ggA\<c-g>jx\<c-g>jx"
64 call assert_equal(['123', '1 x', '12 x'], getline(1,'$'))
65
66 set virtualedit=all
67 %d_
68 call setline(1, ['1', '12'])
69 exe "normal! ggllix\<c-g>jx"
70 call assert_equal(['1 x', '12x'], getline(1,'$'))
71
72
73 bwipe!
74 set virtualedit=
75endfunc
Bram Moolenaar77ccc002019-10-31 03:21:25 +010076
77func Test_edit_change()
78 new
79 set virtualedit=all
80 call setline(1, "\t⒌")
81 normal Cx
82 call assert_equal('x', getline(1))
83 bwipe!
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +010084 set virtualedit=
85endfunc
86
Bram Moolenaar54c8d222019-12-02 20:41:39 +010087" Tests for pasting at the beginning, end and middle of a tab character
88" in virtual edit mode.
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +010089func Test_paste_in_tab()
90 new
Bram Moolenaar54c8d222019-12-02 20:41:39 +010091 call append(0, '')
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +010092 set virtualedit=all
Bram Moolenaar54c8d222019-12-02 20:41:39 +010093
94 " Tests for pasting a register with characterwise mode type
95 call setreg('"', 'xyz', 'c')
96
97 " paste (p) unnamed register at the beginning of a tab
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +010098 call setline(1, "a\tb")
Bram Moolenaar54c8d222019-12-02 20:41:39 +010099 call cursor(1, 2, 0)
100 normal p
101 call assert_equal('a xyz b', getline(1))
102
103 " paste (P) unnamed register at the beginning of a tab
104 call setline(1, "a\tb")
105 call cursor(1, 2, 0)
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +0100106 normal P
107 call assert_equal("axyz\tb", getline(1))
108
Bram Moolenaar54c8d222019-12-02 20:41:39 +0100109 " paste (p) unnamed register at the end of a tab
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +0100110 call setline(1, "a\tb")
111 call cursor(1, 2, 6)
112 normal p
113 call assert_equal("a\txyzb", getline(1))
Bram Moolenaar54c8d222019-12-02 20:41:39 +0100114
115 " paste (P) unnamed register at the end of a tab
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +0100116 call setline(1, "a\tb")
117 call cursor(1, 2, 6)
118 normal P
Bram Moolenaar54c8d222019-12-02 20:41:39 +0100119 call assert_equal('a xyz b', getline(1))
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +0100120
Bram Moolenaar54c8d222019-12-02 20:41:39 +0100121 " Tests for pasting a register with blockwise mode type
122 call setreg('"', 'xyz', 'b')
123
124 " paste (p) unnamed register at the beginning of a tab
125 call setline(1, "a\tb")
126 call cursor(1, 2, 0)
127 normal p
128 call assert_equal('a xyz b', getline(1))
129
130 " paste (P) unnamed register at the beginning of a tab
131 call setline(1, "a\tb")
132 call cursor(1, 2, 0)
133 normal P
134 call assert_equal("axyz\tb", getline(1))
135
136 " paste (p) unnamed register at the end of a tab
137 call setline(1, "a\tb")
138 call cursor(1, 2, 6)
139 normal p
140 call assert_equal("a\txyzb", getline(1))
141
142 " paste (P) unnamed register at the end of a tab
143 call setline(1, "a\tb")
144 call cursor(1, 2, 6)
145 normal P
146 call assert_equal('a xyz b', getline(1))
147
148 " Tests for pasting with gp and gP in virtual edit mode
149
150 " paste (gp) unnamed register at the beginning of a tab
151 call setline(1, "a\tb")
152 call cursor(1, 2, 0)
153 normal gp
154 call assert_equal('a xyz b', getline(1))
155 call assert_equal([0, 1, 12, 0, 12], getcurpos())
156
157 " paste (gP) unnamed register at the beginning of a tab
158 call setline(1, "a\tb")
159 call cursor(1, 2, 0)
160 normal gP
161 call assert_equal("axyz\tb", getline(1))
162 call assert_equal([0, 1, 5, 0, 5], getcurpos())
163
164 " paste (gp) unnamed register at the end of a tab
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +0100165 call setline(1, "a\tb")
166 call cursor(1, 2, 6)
167 normal gp
168 call assert_equal("a\txyzb", getline(1))
169 call assert_equal([0, 1, 6, 0, 12], getcurpos())
Bram Moolenaar54c8d222019-12-02 20:41:39 +0100170
171 " paste (gP) unnamed register at the end of a tab
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +0100172 call setline(1, "a\tb")
173 call cursor(1, 2, 6)
174 normal gP
Bram Moolenaar54c8d222019-12-02 20:41:39 +0100175 call assert_equal('a xyz b', getline(1))
176 call assert_equal([0, 1, 12, 0, 12], getcurpos())
177
178 " Tests for pasting a named register
179 let @r = 'xyz'
180
181 " paste (gp) named register in the middle of a tab
182 call setline(1, "a\tb")
183 call cursor(1, 2, 2)
184 normal "rgp
185 call assert_equal('a xyz b', getline(1))
186 call assert_equal([0, 1, 8, 0, 8], getcurpos())
187
188 " paste (gP) named register in the middle of a tab
189 call setline(1, "a\tb")
190 call cursor(1, 2, 2)
191 normal "rgP
192 call assert_equal('a xyz b', getline(1))
193 call assert_equal([0, 1, 7, 0, 7], getcurpos())
Bram Moolenaar6f1f0ca2019-12-01 18:16:18 +0100194
195 bwipe!
196 set virtualedit=
Bram Moolenaar77ccc002019-10-31 03:21:25 +0100197endfunc
Bram Moolenaar54c8d222019-12-02 20:41:39 +0100198
199" Test for yanking a few spaces within a tab to a register
200func Test_yank_in_tab()
201 new
202 let @r = ''
203 call setline(1, "a\tb")
204 set virtualedit=all
205 call cursor(1, 2, 2)
206 normal "ry5l
207 call assert_equal(' ', @r)
208
209 bwipe!
210 set virtualedit=
211endfunc
212
Bram Moolenaar079119b2019-12-03 22:59:23 +0100213" Insert "keyword keyw", ESC, C CTRL-N, shows "keyword ykeyword".
214" Repeating CTRL-N fixes it. (Mary Ellen Foster)
215func Test_ve_completion()
216 new
217 set completeopt&vim
218 set virtualedit=all
219 exe "normal ikeyword keyw\<Esc>C\<C-N>"
220 call assert_equal('keyword keyword', getline(1))
221 bwipe!
222 set virtualedit=
223endfunc
224
225" Using "C" then then <CR> moves the last remaining character to the next
226" line. (Mary Ellen Foster)
227func Test_ve_del_to_eol()
228 new
229 set virtualedit=all
230 call append(0, 'all your base are belong to us')
231 call search('are', 'w')
232 exe "normal C\<CR>are belong to vim"
233 call assert_equal(['all your base ', 'are belong to vim'], getline(1, 2))
234 bwipe!
235 set virtualedit=
236endfunc
237
238" When past the end of a line that ends in a single character "b" skips
239" that word.
240func Test_ve_b_past_eol()
241 new
242 set virtualedit=all
243 call append(0, '1 2 3 4 5 6')
244 normal gg^$15lbC7
245 call assert_equal('1 2 3 4 5 7', getline(1))
246 bwipe!
247 set virtualedit=
248endfunc
249
250" Make sure 'i', 'C', 'a', 'A' and 'D' works
251func Test_ve_ins_del()
252 new
253 set virtualedit=all
254 call append(0, ["'i'", "'C'", "'a'", "'A'", "'D'"])
255 call cursor(1, 1)
256 normal $4lix
257 call assert_equal("'i' x", getline(1))
258 call cursor(2, 1)
259 normal $4lCx
260 call assert_equal("'C' x", getline(2))
261 call cursor(3, 1)
262 normal $4lax
263 call assert_equal("'a' x", getline(3))
264 call cursor(4, 1)
265 normal $4lAx
266 call assert_equal("'A'x", getline(4))
267 call cursor(5, 1)
268 normal $4lDix
269 call assert_equal("'D' x", getline(5))
270 bwipe!
271 set virtualedit=
272endfunc
273
274" Test for yank bug reported by Mark Waggoner.
275func Test_yank_block()
276 new
277 set virtualedit=block
278 call append(0, repeat(['this is a test'], 3))
279 exe "normal gg^2w\<C-V>3jy"
280 call assert_equal("a\na\na\n ", @")
281 bwipe!
282 set virtualedit=
283endfunc
284
285" Test "r" beyond the end of the line
286func Test_replace_after_eol()
287 new
288 set virtualedit=all
289 call append(0, '"r"')
290 normal gg$5lrxa
291 call assert_equal('"r" x', getline(1))
292 bwipe!
293 set virtualedit=
294endfunc
295
296" Test "r" on a tab
297" Note that for this test, 'ts' must be 8 (the default).
298func Test_replace_on_tab()
299 new
300 set virtualedit=all
301 call append(0, "'r'\t")
302 normal gg^5lrxAy
303 call assert_equal("'r' x y", getline(1))
304 bwipe!
305 set virtualedit=
306endfunc
307
308" Test to make sure 'x' can delete control characters
309func Test_ve_del_ctrl_chars()
310 new
311 set virtualedit=all
312 call append(0, "a\<C-V>b\<CR>sd")
313 set display=uhex
314 normal gg^xxxxxxi[text]
315 set display=
316 call assert_equal('[text]', getline(1))
317 bwipe!
318 set virtualedit=
319endfunc
320
321" Test for ^Y/^E due to bad w_virtcol value, reported by
322" Roy <royl@netropolis.net>.
323func Test_ins_copy_char()
324 new
325 set virtualedit=all
326 call append(0, 'abcv8efi.him2kl')
327 exe "normal gg^O\<Esc>3li\<C-E>\<Esc>4li\<C-E>\<Esc>4li\<C-E> <--"
328 exe "normal j^o\<Esc>4li\<C-Y>\<Esc>4li\<C-Y>\<Esc>4li\<C-Y> <--"
329 call assert_equal(' v i m <--', getline(1))
330 call assert_equal(' 8 . 2 <--', getline(3))
331 bwipe!
332 set virtualedit=
333endfunc
334
335" Test for yanking and pasting using the small delete register
336func Test_yank_paste_small_del_reg()
337 new
338 set virtualedit=all
339 call append(0, "foo, bar")
340 normal ggdewve"-p
341 call assert_equal(', foo', getline(1))
342 bwipe!
343 set virtualedit=
344endfunc
345
Bram Moolenaar54c8d222019-12-02 20:41:39 +0100346" vim: shiftwidth=2 sts=2 expandtab