blob: 0518b91d06ea67e7b555edf622772fe335b776c4 [file] [log] [blame]
Bram Moolenaarb20e3342016-01-18 23:29:01 +01001" Test for reading and writing .viminfo
2
Bram Moolenaar6bd1d772019-10-09 22:01:25 +02003source check.vim
Bram Moolenaar8e6be342020-11-23 22:01:26 +01004source term_util.vim
5source shared.vim
Bram Moolenaar6bd1d772019-10-09 22:01:25 +02006
Yegappan Lakshmanan41a7f822021-06-16 15:53:17 +02007func Test_viminfo_read_and_write()
Bram Moolenaar26b654a2019-07-22 20:50:17 +02008 " First clear 'history', so that "hislen" is zero. Then set it again,
9 " simulating Vim starting up.
10 set history=0
11 wviminfo Xviminfo
12 set history=1000
13
Bram Moolenaar45d2eea2016-06-06 21:07:52 +020014 call histdel(':')
Yegappan Lakshmanan41a7f822021-06-16 15:53:17 +020015 let @/=''
Bram Moolenaarb20e3342016-01-18 23:29:01 +010016 let lines = [
17 \ '# comment line',
18 \ '*encoding=utf-8',
19 \ '~MSle0~/asdf',
20 \ '|copied as-is',
21 \ '|and one more',
22 \ ]
23 call writefile(lines, 'Xviminfo')
24 rviminfo Xviminfo
25 call assert_equal('asdf', @/)
26
27 wviminfo Xviminfo
28 let lines = readfile('Xviminfo')
29 let done = 0
30 for line in lines
Bram Moolenaar156919f2016-10-15 20:46:20 +020031 if line[0] == '|' && line !~ '^|[234],' && line !~ '^|<'
Bram Moolenaarb20e3342016-01-18 23:29:01 +010032 if done == 0
Bram Moolenaar2d358992016-06-12 21:20:54 +020033 call assert_equal('|1,4', line)
Bram Moolenaarb20e3342016-01-18 23:29:01 +010034 elseif done == 1
Bram Moolenaar45d2eea2016-06-06 21:07:52 +020035 call assert_equal('|copied as-is', line)
36 elseif done == 2
Bram Moolenaarb20e3342016-01-18 23:29:01 +010037 call assert_equal('|and one more', line)
38 endif
39 let done += 1
40 endif
41 endfor
Bram Moolenaar45d2eea2016-06-06 21:07:52 +020042 call assert_equal(3, done)
Bram Moolenaarb20e3342016-01-18 23:29:01 +010043
44 call delete('Xviminfo')
45endfunc
46
47func Test_global_vars()
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +020048 let g:MY_GLOBAL_STRING = "Vim Editor"
49 let g:MY_GLOBAL_NUM = 345
50 let g:MY_GLOBAL_FLOAT = 3.14
Bram Moolenaarb20e3342016-01-18 23:29:01 +010051 let test_dict = {'foo': 1, 'bar': 0, 'longvarible': 1000}
52 let g:MY_GLOBAL_DICT = test_dict
53 " store a really long list, so line wrapping will occur in viminfo file
54 let test_list = range(1,100)
55 let g:MY_GLOBAL_LIST = test_list
Bram Moolenaar8c8b8bb2019-01-13 17:48:04 +010056 let test_blob = 0z00112233445566778899aabbccddeeff
57 let g:MY_GLOBAL_BLOB = test_blob
58 let test_false = v:false
59 let g:MY_GLOBAL_FALSE = test_false
60 let test_true = v:true
61 let g:MY_GLOBAL_TRUE = test_true
62 let test_null = v:null
63 let g:MY_GLOBAL_NULL = test_null
64 let test_none = v:none
65 let g:MY_GLOBAL_NONE = test_none
66
Bram Moolenaare9c07272016-03-30 20:50:46 +020067 set viminfo='100,<50,s10,h,!,nviminfo
Bram Moolenaarb20e3342016-01-18 23:29:01 +010068 wv! Xviminfo
Bram Moolenaar8c8b8bb2019-01-13 17:48:04 +010069
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +020070 unlet g:MY_GLOBAL_STRING
71 unlet g:MY_GLOBAL_NUM
72 unlet g:MY_GLOBAL_FLOAT
Bram Moolenaarb20e3342016-01-18 23:29:01 +010073 unlet g:MY_GLOBAL_DICT
74 unlet g:MY_GLOBAL_LIST
Bram Moolenaar8c8b8bb2019-01-13 17:48:04 +010075 unlet g:MY_GLOBAL_BLOB
76 unlet g:MY_GLOBAL_FALSE
77 unlet g:MY_GLOBAL_TRUE
78 unlet g:MY_GLOBAL_NULL
79 unlet g:MY_GLOBAL_NONE
Bram Moolenaarb20e3342016-01-18 23:29:01 +010080
81 rv! Xviminfo
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +020082 call assert_equal("Vim Editor", g:MY_GLOBAL_STRING)
83 call assert_equal(345, g:MY_GLOBAL_NUM)
84 call assert_equal(3.14, g:MY_GLOBAL_FLOAT)
Bram Moolenaarb20e3342016-01-18 23:29:01 +010085 call assert_equal(test_dict, g:MY_GLOBAL_DICT)
86 call assert_equal(test_list, g:MY_GLOBAL_LIST)
Bram Moolenaar8c8b8bb2019-01-13 17:48:04 +010087 call assert_equal(test_blob, g:MY_GLOBAL_BLOB)
88 call assert_equal(test_false, g:MY_GLOBAL_FALSE)
89 call assert_equal(test_true, g:MY_GLOBAL_TRUE)
90 call assert_equal(test_null, g:MY_GLOBAL_NULL)
91 call assert_equal(test_none, g:MY_GLOBAL_NONE)
Bram Moolenaarb20e3342016-01-18 23:29:01 +010092
Yegappan Lakshmanan41a7f822021-06-16 15:53:17 +020093 " When reading global variables from viminfo, if a variable cannot be
94 " modified, then the value should not be changed.
95 unlet g:MY_GLOBAL_STRING
96 unlet g:MY_GLOBAL_NUM
97 unlet g:MY_GLOBAL_FLOAT
98 unlet g:MY_GLOBAL_DICT
99 unlet g:MY_GLOBAL_LIST
100 unlet g:MY_GLOBAL_BLOB
101
102 const g:MY_GLOBAL_STRING = 'New Value'
103 const g:MY_GLOBAL_NUM = 987
104 const g:MY_GLOBAL_FLOAT = 1.16
105 const g:MY_GLOBAL_DICT = {'editor': 'vim'}
106 const g:MY_GLOBAL_LIST = [5, 7, 13]
107 const g:MY_GLOBAL_BLOB = 0zDEADBEEF
108 call assert_fails('rv! Xviminfo', 'E741:')
109 call assert_equal('New Value', g:MY_GLOBAL_STRING)
110 call assert_equal(987, g:MY_GLOBAL_NUM)
111 call assert_equal(1.16, g:MY_GLOBAL_FLOAT)
112 call assert_equal({'editor': 'vim'}, g:MY_GLOBAL_DICT)
113 call assert_equal([5, 7 , 13], g:MY_GLOBAL_LIST)
114 call assert_equal(0zDEADBEEF, g:MY_GLOBAL_BLOB)
115
116 unlet g:MY_GLOBAL_STRING
117 unlet g:MY_GLOBAL_NUM
118 unlet g:MY_GLOBAL_FLOAT
119 unlet g:MY_GLOBAL_DICT
120 unlet g:MY_GLOBAL_LIST
121 unlet g:MY_GLOBAL_BLOB
122
Bram Moolenaar845e0ee2020-06-20 16:05:32 +0200123 " Test for invalid values for a blob, list, dict in a viminfo file
124 call writefile([
125 \ "!GLOB_BLOB_1\tBLO\t123",
126 \ "!GLOB_BLOB_2\tBLO\t012",
127 \ "!GLOB_BLOB_3\tBLO\t0z1x",
128 \ "!GLOB_BLOB_4\tBLO\t0z12 ab",
129 \ "!GLOB_LIST_1\tLIS\t1 2",
130 \ "!GLOB_DICT_1\tDIC\t1 2"], 'Xviminfo')
Bram Moolenaarfae55a92021-06-17 22:08:30 +0200131 call assert_fails('rv! Xviminfo', 'E488:')
Bram Moolenaar845e0ee2020-06-20 16:05:32 +0200132 call assert_equal('123', g:GLOB_BLOB_1)
133 call assert_equal(1, type(g:GLOB_BLOB_1))
134 call assert_equal('012', g:GLOB_BLOB_2)
135 call assert_equal(1, type(g:GLOB_BLOB_2))
136 call assert_equal('0z1x', g:GLOB_BLOB_3)
137 call assert_equal(1, type(g:GLOB_BLOB_3))
138 call assert_equal('0z12 ab', g:GLOB_BLOB_4)
139 call assert_equal(1, type(g:GLOB_BLOB_4))
140 call assert_equal('1 2', g:GLOB_LIST_1)
141 call assert_equal(1, type(g:GLOB_LIST_1))
142 call assert_equal('1 2', g:GLOB_DICT_1)
143 call assert_equal(1, type(g:GLOB_DICT_1))
144
Bram Moolenaarb20e3342016-01-18 23:29:01 +0100145 call delete('Xviminfo')
146 set viminfo-=!
147endfunc
Bram Moolenaar45d2eea2016-06-06 21:07:52 +0200148
Bram Moolenaar5b157fe2020-06-07 16:08:08 +0200149func Test_global_vars_with_circular_reference()
150 let g:MY_GLOBAL_LIST = []
151 call add(g:MY_GLOBAL_LIST, g:MY_GLOBAL_LIST)
152 let g:MY_GLOBAL_DICT = {}
153 let g:MY_GLOBAL_DICT['self'] = g:MY_GLOBAL_DICT
154
155 set viminfo='100,<50,s10,h,!,nviminfo
156 wv! Xviminfo
157 call assert_equal(v:errmsg, '')
158
159 unlet g:MY_GLOBAL_LIST
160 unlet g:MY_GLOBAL_DICT
161
162 rv! Xviminfo
163 call assert_equal(v:errmsg, '')
164 call assert_true(!exists('g:MY_GLOBAL_LIST'))
165 call assert_true(!exists('g:MY_GLOBAL_DICT'))
166
167 call delete('Xviminfo')
168 set viminfo-=!
169endfunc
170
Bram Moolenaar45d2eea2016-06-06 21:07:52 +0200171func Test_cmdline_history()
172 call histdel(':')
173 call test_settime(11)
174 call histadd(':', "echo 'one'")
175 call test_settime(12)
176 " split into two lines
177 let long800 = repeat(" 'eight'", 100)
178 call histadd(':', "echo " . long800)
179 call test_settime(13)
180 " split into three lines
181 let long1400 = repeat(" 'fourteeeeen'", 100)
182 call histadd(':', "echo " . long1400)
183 wviminfo Xviminfo
184 let lines = readfile('Xviminfo')
185 let done_colon = 0
186 let done_bar = 0
187 let lnum = 0
188 while lnum < len(lines)
189 let line = lines[lnum] | let lnum += 1
190 if line[0] == ':'
191 if done_colon == 0
192 call assert_equal(":\x161408", line)
193 let line = lines[lnum] | let lnum += 1
194 call assert_equal('<echo ' . long1400, line)
195 elseif done_colon == 1
196 call assert_equal(":\x16808", line)
197 let line = lines[lnum] | let lnum += 1
198 call assert_equal("<echo " . long800, line)
199 elseif done_colon == 2
200 call assert_equal(":echo 'one'", line)
201 endif
202 let done_colon += 1
203 elseif line[0:4] == '|2,0,'
204 if done_bar == 0
205 call assert_equal("|2,0,13,,>1407", line)
206 let line = lines[lnum] | let lnum += 1
207 call assert_equal('|<"echo ' . long1400[0:484], line)
208 let line = lines[lnum] | let lnum += 1
209 call assert_equal('|<' . long1400[485:974], line)
210 let line = lines[lnum] | let lnum += 1
211 call assert_equal('|<' . long1400[975:] . '"', line)
212 elseif done_bar == 1
213 call assert_equal('|2,0,12,,>807', line)
214 let line = lines[lnum] | let lnum += 1
215 call assert_equal('|<"echo ' . long800[0:484], line)
216 let line = lines[lnum] | let lnum += 1
217 call assert_equal('|<' . long800[485:] . '"', line)
218 elseif done_bar == 2
219 call assert_equal("|2,0,11,,\"echo 'one'\"", line)
220 endif
221 let done_bar += 1
222 endif
223 endwhile
224 call assert_equal(3, done_colon)
225 call assert_equal(3, done_bar)
226
227 call histdel(':')
228 rviminfo Xviminfo
229 call assert_equal("echo " . long1400, histget(':', -1))
230 call assert_equal("echo " . long800, histget(':', -2))
231 call assert_equal("echo 'one'", histget(':', -3))
232
233 call delete('Xviminfo')
234endfunc
Bram Moolenaar1fd99c12016-06-09 20:24:28 +0200235
236func Test_cmdline_history_order()
237 call histdel(':')
238 call test_settime(11)
239 call histadd(':', "echo '11'")
240 call test_settime(22)
241 call histadd(':', "echo '22'")
242 call test_settime(33)
243 call histadd(':', "echo '33'")
244 wviminfo Xviminfo
245
246 call histdel(':')
247 " items go in between
248 call test_settime(15)
249 call histadd(':', "echo '15'")
250 call test_settime(27)
251 call histadd(':', "echo '27'")
252
253 rviminfo Xviminfo
254 call assert_equal("echo '33'", histget(':', -1))
255 call assert_equal("echo '27'", histget(':', -2))
256 call assert_equal("echo '22'", histget(':', -3))
257 call assert_equal("echo '15'", histget(':', -4))
258 call assert_equal("echo '11'", histget(':', -5))
259
260 call histdel(':')
261 " items go before and after
Bram Moolenaarce90e362019-09-08 18:58:44 +0200262 eval 8->test_settime()
Bram Moolenaar1fd99c12016-06-09 20:24:28 +0200263 call histadd(':', "echo '8'")
264 call test_settime(39)
265 call histadd(':', "echo '39'")
266
267 rviminfo Xviminfo
268 call assert_equal("echo '39'", histget(':', -1))
269 call assert_equal("echo '33'", histget(':', -2))
270 call assert_equal("echo '22'", histget(':', -3))
271 call assert_equal("echo '11'", histget(':', -4))
272 call assert_equal("echo '8'", histget(':', -5))
273
274 " Check sorting works when writing with merge.
275 call histdel(':')
276 call test_settime(8)
277 call histadd(':', "echo '8'")
278 call test_settime(15)
279 call histadd(':', "echo '15'")
280 call test_settime(27)
281 call histadd(':', "echo '27'")
282 call test_settime(39)
283 call histadd(':', "echo '39'")
284 wviminfo Xviminfo
285
286 call histdel(':')
287 rviminfo Xviminfo
288 call assert_equal("echo '39'", histget(':', -1))
289 call assert_equal("echo '33'", histget(':', -2))
290 call assert_equal("echo '27'", histget(':', -3))
291 call assert_equal("echo '22'", histget(':', -4))
292 call assert_equal("echo '15'", histget(':', -5))
293 call assert_equal("echo '11'", histget(':', -6))
294 call assert_equal("echo '8'", histget(':', -7))
295
296 call delete('Xviminfo')
297endfunc
Bram Moolenaar01227092016-06-11 14:47:40 +0200298
Bram Moolenaare80ff742016-06-11 21:14:18 +0200299func Test_viminfo_registers()
300 call test_settime(8)
301 call setreg('a', "eight", 'c')
302 call test_settime(20)
303 call setreg('b', ["twenty", "again"], 'l')
304 call test_settime(40)
305 call setreg('c', ["four", "agai"], 'b4')
306 let l = []
307 set viminfo='100,<600,s10,h,!,nviminfo
308 for i in range(500)
309 call add(l, 'something')
310 endfor
311 call setreg('d', l, 'l')
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200312 call setreg('e', "abc\<C-V>xyz")
Bram Moolenaare80ff742016-06-11 21:14:18 +0200313 wviminfo Xviminfo
314
315 call test_settime(10)
316 call setreg('a', '', 'b10')
317 call test_settime(15)
318 call setreg('b', 'drop')
319 call test_settime(50)
320 call setreg('c', 'keep', 'l')
321 call test_settime(30)
322 call setreg('d', 'drop', 'l')
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200323 call setreg('e', 'drop')
Bram Moolenaare80ff742016-06-11 21:14:18 +0200324 rviminfo Xviminfo
325
326 call assert_equal("", getreg('a'))
327 call assert_equal("\<C-V>10", getregtype('a'))
328 call assert_equal("twenty\nagain\n", getreg('b'))
329 call assert_equal("V", getregtype('b'))
330 call assert_equal("keep\n", getreg('c'))
331 call assert_equal("V", getregtype('c'))
332 call assert_equal(l, getreg('d', 1, 1))
333 call assert_equal("V", getregtype('d'))
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200334 call assert_equal("abc\<C-V>xyz", getreg('e'))
Bram Moolenaare80ff742016-06-11 21:14:18 +0200335
Bram Moolenaar25709572016-08-26 20:41:16 +0200336 " Length around 440 switches to line continuation.
337 let len = 434
338 while len < 445
339 let s = repeat('a', len)
340 call setreg('"', s)
341 wviminfo Xviminfo
342 call setreg('"', '')
343 rviminfo Xviminfo
344 call assert_equal(s, getreg('"'), 'wrong register at length: ' . len)
345
346 let len += 1
347 endwhile
348
Bram Moolenaare80ff742016-06-11 21:14:18 +0200349 call delete('Xviminfo')
350endfunc
351
Bram Moolenaar2d358992016-06-12 21:20:54 +0200352func Test_viminfo_marks()
353 sp bufa
354 let bufa = bufnr('%')
355 sp bufb
356 let bufb = bufnr('%')
357
358 call test_settime(8)
359 call setpos("'A", [bufa, 1, 1, 0])
360 call test_settime(20)
361 call setpos("'B", [bufb, 9, 1, 0])
362 call setpos("'C", [bufa, 7, 1, 0])
363
364 delmark 0-9
365 call test_settime(25)
366 call setpos("'1", [bufb, 12, 1, 0])
367 call test_settime(35)
368 call setpos("'0", [bufa, 11, 1, 0])
369
370 call test_settime(45)
371 wviminfo Xviminfo
372
373 " Writing viminfo inserts the '0 mark.
374 call assert_equal([bufb, 1, 1, 0], getpos("'0"))
375 call assert_equal([bufa, 11, 1, 0], getpos("'1"))
376 call assert_equal([bufb, 12, 1, 0], getpos("'2"))
377
378 call test_settime(4)
379 call setpos("'A", [bufa, 9, 1, 0])
380 call test_settime(30)
381 call setpos("'B", [bufb, 2, 3, 0])
382 delmark C
383
384 delmark 0-9
385 call test_settime(30)
386 call setpos("'1", [bufb, 22, 1, 0])
387 call test_settime(55)
388 call setpos("'0", [bufa, 21, 1, 0])
389
390 rviminfo Xviminfo
391
392 call assert_equal([bufa, 1, 1, 0], getpos("'A"))
393 call assert_equal([bufb, 2, 3, 0], getpos("'B"))
394 call assert_equal([bufa, 7, 1, 0], getpos("'C"))
395
396 " numbered marks are merged
397 call assert_equal([bufa, 21, 1, 0], getpos("'0")) " time 55
398 call assert_equal([bufb, 1, 1, 0], getpos("'1")) " time 45
399 call assert_equal([bufa, 11, 1, 0], getpos("'2")) " time 35
400 call assert_equal([bufb, 22, 1, 0], getpos("'3")) " time 30
401 call assert_equal([bufb, 12, 1, 0], getpos("'4")) " time 25
402
Bram Moolenaar8cd6cd82019-12-27 17:33:26 +0100403 " deleted file marks are removed from viminfo
404 delmark C
405 wviminfo Xviminfo
406 rviminfo Xviminfo
407 call assert_equal([0, 0, 0, 0], getpos("'C"))
408
409 " deleted file marks stay in viminfo if defined in another vim later
410 call test_settime(70)
411 call setpos("'D", [bufb, 8, 1, 0])
412 wviminfo Xviminfo
413 call test_settime(65)
414 delmark D
415 call assert_equal([0, 0, 0, 0], getpos("'D"))
416 call test_settime(75)
417 rviminfo Xviminfo
418 call assert_equal([bufb, 8, 1, 0], getpos("'D"))
419
Bram Moolenaar2d358992016-06-12 21:20:54 +0200420 call delete('Xviminfo')
421 exe 'bwipe ' . bufa
422 exe 'bwipe ' . bufb
423endfunc
424
425func Test_viminfo_jumplist()
426 split testbuf
427 clearjumps
428 call setline(1, ['time 05', 'time 10', 'time 15', 'time 20', 'time 30', 'last pos'])
429 call cursor(2, 1)
430 call test_settime(10)
431 exe "normal /20\r"
432 call test_settime(20)
433 exe "normal /30\r"
434 call test_settime(30)
435 exe "normal /last pos\r"
436 wviminfo Xviminfo
437
438 clearjumps
439 call cursor(1, 1)
440 call test_settime(5)
441 exe "normal /15\r"
442 call test_settime(15)
443 exe "normal /last pos\r"
444 call test_settime(40)
445 exe "normal ?30\r"
446 rviminfo Xviminfo
447
448 call assert_equal('time 30', getline('.'))
449 exe "normal \<C-O>"
450 call assert_equal('last pos', getline('.'))
451 exe "normal \<C-O>"
452 " duplicate for 'time 30' was removed
453 call assert_equal('time 20', getline('.'))
454 exe "normal \<C-O>"
455 call assert_equal('time 15', getline('.'))
456 exe "normal \<C-O>"
457 call assert_equal('time 10', getline('.'))
458 exe "normal \<C-O>"
459 call assert_equal('time 05', getline('.'))
460
Bram Moolenaarece74ab2016-06-13 22:22:15 +0200461 clearjumps
462 call cursor(1, 1)
463 call test_settime(5)
464 exe "normal /15\r"
465 call test_settime(15)
466 exe "normal /last pos\r"
467 call test_settime(40)
468 exe "normal ?30\r"
469 " Test merge when writing
470 wviminfo Xviminfo
471 clearjumps
472 rviminfo Xviminfo
473
Bram Moolenaar28607ba2016-06-15 21:44:51 +0200474 let last_line = line('.')
Bram Moolenaarece74ab2016-06-13 22:22:15 +0200475 exe "normal \<C-O>"
476 call assert_equal('time 30', getline('.'))
477 exe "normal \<C-O>"
478 call assert_equal('last pos', getline('.'))
479 exe "normal \<C-O>"
480 " duplicate for 'time 30' was removed
481 call assert_equal('time 20', getline('.'))
482 exe "normal \<C-O>"
483 call assert_equal('time 15', getline('.'))
484 exe "normal \<C-O>"
485 call assert_equal('time 10', getline('.'))
486 exe "normal \<C-O>"
487 call assert_equal('time 05', getline('.'))
488
Bram Moolenaar28607ba2016-06-15 21:44:51 +0200489 " Test with jumplist full.
490 clearjumps
491 call setline(1, repeat(['match here'], 101))
492 call cursor(1, 1)
493 call test_settime(10)
494 for i in range(100)
495 exe "normal /here\r"
496 endfor
497 rviminfo Xviminfo
498
499 " must be newest mark that comes from viminfo.
500 exe "normal \<C-O>"
501 call assert_equal(last_line, line('.'))
502
Bram Moolenaar2d358992016-06-12 21:20:54 +0200503 bwipe!
504 call delete('Xviminfo')
505endfunc
506
Bram Moolenaar01227092016-06-11 14:47:40 +0200507func Test_viminfo_encoding()
Bram Moolenaar01227092016-06-11 14:47:40 +0200508 set enc=latin1
509 call histdel(':')
510 call histadd(':', "echo '\xe9'")
511 wviminfo Xviminfo
512
513 set fencs=utf-8,latin1
514 set enc=utf-8
515 sp Xviminfo
516 call assert_equal('latin1', &fenc)
517 close
518
519 call histdel(':')
520 rviminfo Xviminfo
521 call assert_equal("echo 'é'", histget(':', -1))
522
523 call delete('Xviminfo')
524endfunc
Bram Moolenaar62f8b4e2016-06-11 15:31:47 +0200525
526func Test_viminfo_bad_syntax()
527 let lines = []
528 call add(lines, '|<') " empty continuation line
529 call add(lines, '|234234234234234324,nothing')
530 call add(lines, '|1+"no comma"')
531 call add(lines, '|1,2,3,4,5,6,7') " too many items
532 call add(lines, '|1,"string version"')
533 call add(lines, '|1,>x') " bad continuation line
534 call add(lines, '|1,"x') " missing quote
535 call add(lines, '|1,"x\') " trailing backslash
536 call add(lines, '|1,,,,') "trailing comma
537 call add(lines, '|1,>234') " trailing continuation line
538 call writefile(lines, 'Xviminfo')
Bram Moolenaare80ff742016-06-11 21:14:18 +0200539 rviminfo Xviminfo
Bram Moolenaar62f8b4e2016-06-11 15:31:47 +0200540
541 call delete('Xviminfo')
542endfunc
543
Yegappan Lakshmanan41a7f822021-06-16 15:53:17 +0200544func Test_viminfo_bad_register_syntax()
545 let lines = []
546 call add(lines, '|1,4')
547 call add(lines, '|3') " invalid number of fields for a register type
548 call add(lines, '|3,1,1,1,1,,1,"x"') " invalid value for the width field
549 call add(lines, '|3,0,80,1,1,1,1,"x"') " invalid register number
550 call add(lines, '|3,0,10,5,1,1,1,"x"') " invalid register type
551 call add(lines, '|3,0,10,1,20,1,1,"x"') " invalid line count
552 call add(lines, '|3,0,10,1,0,1,1') " zero line count
553 call writefile(lines, 'Xviminfo')
554 rviminfo Xviminfo
555 call delete('Xviminfo')
556endfunc
557
Bram Moolenaarab9c89b2016-07-03 17:47:26 +0200558func Test_viminfo_file_marks()
559 silent! bwipe test_viminfo.vim
560 silent! bwipe Xviminfo
561
562 call test_settime(10)
563 edit ten
564 call test_settime(25)
565 edit again
566 call test_settime(30)
567 edit thirty
568 wviminfo Xviminfo
569
570 call test_settime(20)
571 edit twenty
572 call test_settime(35)
573 edit again
574 call test_settime(40)
575 edit fourty
576 wviminfo Xviminfo
577
578 sp Xviminfo
579 1
580 for name in ['fourty', 'again', 'thirty', 'twenty', 'ten']
581 /^>
582 call assert_equal(name, substitute(getline('.'), '.*/', '', ''))
583 endfor
584 close
585
586 call delete('Xviminfo')
587endfunc
Bram Moolenaare59215c2016-08-14 19:08:45 +0200588
589func Test_viminfo_file_mark_tabclose()
590 tabnew Xtestfileintab
591 call setline(1, ['a','b','c','d','e'])
592 4
593 q!
594 wviminfo Xviminfo
595 sp Xviminfo
596 /^> .*Xtestfileintab
597 let lnum = line('.')
598 while 1
599 if lnum == line('$')
Bram Moolenaar37175402017-03-18 20:18:45 +0100600 call assert_report('mark not found in Xtestfileintab')
Bram Moolenaare59215c2016-08-14 19:08:45 +0200601 break
602 endif
603 let lnum += 1
604 let line = getline(lnum)
605 if line == ''
Bram Moolenaar37175402017-03-18 20:18:45 +0100606 call assert_report('mark not found in Xtestfileintab')
Bram Moolenaare59215c2016-08-14 19:08:45 +0200607 break
608 endif
609 if line =~ "^\t\""
610 call assert_equal('4', substitute(line, ".*\"\t\\(\\d\\).*", '\1', ''))
611 break
612 endif
613 endwhile
614
615 call delete('Xviminfo')
616 silent! bwipe Xtestfileintab
617endfunc
Bram Moolenaare11d61a2016-08-20 18:36:54 +0200618
Bram Moolenaar156919f2016-10-15 20:46:20 +0200619func Test_viminfo_file_mark_zero_time()
620 let lines = [
621 \ '# Viminfo version',
622 \ '|1,4',
623 \ '',
624 \ '*encoding=utf-8',
625 \ '',
626 \ '# File marks:',
627 \ "'B 1 0 /tmp/nothing",
628 \ '|4,66,1,0,0,"/tmp/nothing"',
629 \ "",
630 \ ]
631 call writefile(lines, 'Xviminfo')
632 delmark B
633 rviminfo Xviminfo
634 call delete('Xviminfo')
635 call assert_equal(1, line("'B"))
636 delmark B
637endfunc
638
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200639" Test for saving and restoring file marks in unloaded buffers
640func Test_viminfo_file_mark_unloaded_buf()
641 let save_viminfo = &viminfo
642 set viminfo&vim
643 call writefile(repeat(['vim'], 10), 'Xfile1')
644 %bwipe
645 edit! Xfile1
646 call setpos("'u", [0, 3, 1, 0])
647 call setpos("'v", [0, 5, 1, 0])
648 enew
649 wviminfo Xviminfo
650 %bwipe
651 edit Xfile1
652 rviminfo! Xviminfo
653 call assert_equal([0, 3, 1, 0], getpos("'u"))
654 call assert_equal([0, 5, 1, 0], getpos("'v"))
655 %bwipe
656 call delete('Xfile1')
657 call delete('Xviminfo')
658 let &viminfo = save_viminfo
659endfunc
660
Bram Moolenaar156919f2016-10-15 20:46:20 +0200661func Test_viminfo_oldfiles()
Bram Moolenaare11d61a2016-08-20 18:36:54 +0200662 let v:oldfiles = []
663 let lines = [
664 \ '# comment line',
665 \ '*encoding=utf-8',
666 \ '',
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200667 \ ':h viminfo',
668 \ '?/session',
669 \ '=myvar',
670 \ '@123',
671 \ '',
672 \ "'E 2 0 /tmp/nothing",
673 \ '',
Bram Moolenaare11d61a2016-08-20 18:36:54 +0200674 \ "> /tmp/file_one.txt",
675 \ "\t\"\t11\t0",
676 \ "",
677 \ "> /tmp/file_two.txt",
678 \ "\t\"\t11\t0",
679 \ "",
680 \ "> /tmp/another.txt",
681 \ "\t\"\t11\t0",
682 \ "",
683 \ ]
684 call writefile(lines, 'Xviminfo')
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200685 delmark E
Bram Moolenaar5affc032021-02-11 18:36:30 +0100686 edit /tmp/file_two.txt
Bram Moolenaare11d61a2016-08-20 18:36:54 +0200687 rviminfo! Xviminfo
688 call delete('Xviminfo')
689
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200690 call assert_equal('h viminfo', histget(':'))
691 call assert_equal('session', histget('/'))
692 call assert_equal('myvar', histget('='))
693 call assert_equal('123', histget('@'))
694 call assert_equal(2, line("'E"))
Bram Moolenaar7b668e82016-08-23 23:51:21 +0200695 call assert_equal(['1: /tmp/file_one.txt', '2: /tmp/file_two.txt', '3: /tmp/another.txt'], filter(split(execute('oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
696 call assert_equal(['1: /tmp/file_one.txt', '2: /tmp/file_two.txt'], filter(split(execute('filter file_ oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
697 call assert_equal(['3: /tmp/another.txt'], filter(split(execute('filter /another/ oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
Bram Moolenaar5328cb82019-07-27 23:27:51 +0200698
699 new
700 call feedkeys("3\<CR>", 't')
701 browse oldfiles
702 call assert_equal("/tmp/another.txt", expand("%"))
703 bwipe
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200704 delmark E
705endfunc
706
707" Test for storing and restoring buffer list in 'viminfo'
708func Test_viminfo_bufferlist()
709 " If there are arguments, then :rviminfo doesn't read the buffer list.
710 " Need to delete all the arguments for :rviminfo to work.
711 %argdelete
Yegappan Lakshmanan41a7f822021-06-16 15:53:17 +0200712 set viminfo&vim
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200713
714 edit Xfile1
715 edit Xfile2
716 set viminfo-=%
717 wviminfo Xviminfo
718 %bwipe
719 rviminfo Xviminfo
720 call assert_equal(1, len(getbufinfo()))
721
722 edit Xfile1
723 edit Xfile2
724 set viminfo^=%
725 wviminfo Xviminfo
726 %bwipe
727 rviminfo Xviminfo
728 let l = getbufinfo()
729 call assert_equal(3, len(l))
730 call assert_equal('Xfile1', bufname(l[1].bufnr))
731 call assert_equal('Xfile2', bufname(l[2].bufnr))
732
Yegappan Lakshmanan41a7f822021-06-16 15:53:17 +0200733 " The quickfix, terminal, unlisted, unnamed buffers are not stored in the
734 " viminfo file
735 %bw!
736 edit Xfile1
737 new
738 setlocal nobuflisted
739 new
740 copen
741 if has('terminal')
742 terminal
743 endif
744 wviminfo! Xviminfo
745 %bwipe!
746 rviminfo Xviminfo
747 let l = getbufinfo()
748 call assert_equal(2, len(l))
749 call assert_true(bufexists('Xfile1'))
750
751 " If a count is specified for '%', then only that many buffers should be
752 " stored in the viminfo file.
753 %bw!
754 set viminfo&vim
755 new Xbuf1
756 new Xbuf2
757 set viminfo+=%1
758 wviminfo! Xviminfo
759 %bwipe!
760 rviminfo! Xviminfo
761 let l = getbufinfo()
762 call assert_equal(2, len(l))
763 call assert_true(bufexists('Xbuf1'))
764 call assert_false(bufexists('Xbuf2'))
765
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200766 call delete('Xviminfo')
767 %bwipe
Yegappan Lakshmanan41a7f822021-06-16 15:53:17 +0200768 set viminfo&vim
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200769endfunc
770
771" Test for errors in a viminfo file
772func Test_viminfo_error()
773 " Non-existing viminfo files
774 call assert_fails('rviminfo xyz', 'E195:')
775
776 " Illegal starting character
777 call writefile(["a 123"], 'Xviminfo')
778 call assert_fails('rv Xviminfo', 'E575:')
779
780 " Illegal register name in the viminfo file
781 call writefile(['"@ LINE 0'], 'Xviminfo')
782 call assert_fails('rv Xviminfo', 'E577:')
783
784 " Invalid file mark line
785 call writefile(['>', '@'], 'Xviminfo')
786 call assert_fails('rv Xviminfo', 'E576:')
787
788 " Too many errors in viminfo file
789 call writefile(repeat(["a 123"], 15), 'Xviminfo')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200790 call assert_fails('rv Xviminfo', 'E575:')
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200791
792 call writefile(['>'] + repeat(['@'], 10), 'Xviminfo')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200793 call assert_fails('rv Xviminfo', 'E576:')
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200794
795 call writefile(repeat(['"@'], 15), 'Xviminfo')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +0200796 call assert_fails('rv Xviminfo', 'E577:')
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200797
798 call delete('Xviminfo')
799endfunc
800
801" Test for saving and restoring last substitute string in viminfo
802func Test_viminfo_lastsub()
803 enew
804 call append(0, "blue blue blue")
805 call cursor(1, 1)
806 s/blue/green/
807 wviminfo Xviminfo
808 s/blue/yellow/
809 rviminfo! Xviminfo
810 &
811 call assert_equal("green yellow green", getline(1))
812 enew!
813 call delete('Xviminfo')
814endfunc
815
816" Test saving and restoring the register values using the older method
817func Test_viminfo_registers_old()
818 let lines = [
819 \ '# Viminfo version',
820 \ '|1,1',
821 \ '',
822 \ '*encoding=utf-8',
823 \ '',
824 \ '# Registers:',
825 \ '""0 CHAR 0',
826 \ ' Vim',
827 \ '"a CHAR 0',
828 \ ' red',
Yegappan Lakshmanan41a7f822021-06-16 15:53:17 +0200829 \ '"c BLOCK 0',
830 \ ' a',
831 \ ' d',
832 \ '"d LINE 0',
833 \ ' abc',
834 \ ' def',
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200835 \ '"m@ CHAR 0',
836 \ " :echo 'Hello'\<CR>",
837 \ "",
838 \ ]
839 call writefile(lines, 'Xviminfo')
840 let @a = 'one'
841 let @b = 'two'
842 let @m = 'three'
843 let @" = 'four'
844 let @t = ":echo 'Unix'\<CR>"
845 silent! normal @t
846 rviminfo! Xviminfo
847 call assert_equal('red', getreg('a'))
Yegappan Lakshmanan41a7f822021-06-16 15:53:17 +0200848 call assert_equal("v", getregtype('a'))
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200849 call assert_equal('two', getreg('b'))
Yegappan Lakshmanan41a7f822021-06-16 15:53:17 +0200850 call assert_equal("a\nd", getreg('c'))
851 call assert_equal("\<C-V>1", getregtype('c'))
852 call assert_equal("abc\ndef\n", getreg('d'))
853 call assert_equal("V", getregtype('d'))
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200854 call assert_equal(":echo 'Hello'\<CR>", getreg('m'))
855 call assert_equal('Vim', getreg('"'))
856 call assert_equal("\nHello", execute('normal @@'))
857 call delete('Xviminfo')
858 let @" = ''
859endfunc
860
861" Test for saving and restoring large number of lines in a register
862func Test_viminfo_large_register()
863 let save_viminfo = &viminfo
864 set viminfo&vim
865 set viminfo-=<50
866 set viminfo+=<200
867 let lines = ['"r CHAR 0']
868 call extend(lines, repeat(["\tsun is rising"], 200))
869 call writefile(lines, 'Xviminfo')
870 let @r = ''
871 rviminfo! Xviminfo
872 call assert_equal(join(repeat(["sun is rising"], 200), "\n"), @r)
873 call delete('Xviminfo')
Bram Moolenaar6bd1d772019-10-09 22:01:25 +0200874 let @r = ''
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200875 let &viminfo = save_viminfo
876endfunc
877
878" Test for setting 'viminfofile' to NONE
879func Test_viminfofile_none()
Bram Moolenaar6bd1d772019-10-09 22:01:25 +0200880 let save_vif = &viminfofile
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200881 set viminfofile=NONE
882 wviminfo Xviminfo
883 call assert_false(filereadable('Xviminfo'))
884 call writefile([''], 'Xviminfo')
885 call assert_fails('rviminfo Xviminfo', 'E195:')
886 call delete('Xviminfo')
Bram Moolenaar6bd1d772019-10-09 22:01:25 +0200887 let &viminfofile = save_vif
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200888endfunc
889
Bram Moolenaar6bd1d772019-10-09 22:01:25 +0200890" Test for an unwritable and unreadble 'viminfo' file
891func Test_viminfo_perm()
892 CheckUnix
Bram Moolenaar07282f02019-10-10 16:46:17 +0200893 CheckNotRoot
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200894 call writefile([''], 'Xviminfo')
895 call setfperm('Xviminfo', 'r-x------')
896 call assert_fails('wviminfo Xviminfo', 'E137:')
Bram Moolenaar6bd1d772019-10-09 22:01:25 +0200897 call setfperm('Xviminfo', '--x------')
898 call assert_fails('rviminfo Xviminfo', 'E195:')
Bram Moolenaar2a8d3b82019-10-04 21:20:25 +0200899 call delete('Xviminfo')
Bram Moolenaarcde0ff32020-04-04 14:00:39 +0200900
901 " Try to write the viminfo to a directory
902 call mkdir('Xdir')
Bram Moolenaarb86abad2020-08-01 16:08:19 +0200903 call assert_fails('wviminfo Xdir', 'E137:')
Bram Moolenaarcde0ff32020-04-04 14:00:39 +0200904 call delete('Xdir', 'rf')
Bram Moolenaare11d61a2016-08-20 18:36:54 +0200905endfunc
Bram Moolenaar6bd1d772019-10-09 22:01:25 +0200906
907" Test for writing to an existing viminfo file merges the file marks
908func XTest_viminfo_marks_merge()
909 let save_viminfo = &viminfo
910 set viminfo&vim
911 set viminfo^=%
912 enew
913 %argdelete
914 %bwipe
915
916 call writefile(repeat(['editor'], 10), 'Xbufa')
917 call writefile(repeat(['Vim'], 10), 'Xbufb')
918
919 " set marks in buffers
920 call test_settime(10)
921 edit Xbufa
922 4mark a
923 wviminfo Xviminfo
924 edit Xbufb
925 4mark b
926 wviminfo Xviminfo
927 %bwipe
928
929 " set marks in buffers again
930 call test_settime(20)
931 edit Xbufb
932 6mark b
933 wviminfo Xviminfo
934 edit Xbufa
935 6mark a
936 wviminfo Xviminfo
937 %bwipe
938
939 " Load the buffer and check the marks
940 edit Xbufa
941 rviminfo! Xviminfo
942 call assert_equal(6, line("'a"))
943 edit Xbufb
944 rviminfo! Xviminfo
945 call assert_equal(6, line("'b"))
946
947 " cleanup
948 %bwipe
949 call delete('Xviminfo')
950 call delete('Xbufa')
951 call delete('Xbufb')
952 call test_settime(0)
953 let &viminfo=save_viminfo
954endfunc
Bram Moolenaaree4e0c12020-04-06 21:35:05 +0200955
956" Test for errors in setting 'viminfo'
957func Test_viminfo_option_error()
958 " Missing number
959 call assert_fails('set viminfo=\"', 'E526:')
960 for c in split("'/:<@s", '\zs')
961 call assert_fails('set viminfo=' .. c, 'E526:')
962 endfor
963
964 " Missing comma
965 call assert_fails('set viminfo=%10!', 'E527:')
966 call assert_fails('set viminfo=!%10', 'E527:')
967 call assert_fails('set viminfo=h%10', 'E527:')
968 call assert_fails('set viminfo=c%10', 'E527:')
969 call assert_fails('set viminfo=:10%10', 'E527:')
970
971 " Missing ' setting
972 call assert_fails('set viminfo=%10', 'E528:')
973endfunc
974
Bram Moolenaar8e6be342020-11-23 22:01:26 +0100975func Test_viminfo_oldfiles_newfile()
976 CheckRunVimInTerminal
977
978 let save_viminfo = &viminfo
979 let save_viminfofile = &viminfofile
980 set viminfo&vim
981 let v:oldfiles = []
982 let commands =<< trim [CODE]
983 set viminfofile=Xviminfofile
984 set viminfo&vim
985 w! Xnew-file.txt
986 qall
987 [CODE]
988 call writefile(commands, 'Xviminfotest')
989 let buf = RunVimInTerminal('-S Xviminfotest', #{wait_for_ruler: 0})
990 call WaitForAssert({-> assert_equal("finished", term_getstatus(buf))})
991
992 let &viminfofile = 'Xviminfofile'
993 rviminfo! Xviminfofile
994 call assert_match('Xnew-file.txt$', v:oldfiles[0])
995 call assert_equal(1, len(v:oldfiles))
996 call delete('Xviminfofile')
997 call delete('Xviminfotest')
998 call delete('Xnew-file.txt')
Bram Moolenaar6fd367a2021-03-13 13:14:04 +0100999
1000 let v:oldfiles = test_null_list()
1001 call assert_equal("\nNo old files", execute('oldfiles'))
1002
Bram Moolenaar8e6be342020-11-23 22:01:26 +01001003 let &viminfo = save_viminfo
1004 let &viminfofile = save_viminfofile
1005endfunc
1006
Yegappan Lakshmanan41a7f822021-06-16 15:53:17 +02001007" When writing CTRL-V or "\n" to a viminfo file, it is converted to CTRL-V
1008" CTRL-V and CTRL-V n respectively.
1009func Test_viminfo_with_Ctrl_V()
1010 silent! exe "normal! /\<C-V>\<C-V>\n"
1011 wviminfo Xviminfo
1012 call assert_notequal(-1, readfile('Xviminfo')->index("?/\<C-V>\<C-V>"))
1013 let @/ = 'abc'
1014 rviminfo! Xviminfo
1015 call assert_equal("\<C-V>", @/)
1016 silent! exe "normal! /\<C-V>\<C-J>\n"
1017 wviminfo Xviminfo
1018 call assert_notequal(-1, readfile('Xviminfo')->index("?/\<C-V>n"))
1019 let @/ = 'abc'
1020 rviminfo! Xviminfo
1021 call assert_equal("\n", @/)
1022 call delete('Xviminfo')
1023endfunc
1024
1025" Test for the 'r' field in 'viminfo' (removal media)
1026func Test_viminfo_removable_media()
1027 CheckUnix
1028 if !isdirectory('/tmp') || getftype('/tmp') != 'dir'
1029 return
1030 endif
1031 let save_viminfo = &viminfo
1032 set viminfo+=r/tmp
1033 edit /tmp/Xvima1b2c3
1034 wviminfo Xviminfo
1035 let matches = readfile('Xviminfo')->filter("v:val =~ 'Xvima1b2c3'")
1036 call assert_equal(0, matches->len())
1037 let &viminfo = save_viminfo
1038 call delete('Xviminfo')
1039endfunc
1040
1041" Test for the 'h' flag in 'viminfo'. If 'h' is not present, then the last
1042" search pattern read from 'viminfo' should be highlighted with 'hlsearch'.
1043" If 'h' is present, then the last search pattern should not be highlighted.
1044func Test_viminfo_hlsearch()
1045 set viminfo&vim
1046
1047 new
1048 call setline(1, ['one two three'])
1049 " save the screen attribute for the Search highlighted text and the normal
1050 " text for later comparison
1051 set hlsearch
1052 let @/ = 'three'
1053 redraw!
1054 let hiSearch = screenattr(1, 9)
1055 let hiNormal = screenattr(1, 1)
1056
1057 set viminfo-=h
1058 let @/='two'
1059 wviminfo! Xviminfo
1060 let @/='one'
1061 rviminfo! Xviminfo
1062 redraw!
1063 call assert_equal(hiSearch, screenattr(1, 5))
1064 call assert_equal(hiSearch, screenattr(1, 6))
1065 call assert_equal(hiSearch, screenattr(1, 7))
1066
1067 set viminfo+=h
1068 let @/='two'
1069 wviminfo! Xviminfo
1070 let @/='one'
1071 rviminfo! Xviminfo
1072 redraw!
1073 call assert_equal(hiNormal, screenattr(1, 5))
1074 call assert_equal(hiNormal, screenattr(1, 6))
1075 call assert_equal(hiNormal, screenattr(1, 7))
1076
1077 call delete('Xviminfo')
1078 set hlsearch& viminfo&vim
1079 bw!
1080endfunc
1081
1082" Test for restoring the magicness of the last search pattern from the viminfo
1083" file.
1084func Test_viminfo_last_spat_magic()
1085 set viminfo&vim
1086 new
1087 call setline(1, ' one abc a.c')
1088
1089 " restore 'nomagic'
1090 set nomagic
1091 exe "normal gg/a.c\<CR>"
1092 wviminfo! Xviminfo
1093 set magic
1094 exe "normal gg/one\<CR>"
1095 rviminfo! Xviminfo
1096 exe "normal! gg/\<CR>"
1097 call assert_equal(10, col('.'))
1098
1099 " restore 'magic'
1100 set magic
1101 exe "normal gg/a.c\<CR>"
1102 wviminfo! Xviminfo
1103 set nomagic
1104 exe "normal gg/one\<CR>"
1105 rviminfo! Xviminfo
1106 exe "normal! gg/\<CR>"
1107 call assert_equal(6, col('.'))
1108
1109 call delete('Xviminfo')
1110 set viminfo&vim magic&
1111 bw!
1112endfunc
1113
1114" Test for restoring the smartcase of the last search pattern from the viminfo
1115" file.
1116func Test_viminfo_last_spat_smartcase()
1117 new
1118 call setline(1, ' one abc Abc')
1119 set ignorecase smartcase
1120
1121 " Searching with * should disable smartcase
1122 exe "normal! gg$b*"
1123 wviminfo! Xviminfo
1124 exe "normal gg/one\<CR>"
1125 rviminfo! Xviminfo
1126 exe "normal! gg/\<CR>"
1127 call assert_equal(6, col('.'))
1128
1129 call delete('Xviminfo')
1130 set ignorecase& smartcase& viminfo&
1131 bw!
1132endfunc
1133
1134" Test for restoring the last search pattern with a line or character offset
1135" from the viminfo file.
1136func Test_viminfo_last_spat_offset()
1137 new
1138 call setline(1, ['one', 'two', 'three', 'four', 'five'])
1139 " line offset
1140 exe "normal! /two/+2\<CR>"
1141 wviminfo! Xviminfo
1142 exe "normal gg/five\<CR>"
1143 rviminfo! Xviminfo
1144 exe "normal! gg/\<CR>"
1145 call assert_equal(4, line('.'))
1146 " character offset
1147 exe "normal! gg/^th/e+2\<CR>"
1148 wviminfo! Xviminfo
1149 exe "normal gg/two\<CR>"
1150 rviminfo! Xviminfo
1151 exe "normal! gg/\<CR>"
1152 call assert_equal([3, 4], [line('.'), col('.')])
1153 call delete('Xviminfo')
1154 bw!
1155endfunc
1156
1157" Test for saving and restoring the last executed register (@ command)
1158" from the viminfo file
1159func Test_viminfo_last_exec_reg()
1160 let g:val = 1
1161 let @a = ":let g:val += 1\n"
1162 normal! @a
1163 wviminfo! Xviminfo
1164 let @b = ''
1165 normal! @b
1166 rviminfo! Xviminfo
1167 normal @@
1168 call assert_equal(3, g:val)
1169 call delete('Xviminfo')
1170endfunc
1171
1172" Test for merging file marks in a viminfo file
1173func Test_viminfo_merge_file_marks()
1174 for [f, l, t] in [['a.txt', 5, 10], ['b.txt', 10, 20]]
1175 call test_settime(t)
1176 exe 'edit ' .. f
1177 call setline(1, range(1, 20))
1178 exe l . 'mark a'
1179 wviminfo Xviminfo
1180 bw!
1181 endfor
1182 call test_settime(30)
1183 for [f, l] in [['a.txt', 5], ['b.txt', 10]]
1184 exe 'edit ' .. f
1185 rviminfo! Xviminfo
1186 call assert_equal(l, line("'a"))
1187 bw!
1188 endfor
1189 call delete('Xviminfo')
1190 call test_settime(0)
1191endfunc
1192
1193" Test for merging file marks from a old viminfo file
1194func Test_viminfo_merge_old_filemarks()
1195 let lines = []
1196 call add(lines, '|1,4')
1197 call add(lines, '> ' .. fnamemodify('a.txt', ':p:~'))
1198 call add(lines, "\tb\t7\t0\n")
1199 call writefile(lines, 'Xviminfo')
1200 edit b.txt
1201 call setline(1, range(1, 20))
1202 12mark b
1203 wviminfo Xviminfo
1204 bw!
1205 edit a.txt
1206 rviminfo! Xviminfo
1207 call assert_equal(7, line("'b"))
1208 edit b.txt
1209 rviminfo! Xviminfo
1210 call assert_equal(12, line("'b"))
1211 call delete('Xviminfo')
1212endfunc
1213
1214" Test for merging the jump list from a old viminfo file
1215func Test_viminfo_merge_old_jumplist()
1216 let lines = []
1217 call add(lines, "-' 10 1 " .. fnamemodify('a.txt', ':p:~'))
1218 call add(lines, "-' 20 1 " .. fnamemodify('a.txt', ':p:~'))
1219 call add(lines, "-' 30 1 " .. fnamemodify('b.txt', ':p:~'))
1220 call add(lines, "-' 40 1 " .. fnamemodify('b.txt', ':p:~'))
1221 call writefile(lines, 'Xviminfo')
1222 clearjumps
1223 rviminfo! Xviminfo
1224 let l = getjumplist()[0]
1225 call assert_equal([40, 30, 20, 10], [l[0].lnum, l[1].lnum, l[2].lnum,
1226 \ l[3].lnum])
1227 bw!
1228 call delete('Xviminfo')
1229endfunc
1230
Bram Moolenaaree4e0c12020-04-06 21:35:05 +02001231" vim: shiftwidth=2 sts=2 expandtab