xref: /vim-8.2.3635/src/testdir/test_viminfo.vim (revision f1e7449d)
1b20e3348SBram Moolenaar" Test for reading and writing .viminfo
2b20e3348SBram Moolenaar
36bd1d770SBram Moolenaarsource check.vim
48e6be343SBram Moolenaarsource term_util.vim
58e6be343SBram Moolenaarsource shared.vim
66bd1d770SBram Moolenaar
741a7f82dSYegappan Lakshmananfunc Test_viminfo_read_and_write()
826b654a5SBram Moolenaar  " First clear 'history', so that "hislen" is zero.  Then set it again,
926b654a5SBram Moolenaar  " simulating Vim starting up.
1026b654a5SBram Moolenaar  set history=0
1126b654a5SBram Moolenaar  wviminfo Xviminfo
1226b654a5SBram Moolenaar  set history=1000
1326b654a5SBram Moolenaar
1445d2eeaaSBram Moolenaar  call histdel(':')
1541a7f82dSYegappan Lakshmanan  let @/=''
16b20e3348SBram Moolenaar  let lines = [
17b20e3348SBram Moolenaar	\ '# comment line',
18b20e3348SBram Moolenaar	\ '*encoding=utf-8',
19b20e3348SBram Moolenaar	\ '~MSle0~/asdf',
20b20e3348SBram Moolenaar	\ '|copied as-is',
21b20e3348SBram Moolenaar	\ '|and one more',
22b20e3348SBram Moolenaar	\ ]
23b20e3348SBram Moolenaar  call writefile(lines, 'Xviminfo')
24b20e3348SBram Moolenaar  rviminfo Xviminfo
25b20e3348SBram Moolenaar  call assert_equal('asdf', @/)
26b20e3348SBram Moolenaar
27b20e3348SBram Moolenaar  wviminfo Xviminfo
28b20e3348SBram Moolenaar  let lines = readfile('Xviminfo')
29b20e3348SBram Moolenaar  let done = 0
30b20e3348SBram Moolenaar  for line in lines
31156919f9SBram Moolenaar    if line[0] == '|' && line !~ '^|[234],' && line !~ '^|<'
32b20e3348SBram Moolenaar      if done == 0
332d358997SBram Moolenaar	call assert_equal('|1,4', line)
34b20e3348SBram Moolenaar      elseif done == 1
3545d2eeaaSBram Moolenaar	call assert_equal('|copied as-is', line)
3645d2eeaaSBram Moolenaar      elseif done == 2
37b20e3348SBram Moolenaar	call assert_equal('|and one more', line)
38b20e3348SBram Moolenaar      endif
39b20e3348SBram Moolenaar      let done += 1
40b20e3348SBram Moolenaar    endif
41b20e3348SBram Moolenaar  endfor
4245d2eeaaSBram Moolenaar  call assert_equal(3, done)
43b20e3348SBram Moolenaar
44b20e3348SBram Moolenaar  call delete('Xviminfo')
45b20e3348SBram Moolenaarendfunc
46b20e3348SBram Moolenaar
47b20e3348SBram Moolenaarfunc Test_global_vars()
482a8d3b89SBram Moolenaar  let g:MY_GLOBAL_STRING = "Vim Editor"
492a8d3b89SBram Moolenaar  let g:MY_GLOBAL_NUM = 345
502a8d3b89SBram Moolenaar  let g:MY_GLOBAL_FLOAT = 3.14
51b20e3348SBram Moolenaar  let test_dict = {'foo': 1, 'bar': 0, 'longvarible': 1000}
52b20e3348SBram Moolenaar  let g:MY_GLOBAL_DICT = test_dict
53b20e3348SBram Moolenaar  " store a really long list, so line wrapping will occur in viminfo file
54b20e3348SBram Moolenaar  let test_list = range(1,100)
55b20e3348SBram Moolenaar  let g:MY_GLOBAL_LIST = test_list
568c8b8bb5SBram Moolenaar  let test_blob = 0z00112233445566778899aabbccddeeff
578c8b8bb5SBram Moolenaar  let g:MY_GLOBAL_BLOB = test_blob
588c8b8bb5SBram Moolenaar  let test_false = v:false
598c8b8bb5SBram Moolenaar  let g:MY_GLOBAL_FALSE = test_false
608c8b8bb5SBram Moolenaar  let test_true = v:true
618c8b8bb5SBram Moolenaar  let g:MY_GLOBAL_TRUE = test_true
628c8b8bb5SBram Moolenaar  let test_null = v:null
638c8b8bb5SBram Moolenaar  let g:MY_GLOBAL_NULL = test_null
648c8b8bb5SBram Moolenaar  let test_none = v:none
658c8b8bb5SBram Moolenaar  let g:MY_GLOBAL_NONE = test_none
66*f1e7449dSYegappan Lakshmanan  let g:MY_GLOBAL_FUNCREF = function('min')
678c8b8bb5SBram Moolenaar
68e9c07270SBram Moolenaar  set viminfo='100,<50,s10,h,!,nviminfo
69b20e3348SBram Moolenaar  wv! Xviminfo
708c8b8bb5SBram Moolenaar
712a8d3b89SBram Moolenaar  unlet g:MY_GLOBAL_STRING
722a8d3b89SBram Moolenaar  unlet g:MY_GLOBAL_NUM
732a8d3b89SBram Moolenaar  unlet g:MY_GLOBAL_FLOAT
74b20e3348SBram Moolenaar  unlet g:MY_GLOBAL_DICT
75b20e3348SBram Moolenaar  unlet g:MY_GLOBAL_LIST
768c8b8bb5SBram Moolenaar  unlet g:MY_GLOBAL_BLOB
778c8b8bb5SBram Moolenaar  unlet g:MY_GLOBAL_FALSE
788c8b8bb5SBram Moolenaar  unlet g:MY_GLOBAL_TRUE
798c8b8bb5SBram Moolenaar  unlet g:MY_GLOBAL_NULL
808c8b8bb5SBram Moolenaar  unlet g:MY_GLOBAL_NONE
81*f1e7449dSYegappan Lakshmanan  unlet g:MY_GLOBAL_FUNCREF
82b20e3348SBram Moolenaar
83b20e3348SBram Moolenaar  rv! Xviminfo
842a8d3b89SBram Moolenaar  call assert_equal("Vim Editor", g:MY_GLOBAL_STRING)
852a8d3b89SBram Moolenaar  call assert_equal(345, g:MY_GLOBAL_NUM)
862a8d3b89SBram Moolenaar  call assert_equal(3.14, g:MY_GLOBAL_FLOAT)
87b20e3348SBram Moolenaar  call assert_equal(test_dict, g:MY_GLOBAL_DICT)
88b20e3348SBram Moolenaar  call assert_equal(test_list, g:MY_GLOBAL_LIST)
898c8b8bb5SBram Moolenaar  call assert_equal(test_blob, g:MY_GLOBAL_BLOB)
908c8b8bb5SBram Moolenaar  call assert_equal(test_false, g:MY_GLOBAL_FALSE)
918c8b8bb5SBram Moolenaar  call assert_equal(test_true, g:MY_GLOBAL_TRUE)
928c8b8bb5SBram Moolenaar  call assert_equal(test_null, g:MY_GLOBAL_NULL)
938c8b8bb5SBram Moolenaar  call assert_equal(test_none, g:MY_GLOBAL_NONE)
94*f1e7449dSYegappan Lakshmanan  call assert_false(exists("g:MY_GLOBAL_FUNCREF"))
95b20e3348SBram Moolenaar
9641a7f82dSYegappan Lakshmanan  " When reading global variables from viminfo, if a variable cannot be
9741a7f82dSYegappan Lakshmanan  " modified, then the value should not be changed.
9841a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_STRING
9941a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_NUM
10041a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_FLOAT
10141a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_DICT
10241a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_LIST
10341a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_BLOB
10441a7f82dSYegappan Lakshmanan
10541a7f82dSYegappan Lakshmanan  const g:MY_GLOBAL_STRING = 'New Value'
10641a7f82dSYegappan Lakshmanan  const g:MY_GLOBAL_NUM = 987
10741a7f82dSYegappan Lakshmanan  const g:MY_GLOBAL_FLOAT = 1.16
10841a7f82dSYegappan Lakshmanan  const g:MY_GLOBAL_DICT = {'editor': 'vim'}
10941a7f82dSYegappan Lakshmanan  const g:MY_GLOBAL_LIST = [5, 7, 13]
11041a7f82dSYegappan Lakshmanan  const g:MY_GLOBAL_BLOB = 0zDEADBEEF
11141a7f82dSYegappan Lakshmanan  call assert_fails('rv! Xviminfo', 'E741:')
11241a7f82dSYegappan Lakshmanan  call assert_equal('New Value', g:MY_GLOBAL_STRING)
11341a7f82dSYegappan Lakshmanan  call assert_equal(987, g:MY_GLOBAL_NUM)
11441a7f82dSYegappan Lakshmanan  call assert_equal(1.16, g:MY_GLOBAL_FLOAT)
11541a7f82dSYegappan Lakshmanan  call assert_equal({'editor': 'vim'}, g:MY_GLOBAL_DICT)
11641a7f82dSYegappan Lakshmanan  call assert_equal([5, 7 , 13], g:MY_GLOBAL_LIST)
11741a7f82dSYegappan Lakshmanan  call assert_equal(0zDEADBEEF, g:MY_GLOBAL_BLOB)
11841a7f82dSYegappan Lakshmanan
11941a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_STRING
12041a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_NUM
12141a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_FLOAT
12241a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_DICT
12341a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_LIST
12441a7f82dSYegappan Lakshmanan  unlet g:MY_GLOBAL_BLOB
12541a7f82dSYegappan Lakshmanan
126845e0ee5SBram Moolenaar  " Test for invalid values for a blob, list, dict in a viminfo file
127845e0ee5SBram Moolenaar  call writefile([
128845e0ee5SBram Moolenaar        \ "!GLOB_BLOB_1\tBLO\t123",
129845e0ee5SBram Moolenaar        \ "!GLOB_BLOB_2\tBLO\t012",
130845e0ee5SBram Moolenaar        \ "!GLOB_BLOB_3\tBLO\t0z1x",
131845e0ee5SBram Moolenaar        \ "!GLOB_BLOB_4\tBLO\t0z12 ab",
132845e0ee5SBram Moolenaar        \ "!GLOB_LIST_1\tLIS\t1 2",
133845e0ee5SBram Moolenaar        \ "!GLOB_DICT_1\tDIC\t1 2"], 'Xviminfo')
134fae55a9cSBram Moolenaar  call assert_fails('rv! Xviminfo', 'E488:')
135845e0ee5SBram Moolenaar  call assert_equal('123', g:GLOB_BLOB_1)
136845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_BLOB_1))
137845e0ee5SBram Moolenaar  call assert_equal('012', g:GLOB_BLOB_2)
138845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_BLOB_2))
139845e0ee5SBram Moolenaar  call assert_equal('0z1x', g:GLOB_BLOB_3)
140845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_BLOB_3))
141845e0ee5SBram Moolenaar  call assert_equal('0z12 ab', g:GLOB_BLOB_4)
142845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_BLOB_4))
143845e0ee5SBram Moolenaar  call assert_equal('1 2', g:GLOB_LIST_1)
144845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_LIST_1))
145845e0ee5SBram Moolenaar  call assert_equal('1 2', g:GLOB_DICT_1)
146845e0ee5SBram Moolenaar  call assert_equal(1, type(g:GLOB_DICT_1))
147845e0ee5SBram Moolenaar
148b20e3348SBram Moolenaar  call delete('Xviminfo')
149b20e3348SBram Moolenaar  set viminfo-=!
150b20e3348SBram Moolenaarendfunc
15145d2eeaaSBram Moolenaar
1525b157fe2SBram Moolenaarfunc Test_global_vars_with_circular_reference()
1535b157fe2SBram Moolenaar  let g:MY_GLOBAL_LIST = []
1545b157fe2SBram Moolenaar  call add(g:MY_GLOBAL_LIST, g:MY_GLOBAL_LIST)
1555b157fe2SBram Moolenaar  let g:MY_GLOBAL_DICT = {}
1565b157fe2SBram Moolenaar  let g:MY_GLOBAL_DICT['self'] = g:MY_GLOBAL_DICT
1575b157fe2SBram Moolenaar
1585b157fe2SBram Moolenaar  set viminfo='100,<50,s10,h,!,nviminfo
1595b157fe2SBram Moolenaar  wv! Xviminfo
1605b157fe2SBram Moolenaar  call assert_equal(v:errmsg, '')
1615b157fe2SBram Moolenaar
1625b157fe2SBram Moolenaar  unlet g:MY_GLOBAL_LIST
1635b157fe2SBram Moolenaar  unlet g:MY_GLOBAL_DICT
1645b157fe2SBram Moolenaar
1655b157fe2SBram Moolenaar  rv! Xviminfo
1665b157fe2SBram Moolenaar  call assert_equal(v:errmsg, '')
1675b157fe2SBram Moolenaar  call assert_true(!exists('g:MY_GLOBAL_LIST'))
1685b157fe2SBram Moolenaar  call assert_true(!exists('g:MY_GLOBAL_DICT'))
1695b157fe2SBram Moolenaar
1705b157fe2SBram Moolenaar  call delete('Xviminfo')
1715b157fe2SBram Moolenaar  set viminfo-=!
1725b157fe2SBram Moolenaarendfunc
1735b157fe2SBram Moolenaar
17445d2eeaaSBram Moolenaarfunc Test_cmdline_history()
17545d2eeaaSBram Moolenaar  call histdel(':')
17645d2eeaaSBram Moolenaar  call test_settime(11)
17745d2eeaaSBram Moolenaar  call histadd(':', "echo 'one'")
17845d2eeaaSBram Moolenaar  call test_settime(12)
17945d2eeaaSBram Moolenaar  " split into two lines
18045d2eeaaSBram Moolenaar  let long800 = repeat(" 'eight'", 100)
18145d2eeaaSBram Moolenaar  call histadd(':', "echo " . long800)
18245d2eeaaSBram Moolenaar  call test_settime(13)
18345d2eeaaSBram Moolenaar  " split into three lines
18445d2eeaaSBram Moolenaar  let long1400 = repeat(" 'fourteeeeen'", 100)
18545d2eeaaSBram Moolenaar  call histadd(':', "echo " . long1400)
18645d2eeaaSBram Moolenaar  wviminfo Xviminfo
18745d2eeaaSBram Moolenaar  let lines = readfile('Xviminfo')
18845d2eeaaSBram Moolenaar  let done_colon = 0
18945d2eeaaSBram Moolenaar  let done_bar = 0
19045d2eeaaSBram Moolenaar  let lnum = 0
19145d2eeaaSBram Moolenaar  while lnum < len(lines)
19245d2eeaaSBram Moolenaar    let line = lines[lnum] | let lnum += 1
19345d2eeaaSBram Moolenaar    if line[0] == ':'
19445d2eeaaSBram Moolenaar      if done_colon == 0
19545d2eeaaSBram Moolenaar	call assert_equal(":\x161408", line)
19645d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
19745d2eeaaSBram Moolenaar	call assert_equal('<echo ' . long1400, line)
19845d2eeaaSBram Moolenaar      elseif done_colon == 1
19945d2eeaaSBram Moolenaar	call assert_equal(":\x16808", line)
20045d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
20145d2eeaaSBram Moolenaar	call assert_equal("<echo " . long800, line)
20245d2eeaaSBram Moolenaar      elseif done_colon == 2
20345d2eeaaSBram Moolenaar	call assert_equal(":echo 'one'", line)
20445d2eeaaSBram Moolenaar      endif
20545d2eeaaSBram Moolenaar      let done_colon += 1
20645d2eeaaSBram Moolenaar    elseif line[0:4] == '|2,0,'
20745d2eeaaSBram Moolenaar      if done_bar == 0
20845d2eeaaSBram Moolenaar	call assert_equal("|2,0,13,,>1407", line)
20945d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
21045d2eeaaSBram Moolenaar	call assert_equal('|<"echo ' . long1400[0:484], line)
21145d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
21245d2eeaaSBram Moolenaar	call assert_equal('|<' . long1400[485:974], line)
21345d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
21445d2eeaaSBram Moolenaar	call assert_equal('|<' . long1400[975:] . '"', line)
21545d2eeaaSBram Moolenaar      elseif done_bar == 1
21645d2eeaaSBram Moolenaar	call assert_equal('|2,0,12,,>807', line)
21745d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
21845d2eeaaSBram Moolenaar	call assert_equal('|<"echo ' . long800[0:484], line)
21945d2eeaaSBram Moolenaar	let line = lines[lnum] | let lnum += 1
22045d2eeaaSBram Moolenaar	call assert_equal('|<' . long800[485:] . '"', line)
22145d2eeaaSBram Moolenaar      elseif done_bar == 2
22245d2eeaaSBram Moolenaar	call assert_equal("|2,0,11,,\"echo 'one'\"", line)
22345d2eeaaSBram Moolenaar      endif
22445d2eeaaSBram Moolenaar      let done_bar += 1
22545d2eeaaSBram Moolenaar    endif
22645d2eeaaSBram Moolenaar  endwhile
22745d2eeaaSBram Moolenaar  call assert_equal(3, done_colon)
22845d2eeaaSBram Moolenaar  call assert_equal(3, done_bar)
22945d2eeaaSBram Moolenaar
23045d2eeaaSBram Moolenaar  call histdel(':')
23145d2eeaaSBram Moolenaar  rviminfo Xviminfo
23245d2eeaaSBram Moolenaar  call assert_equal("echo " . long1400, histget(':', -1))
23345d2eeaaSBram Moolenaar  call assert_equal("echo " . long800, histget(':', -2))
23445d2eeaaSBram Moolenaar  call assert_equal("echo 'one'", histget(':', -3))
23545d2eeaaSBram Moolenaar
236*f1e7449dSYegappan Lakshmanan  " If the value for the '/' or ':' or '@' field in 'viminfo' is zero, then
237*f1e7449dSYegappan Lakshmanan  " the corresponding history entries are not saved.
238*f1e7449dSYegappan Lakshmanan  set viminfo='100,/0,:0,@0,<50,s10,h,!,nviminfo
239*f1e7449dSYegappan Lakshmanan  call histdel('/')
240*f1e7449dSYegappan Lakshmanan  call histdel(':')
241*f1e7449dSYegappan Lakshmanan  call histdel('@')
242*f1e7449dSYegappan Lakshmanan  call histadd('/', 'foo')
243*f1e7449dSYegappan Lakshmanan  call histadd(':', 'bar')
244*f1e7449dSYegappan Lakshmanan  call histadd('@', 'baz')
245*f1e7449dSYegappan Lakshmanan  wviminfo! Xviminfo
246*f1e7449dSYegappan Lakshmanan  call histdel('/')
247*f1e7449dSYegappan Lakshmanan  call histdel(':')
248*f1e7449dSYegappan Lakshmanan  call histdel('@')
249*f1e7449dSYegappan Lakshmanan  rviminfo! Xviminfo
250*f1e7449dSYegappan Lakshmanan  call assert_equal('', histget('/'))
251*f1e7449dSYegappan Lakshmanan  call assert_equal('', histget(':'))
252*f1e7449dSYegappan Lakshmanan  call assert_equal('', histget('@'))
253*f1e7449dSYegappan Lakshmanan
25445d2eeaaSBram Moolenaar  call delete('Xviminfo')
255*f1e7449dSYegappan Lakshmanan  set viminfo&vim
25645d2eeaaSBram Moolenaarendfunc
2571fd99c1cSBram Moolenaar
2581fd99c1cSBram Moolenaarfunc Test_cmdline_history_order()
2591fd99c1cSBram Moolenaar  call histdel(':')
2601fd99c1cSBram Moolenaar  call test_settime(11)
2611fd99c1cSBram Moolenaar  call histadd(':', "echo '11'")
2621fd99c1cSBram Moolenaar  call test_settime(22)
2631fd99c1cSBram Moolenaar  call histadd(':', "echo '22'")
2641fd99c1cSBram Moolenaar  call test_settime(33)
2651fd99c1cSBram Moolenaar  call histadd(':', "echo '33'")
2661fd99c1cSBram Moolenaar  wviminfo Xviminfo
2671fd99c1cSBram Moolenaar
2681fd99c1cSBram Moolenaar  call histdel(':')
2691fd99c1cSBram Moolenaar  " items go in between
2701fd99c1cSBram Moolenaar  call test_settime(15)
2711fd99c1cSBram Moolenaar  call histadd(':', "echo '15'")
2721fd99c1cSBram Moolenaar  call test_settime(27)
2731fd99c1cSBram Moolenaar  call histadd(':', "echo '27'")
2741fd99c1cSBram Moolenaar
2751fd99c1cSBram Moolenaar  rviminfo Xviminfo
2761fd99c1cSBram Moolenaar  call assert_equal("echo '33'", histget(':', -1))
2771fd99c1cSBram Moolenaar  call assert_equal("echo '27'", histget(':', -2))
2781fd99c1cSBram Moolenaar  call assert_equal("echo '22'", histget(':', -3))
2791fd99c1cSBram Moolenaar  call assert_equal("echo '15'", histget(':', -4))
2801fd99c1cSBram Moolenaar  call assert_equal("echo '11'", histget(':', -5))
2811fd99c1cSBram Moolenaar
2821fd99c1cSBram Moolenaar  call histdel(':')
2831fd99c1cSBram Moolenaar  " items go before and after
284ce90e36fSBram Moolenaar  eval 8->test_settime()
2851fd99c1cSBram Moolenaar  call histadd(':', "echo '8'")
2861fd99c1cSBram Moolenaar  call test_settime(39)
2871fd99c1cSBram Moolenaar  call histadd(':', "echo '39'")
2881fd99c1cSBram Moolenaar
2891fd99c1cSBram Moolenaar  rviminfo Xviminfo
2901fd99c1cSBram Moolenaar  call assert_equal("echo '39'", histget(':', -1))
2911fd99c1cSBram Moolenaar  call assert_equal("echo '33'", histget(':', -2))
2921fd99c1cSBram Moolenaar  call assert_equal("echo '22'", histget(':', -3))
2931fd99c1cSBram Moolenaar  call assert_equal("echo '11'", histget(':', -4))
2941fd99c1cSBram Moolenaar  call assert_equal("echo '8'", histget(':', -5))
2951fd99c1cSBram Moolenaar
2961fd99c1cSBram Moolenaar  " Check sorting works when writing with merge.
2971fd99c1cSBram Moolenaar  call histdel(':')
2981fd99c1cSBram Moolenaar  call test_settime(8)
2991fd99c1cSBram Moolenaar  call histadd(':', "echo '8'")
3001fd99c1cSBram Moolenaar  call test_settime(15)
3011fd99c1cSBram Moolenaar  call histadd(':', "echo '15'")
3021fd99c1cSBram Moolenaar  call test_settime(27)
3031fd99c1cSBram Moolenaar  call histadd(':', "echo '27'")
3041fd99c1cSBram Moolenaar  call test_settime(39)
3051fd99c1cSBram Moolenaar  call histadd(':', "echo '39'")
3061fd99c1cSBram Moolenaar  wviminfo Xviminfo
3071fd99c1cSBram Moolenaar
3081fd99c1cSBram Moolenaar  call histdel(':')
3091fd99c1cSBram Moolenaar  rviminfo Xviminfo
3101fd99c1cSBram Moolenaar  call assert_equal("echo '39'", histget(':', -1))
3111fd99c1cSBram Moolenaar  call assert_equal("echo '33'", histget(':', -2))
3121fd99c1cSBram Moolenaar  call assert_equal("echo '27'", histget(':', -3))
3131fd99c1cSBram Moolenaar  call assert_equal("echo '22'", histget(':', -4))
3141fd99c1cSBram Moolenaar  call assert_equal("echo '15'", histget(':', -5))
3151fd99c1cSBram Moolenaar  call assert_equal("echo '11'", histget(':', -6))
3161fd99c1cSBram Moolenaar  call assert_equal("echo '8'", histget(':', -7))
3171fd99c1cSBram Moolenaar
3181fd99c1cSBram Moolenaar  call delete('Xviminfo')
3191fd99c1cSBram Moolenaarendfunc
32001227093SBram Moolenaar
321e80ff744SBram Moolenaarfunc Test_viminfo_registers()
322e80ff744SBram Moolenaar  call test_settime(8)
323e80ff744SBram Moolenaar  call setreg('a', "eight", 'c')
324e80ff744SBram Moolenaar  call test_settime(20)
325e80ff744SBram Moolenaar  call setreg('b', ["twenty", "again"], 'l')
326e80ff744SBram Moolenaar  call test_settime(40)
327e80ff744SBram Moolenaar  call setreg('c', ["four", "agai"], 'b4')
328e80ff744SBram Moolenaar  let l = []
329e80ff744SBram Moolenaar  set viminfo='100,<600,s10,h,!,nviminfo
330e80ff744SBram Moolenaar  for i in range(500)
331e80ff744SBram Moolenaar    call add(l, 'something')
332e80ff744SBram Moolenaar  endfor
333e80ff744SBram Moolenaar  call setreg('d', l, 'l')
3342a8d3b89SBram Moolenaar  call setreg('e', "abc\<C-V>xyz")
335e80ff744SBram Moolenaar  wviminfo Xviminfo
336e80ff744SBram Moolenaar
337e80ff744SBram Moolenaar  call test_settime(10)
338e80ff744SBram Moolenaar  call setreg('a', '', 'b10')
339e80ff744SBram Moolenaar  call test_settime(15)
340e80ff744SBram Moolenaar  call setreg('b', 'drop')
341e80ff744SBram Moolenaar  call test_settime(50)
342e80ff744SBram Moolenaar  call setreg('c', 'keep', 'l')
343e80ff744SBram Moolenaar  call test_settime(30)
344e80ff744SBram Moolenaar  call setreg('d', 'drop', 'l')
3452a8d3b89SBram Moolenaar  call setreg('e', 'drop')
346e80ff744SBram Moolenaar  rviminfo Xviminfo
347e80ff744SBram Moolenaar
348e80ff744SBram Moolenaar  call assert_equal("", getreg('a'))
349e80ff744SBram Moolenaar  call assert_equal("\<C-V>10", getregtype('a'))
350e80ff744SBram Moolenaar  call assert_equal("twenty\nagain\n", getreg('b'))
351e80ff744SBram Moolenaar  call assert_equal("V", getregtype('b'))
352e80ff744SBram Moolenaar  call assert_equal("keep\n", getreg('c'))
353e80ff744SBram Moolenaar  call assert_equal("V", getregtype('c'))
354e80ff744SBram Moolenaar  call assert_equal(l, getreg('d', 1, 1))
355e80ff744SBram Moolenaar  call assert_equal("V", getregtype('d'))
3562a8d3b89SBram Moolenaar  call assert_equal("abc\<C-V>xyz", getreg('e'))
357e80ff744SBram Moolenaar
35825709576SBram Moolenaar  " Length around 440 switches to line continuation.
35925709576SBram Moolenaar  let len = 434
36025709576SBram Moolenaar  while len < 445
36125709576SBram Moolenaar    let s = repeat('a', len)
36225709576SBram Moolenaar    call setreg('"', s)
36325709576SBram Moolenaar    wviminfo Xviminfo
36425709576SBram Moolenaar    call setreg('"', '')
36525709576SBram Moolenaar    rviminfo Xviminfo
36625709576SBram Moolenaar    call assert_equal(s, getreg('"'), 'wrong register at length: ' . len)
36725709576SBram Moolenaar
36825709576SBram Moolenaar    let len += 1
36925709576SBram Moolenaar  endwhile
37025709576SBram Moolenaar
371*f1e7449dSYegappan Lakshmanan  " If the maximum number of lines saved for a register ('<' in 'viminfo') is
372*f1e7449dSYegappan Lakshmanan  " zero, then register values should not be saved.
373*f1e7449dSYegappan Lakshmanan  let @a = 'abc'
374*f1e7449dSYegappan Lakshmanan  set viminfo='100,<0,s10,h,!,nviminfo
375*f1e7449dSYegappan Lakshmanan  wviminfo Xviminfo
376*f1e7449dSYegappan Lakshmanan  let @a = 'xyz'
377*f1e7449dSYegappan Lakshmanan  rviminfo! Xviminfo
378*f1e7449dSYegappan Lakshmanan  call assert_equal('xyz', @a)
379*f1e7449dSYegappan Lakshmanan  " repeat the test with '"' instead of '<'
380*f1e7449dSYegappan Lakshmanan  let @b = 'def'
381*f1e7449dSYegappan Lakshmanan  set viminfo='100,\"0,s10,h,!,nviminfo
382*f1e7449dSYegappan Lakshmanan  wviminfo Xviminfo
383*f1e7449dSYegappan Lakshmanan  let @b = 'rst'
384*f1e7449dSYegappan Lakshmanan  rviminfo! Xviminfo
385*f1e7449dSYegappan Lakshmanan  call assert_equal('rst', @b)
386*f1e7449dSYegappan Lakshmanan
387*f1e7449dSYegappan Lakshmanan  " If the maximum size of an item ('s' in 'viminfo') is zero, then register
388*f1e7449dSYegappan Lakshmanan  " values should not be saved.
389*f1e7449dSYegappan Lakshmanan  let @c = '123'
390*f1e7449dSYegappan Lakshmanan  set viminfo='100,<20,s0,h,!,nviminfo
391*f1e7449dSYegappan Lakshmanan  wviminfo Xviminfo
392*f1e7449dSYegappan Lakshmanan  let @c = '456'
393*f1e7449dSYegappan Lakshmanan  rviminfo! Xviminfo
394*f1e7449dSYegappan Lakshmanan  call assert_equal('456', @c)
395*f1e7449dSYegappan Lakshmanan
396e80ff744SBram Moolenaar  call delete('Xviminfo')
397*f1e7449dSYegappan Lakshmanan  set viminfo&vim
398e80ff744SBram Moolenaarendfunc
399e80ff744SBram Moolenaar
4002d358997SBram Moolenaarfunc Test_viminfo_marks()
4012d358997SBram Moolenaar  sp bufa
4022d358997SBram Moolenaar  let bufa = bufnr('%')
4032d358997SBram Moolenaar  sp bufb
4042d358997SBram Moolenaar  let bufb = bufnr('%')
4052d358997SBram Moolenaar
4062d358997SBram Moolenaar  call test_settime(8)
4072d358997SBram Moolenaar  call setpos("'A", [bufa, 1, 1, 0])
4082d358997SBram Moolenaar  call test_settime(20)
4092d358997SBram Moolenaar  call setpos("'B", [bufb, 9, 1, 0])
4102d358997SBram Moolenaar  call setpos("'C", [bufa, 7, 1, 0])
4112d358997SBram Moolenaar
4122d358997SBram Moolenaar  delmark 0-9
4132d358997SBram Moolenaar  call test_settime(25)
4142d358997SBram Moolenaar  call setpos("'1", [bufb, 12, 1, 0])
4152d358997SBram Moolenaar  call test_settime(35)
4162d358997SBram Moolenaar  call setpos("'0", [bufa, 11, 1, 0])
4172d358997SBram Moolenaar
4182d358997SBram Moolenaar  call test_settime(45)
4192d358997SBram Moolenaar  wviminfo Xviminfo
4202d358997SBram Moolenaar
4212d358997SBram Moolenaar  " Writing viminfo inserts the '0 mark.
4222d358997SBram Moolenaar  call assert_equal([bufb, 1, 1, 0], getpos("'0"))
4232d358997SBram Moolenaar  call assert_equal([bufa, 11, 1, 0], getpos("'1"))
4242d358997SBram Moolenaar  call assert_equal([bufb, 12, 1, 0], getpos("'2"))
4252d358997SBram Moolenaar
4262d358997SBram Moolenaar  call test_settime(4)
4272d358997SBram Moolenaar  call setpos("'A", [bufa, 9, 1, 0])
4282d358997SBram Moolenaar  call test_settime(30)
4292d358997SBram Moolenaar  call setpos("'B", [bufb, 2, 3, 0])
4302d358997SBram Moolenaar  delmark C
4312d358997SBram Moolenaar
4322d358997SBram Moolenaar  delmark 0-9
4332d358997SBram Moolenaar  call test_settime(30)
4342d358997SBram Moolenaar  call setpos("'1", [bufb, 22, 1, 0])
4352d358997SBram Moolenaar  call test_settime(55)
4362d358997SBram Moolenaar  call setpos("'0", [bufa, 21, 1, 0])
4372d358997SBram Moolenaar
4382d358997SBram Moolenaar  rviminfo Xviminfo
4392d358997SBram Moolenaar
4402d358997SBram Moolenaar  call assert_equal([bufa, 1, 1, 0], getpos("'A"))
4412d358997SBram Moolenaar  call assert_equal([bufb, 2, 3, 0], getpos("'B"))
4422d358997SBram Moolenaar  call assert_equal([bufa, 7, 1, 0], getpos("'C"))
4432d358997SBram Moolenaar
4442d358997SBram Moolenaar  " numbered marks are merged
4452d358997SBram Moolenaar  call assert_equal([bufa, 21, 1, 0], getpos("'0"))  " time 55
4462d358997SBram Moolenaar  call assert_equal([bufb, 1, 1, 0], getpos("'1"))  " time 45
4472d358997SBram Moolenaar  call assert_equal([bufa, 11, 1, 0], getpos("'2")) " time 35
4482d358997SBram Moolenaar  call assert_equal([bufb, 22, 1, 0], getpos("'3")) " time 30
4492d358997SBram Moolenaar  call assert_equal([bufb, 12, 1, 0], getpos("'4")) " time 25
4502d358997SBram Moolenaar
4518cd6cd80SBram Moolenaar  " deleted file marks are removed from viminfo
4528cd6cd80SBram Moolenaar  delmark C
4538cd6cd80SBram Moolenaar  wviminfo Xviminfo
4548cd6cd80SBram Moolenaar  rviminfo Xviminfo
4558cd6cd80SBram Moolenaar  call assert_equal([0, 0, 0, 0], getpos("'C"))
4568cd6cd80SBram Moolenaar
4578cd6cd80SBram Moolenaar  " deleted file marks stay in viminfo if defined in another vim later
4588cd6cd80SBram Moolenaar  call test_settime(70)
4598cd6cd80SBram Moolenaar  call setpos("'D", [bufb, 8, 1, 0])
4608cd6cd80SBram Moolenaar  wviminfo Xviminfo
4618cd6cd80SBram Moolenaar  call test_settime(65)
4628cd6cd80SBram Moolenaar  delmark D
4638cd6cd80SBram Moolenaar  call assert_equal([0, 0, 0, 0], getpos("'D"))
4648cd6cd80SBram Moolenaar  call test_settime(75)
4658cd6cd80SBram Moolenaar  rviminfo Xviminfo
4668cd6cd80SBram Moolenaar  call assert_equal([bufb, 8, 1, 0], getpos("'D"))
4678cd6cd80SBram Moolenaar
4682d358997SBram Moolenaar  call delete('Xviminfo')
4692d358997SBram Moolenaar  exe 'bwipe ' . bufa
4702d358997SBram Moolenaar  exe 'bwipe ' . bufb
4712d358997SBram Moolenaarendfunc
4722d358997SBram Moolenaar
4732d358997SBram Moolenaarfunc Test_viminfo_jumplist()
4742d358997SBram Moolenaar  split testbuf
4752d358997SBram Moolenaar  clearjumps
4762d358997SBram Moolenaar  call setline(1, ['time 05', 'time 10', 'time 15', 'time 20', 'time 30', 'last pos'])
4772d358997SBram Moolenaar  call cursor(2, 1)
4782d358997SBram Moolenaar  call test_settime(10)
4792d358997SBram Moolenaar  exe "normal /20\r"
4802d358997SBram Moolenaar  call test_settime(20)
4812d358997SBram Moolenaar  exe "normal /30\r"
4822d358997SBram Moolenaar  call test_settime(30)
4832d358997SBram Moolenaar  exe "normal /last pos\r"
4842d358997SBram Moolenaar  wviminfo Xviminfo
4852d358997SBram Moolenaar
4862d358997SBram Moolenaar  clearjumps
4872d358997SBram Moolenaar  call cursor(1, 1)
4882d358997SBram Moolenaar  call test_settime(5)
4892d358997SBram Moolenaar  exe "normal /15\r"
4902d358997SBram Moolenaar  call test_settime(15)
4912d358997SBram Moolenaar  exe "normal /last pos\r"
4922d358997SBram Moolenaar  call test_settime(40)
4932d358997SBram Moolenaar  exe "normal ?30\r"
4942d358997SBram Moolenaar  rviminfo Xviminfo
4952d358997SBram Moolenaar
4962d358997SBram Moolenaar  call assert_equal('time 30', getline('.'))
4972d358997SBram Moolenaar  exe "normal \<C-O>"
4982d358997SBram Moolenaar  call assert_equal('last pos', getline('.'))
4992d358997SBram Moolenaar  exe "normal \<C-O>"
5002d358997SBram Moolenaar  " duplicate for 'time 30' was removed
5012d358997SBram Moolenaar  call assert_equal('time 20', getline('.'))
5022d358997SBram Moolenaar  exe "normal \<C-O>"
5032d358997SBram Moolenaar  call assert_equal('time 15', getline('.'))
5042d358997SBram Moolenaar  exe "normal \<C-O>"
5052d358997SBram Moolenaar  call assert_equal('time 10', getline('.'))
5062d358997SBram Moolenaar  exe "normal \<C-O>"
5072d358997SBram Moolenaar  call assert_equal('time 05', getline('.'))
5082d358997SBram Moolenaar
509ece74ab1SBram Moolenaar  clearjumps
510ece74ab1SBram Moolenaar  call cursor(1, 1)
511ece74ab1SBram Moolenaar  call test_settime(5)
512ece74ab1SBram Moolenaar  exe "normal /15\r"
513ece74ab1SBram Moolenaar  call test_settime(15)
514ece74ab1SBram Moolenaar  exe "normal /last pos\r"
515ece74ab1SBram Moolenaar  call test_settime(40)
516ece74ab1SBram Moolenaar  exe "normal ?30\r"
517ece74ab1SBram Moolenaar  " Test merge when writing
518ece74ab1SBram Moolenaar  wviminfo Xviminfo
519ece74ab1SBram Moolenaar  clearjumps
520ece74ab1SBram Moolenaar  rviminfo Xviminfo
521ece74ab1SBram Moolenaar
52228607ba2SBram Moolenaar  let last_line = line('.')
523ece74ab1SBram Moolenaar  exe "normal \<C-O>"
524ece74ab1SBram Moolenaar  call assert_equal('time 30', getline('.'))
525ece74ab1SBram Moolenaar  exe "normal \<C-O>"
526ece74ab1SBram Moolenaar  call assert_equal('last pos', getline('.'))
527ece74ab1SBram Moolenaar  exe "normal \<C-O>"
528ece74ab1SBram Moolenaar  " duplicate for 'time 30' was removed
529ece74ab1SBram Moolenaar  call assert_equal('time 20', getline('.'))
530ece74ab1SBram Moolenaar  exe "normal \<C-O>"
531ece74ab1SBram Moolenaar  call assert_equal('time 15', getline('.'))
532ece74ab1SBram Moolenaar  exe "normal \<C-O>"
533ece74ab1SBram Moolenaar  call assert_equal('time 10', getline('.'))
534ece74ab1SBram Moolenaar  exe "normal \<C-O>"
535ece74ab1SBram Moolenaar  call assert_equal('time 05', getline('.'))
536ece74ab1SBram Moolenaar
53728607ba2SBram Moolenaar  " Test with jumplist full.
53828607ba2SBram Moolenaar  clearjumps
53928607ba2SBram Moolenaar  call setline(1, repeat(['match here'], 101))
54028607ba2SBram Moolenaar  call cursor(1, 1)
54128607ba2SBram Moolenaar  call test_settime(10)
54228607ba2SBram Moolenaar  for i in range(100)
54328607ba2SBram Moolenaar    exe "normal /here\r"
54428607ba2SBram Moolenaar  endfor
54528607ba2SBram Moolenaar  rviminfo Xviminfo
54628607ba2SBram Moolenaar
54728607ba2SBram Moolenaar  " must be newest mark that comes from viminfo.
54828607ba2SBram Moolenaar  exe "normal \<C-O>"
54928607ba2SBram Moolenaar  call assert_equal(last_line, line('.'))
55028607ba2SBram Moolenaar
5512d358997SBram Moolenaar  bwipe!
5522d358997SBram Moolenaar  call delete('Xviminfo')
5532d358997SBram Moolenaarendfunc
5542d358997SBram Moolenaar
55501227093SBram Moolenaarfunc Test_viminfo_encoding()
55601227093SBram Moolenaar  set enc=latin1
55701227093SBram Moolenaar  call histdel(':')
55801227093SBram Moolenaar  call histadd(':', "echo '\xe9'")
55901227093SBram Moolenaar  wviminfo Xviminfo
56001227093SBram Moolenaar
56101227093SBram Moolenaar  set fencs=utf-8,latin1
56201227093SBram Moolenaar  set enc=utf-8
56301227093SBram Moolenaar  sp Xviminfo
56401227093SBram Moolenaar  call assert_equal('latin1', &fenc)
56501227093SBram Moolenaar  close
56601227093SBram Moolenaar
56701227093SBram Moolenaar  call histdel(':')
56801227093SBram Moolenaar  rviminfo Xviminfo
56901227093SBram Moolenaar  call assert_equal("echo 'é'", histget(':', -1))
57001227093SBram Moolenaar
57101227093SBram Moolenaar  call delete('Xviminfo')
57201227093SBram Moolenaarendfunc
57362f8b4e1SBram Moolenaar
57462f8b4e1SBram Moolenaarfunc Test_viminfo_bad_syntax()
57562f8b4e1SBram Moolenaar  let lines = []
57662f8b4e1SBram Moolenaar  call add(lines, '|<')  " empty continuation line
57762f8b4e1SBram Moolenaar  call add(lines, '|234234234234234324,nothing')
57862f8b4e1SBram Moolenaar  call add(lines, '|1+"no comma"')
57962f8b4e1SBram Moolenaar  call add(lines, '|1,2,3,4,5,6,7')  " too many items
58062f8b4e1SBram Moolenaar  call add(lines, '|1,"string version"')
58162f8b4e1SBram Moolenaar  call add(lines, '|1,>x') " bad continuation line
58262f8b4e1SBram Moolenaar  call add(lines, '|1,"x') " missing quote
58362f8b4e1SBram Moolenaar  call add(lines, '|1,"x\') " trailing backslash
58462f8b4e1SBram Moolenaar  call add(lines, '|1,,,,') "trailing comma
58562f8b4e1SBram Moolenaar  call add(lines, '|1,>234') " trailing continuation line
58662f8b4e1SBram Moolenaar  call writefile(lines, 'Xviminfo')
587e80ff744SBram Moolenaar  rviminfo Xviminfo
58862f8b4e1SBram Moolenaar
58962f8b4e1SBram Moolenaar  call delete('Xviminfo')
59062f8b4e1SBram Moolenaarendfunc
59162f8b4e1SBram Moolenaar
592*f1e7449dSYegappan Lakshmananfunc Test_viminfo_bad_syntax2()
59341a7f82dSYegappan Lakshmanan  let lines = []
59441a7f82dSYegappan Lakshmanan  call add(lines, '|1,4')
595*f1e7449dSYegappan Lakshmanan
596*f1e7449dSYegappan Lakshmanan  " bad viminfo syntax for history barline
597*f1e7449dSYegappan Lakshmanan  call add(lines, '|2') " invalid number of fields in a history barline
598*f1e7449dSYegappan Lakshmanan  call add(lines, '|2,9,1,1,"x"') " invalid value for the history type
599*f1e7449dSYegappan Lakshmanan  call add(lines, '|2,0,,1,"x"') " no timestamp
600*f1e7449dSYegappan Lakshmanan  call add(lines, '|2,0,1,1,10') " non-string text
601*f1e7449dSYegappan Lakshmanan
602*f1e7449dSYegappan Lakshmanan  " bad viminfo syntax for register barline
603*f1e7449dSYegappan Lakshmanan  call add(lines, '|3') " invalid number of fields in a register barline
604*f1e7449dSYegappan Lakshmanan  call add(lines, '|3,1,1,1,1,,1,"x"') " missing width field
60541a7f82dSYegappan Lakshmanan  call add(lines, '|3,0,80,1,1,1,1,"x"') " invalid register number
60641a7f82dSYegappan Lakshmanan  call add(lines, '|3,0,10,5,1,1,1,"x"') " invalid register type
60741a7f82dSYegappan Lakshmanan  call add(lines, '|3,0,10,1,20,1,1,"x"') " invalid line count
60841a7f82dSYegappan Lakshmanan  call add(lines, '|3,0,10,1,0,1,1') " zero line count
609*f1e7449dSYegappan Lakshmanan
610*f1e7449dSYegappan Lakshmanan  " bad viminfo syntax for mark barline
611*f1e7449dSYegappan Lakshmanan  call add(lines, '|4') " invalid number of fields in a mark barline
612*f1e7449dSYegappan Lakshmanan  call add(lines, '|4,1,1,1,1,1') " invalid value for file name
613*f1e7449dSYegappan Lakshmanan  call add(lines, '|4,20,1,1,1,"x"') " invalid value for file name
614*f1e7449dSYegappan Lakshmanan  call add(lines, '|4,49,0,1,1,"x"') " invalid value for line number
615*f1e7449dSYegappan Lakshmanan
61641a7f82dSYegappan Lakshmanan  call writefile(lines, 'Xviminfo')
61741a7f82dSYegappan Lakshmanan  rviminfo Xviminfo
61841a7f82dSYegappan Lakshmanan  call delete('Xviminfo')
61941a7f82dSYegappan Lakshmananendfunc
62041a7f82dSYegappan Lakshmanan
621ab9c89b6SBram Moolenaarfunc Test_viminfo_file_marks()
622ab9c89b6SBram Moolenaar  silent! bwipe test_viminfo.vim
623ab9c89b6SBram Moolenaar  silent! bwipe Xviminfo
624ab9c89b6SBram Moolenaar
625ab9c89b6SBram Moolenaar  call test_settime(10)
626ab9c89b6SBram Moolenaar  edit ten
627ab9c89b6SBram Moolenaar  call test_settime(25)
628ab9c89b6SBram Moolenaar  edit again
629ab9c89b6SBram Moolenaar  call test_settime(30)
630ab9c89b6SBram Moolenaar  edit thirty
631ab9c89b6SBram Moolenaar  wviminfo Xviminfo
632ab9c89b6SBram Moolenaar
633ab9c89b6SBram Moolenaar  call test_settime(20)
634ab9c89b6SBram Moolenaar  edit twenty
635ab9c89b6SBram Moolenaar  call test_settime(35)
636ab9c89b6SBram Moolenaar  edit again
637ab9c89b6SBram Moolenaar  call test_settime(40)
638ab9c89b6SBram Moolenaar  edit fourty
639ab9c89b6SBram Moolenaar  wviminfo Xviminfo
640ab9c89b6SBram Moolenaar
641ab9c89b6SBram Moolenaar  sp Xviminfo
642ab9c89b6SBram Moolenaar  1
643ab9c89b6SBram Moolenaar  for name in ['fourty', 'again', 'thirty', 'twenty', 'ten']
644ab9c89b6SBram Moolenaar    /^>
645ab9c89b6SBram Moolenaar    call assert_equal(name, substitute(getline('.'), '.*/', '', ''))
646ab9c89b6SBram Moolenaar  endfor
647ab9c89b6SBram Moolenaar  close
648ab9c89b6SBram Moolenaar
649ab9c89b6SBram Moolenaar  call delete('Xviminfo')
650ab9c89b6SBram Moolenaarendfunc
651e59215c7SBram Moolenaar
652e59215c7SBram Moolenaarfunc Test_viminfo_file_mark_tabclose()
653e59215c7SBram Moolenaar  tabnew Xtestfileintab
654e59215c7SBram Moolenaar  call setline(1, ['a','b','c','d','e'])
655e59215c7SBram Moolenaar  4
656e59215c7SBram Moolenaar  q!
657e59215c7SBram Moolenaar  wviminfo Xviminfo
658e59215c7SBram Moolenaar  sp Xviminfo
659e59215c7SBram Moolenaar  /^> .*Xtestfileintab
660e59215c7SBram Moolenaar  let lnum = line('.')
661e59215c7SBram Moolenaar  while 1
662e59215c7SBram Moolenaar    if lnum == line('$')
66337175409SBram Moolenaar      call assert_report('mark not found in Xtestfileintab')
664e59215c7SBram Moolenaar      break
665e59215c7SBram Moolenaar    endif
666e59215c7SBram Moolenaar    let lnum += 1
667e59215c7SBram Moolenaar    let line = getline(lnum)
668e59215c7SBram Moolenaar    if line == ''
66937175409SBram Moolenaar      call assert_report('mark not found in Xtestfileintab')
670e59215c7SBram Moolenaar      break
671e59215c7SBram Moolenaar    endif
672e59215c7SBram Moolenaar    if line =~ "^\t\""
673e59215c7SBram Moolenaar      call assert_equal('4', substitute(line, ".*\"\t\\(\\d\\).*", '\1', ''))
674e59215c7SBram Moolenaar      break
675e59215c7SBram Moolenaar    endif
676e59215c7SBram Moolenaar  endwhile
677e59215c7SBram Moolenaar
678e59215c7SBram Moolenaar  call delete('Xviminfo')
679e59215c7SBram Moolenaar  silent! bwipe Xtestfileintab
680e59215c7SBram Moolenaarendfunc
681e11d61a3SBram Moolenaar
682156919f9SBram Moolenaarfunc Test_viminfo_file_mark_zero_time()
683156919f9SBram Moolenaar  let lines = [
684156919f9SBram Moolenaar	\ '# Viminfo version',
685156919f9SBram Moolenaar	\ '|1,4',
686156919f9SBram Moolenaar	\ '',
687156919f9SBram Moolenaar	\ '*encoding=utf-8',
688156919f9SBram Moolenaar	\ '',
689156919f9SBram Moolenaar	\ '# File marks:',
690156919f9SBram Moolenaar	\ "'B  1  0  /tmp/nothing",
691156919f9SBram Moolenaar	\ '|4,66,1,0,0,"/tmp/nothing"',
692156919f9SBram Moolenaar	\ "",
693156919f9SBram Moolenaar	\ ]
694156919f9SBram Moolenaar  call writefile(lines, 'Xviminfo')
695156919f9SBram Moolenaar  delmark B
696156919f9SBram Moolenaar  rviminfo Xviminfo
697156919f9SBram Moolenaar  call delete('Xviminfo')
698156919f9SBram Moolenaar  call assert_equal(1, line("'B"))
699156919f9SBram Moolenaar  delmark B
700156919f9SBram Moolenaarendfunc
701156919f9SBram Moolenaar
7022a8d3b89SBram Moolenaar" Test for saving and restoring file marks in unloaded buffers
7032a8d3b89SBram Moolenaarfunc Test_viminfo_file_mark_unloaded_buf()
7042a8d3b89SBram Moolenaar  let save_viminfo = &viminfo
7052a8d3b89SBram Moolenaar  set viminfo&vim
7062a8d3b89SBram Moolenaar  call writefile(repeat(['vim'], 10), 'Xfile1')
7072a8d3b89SBram Moolenaar  %bwipe
7082a8d3b89SBram Moolenaar  edit! Xfile1
7092a8d3b89SBram Moolenaar  call setpos("'u", [0, 3, 1, 0])
7102a8d3b89SBram Moolenaar  call setpos("'v", [0, 5, 1, 0])
7112a8d3b89SBram Moolenaar  enew
7122a8d3b89SBram Moolenaar  wviminfo Xviminfo
7132a8d3b89SBram Moolenaar  %bwipe
7142a8d3b89SBram Moolenaar  edit Xfile1
7152a8d3b89SBram Moolenaar  rviminfo! Xviminfo
7162a8d3b89SBram Moolenaar  call assert_equal([0, 3, 1, 0], getpos("'u"))
7172a8d3b89SBram Moolenaar  call assert_equal([0, 5, 1, 0], getpos("'v"))
7182a8d3b89SBram Moolenaar  %bwipe
7192a8d3b89SBram Moolenaar  call delete('Xfile1')
7202a8d3b89SBram Moolenaar  call delete('Xviminfo')
7212a8d3b89SBram Moolenaar  let &viminfo = save_viminfo
7222a8d3b89SBram Moolenaarendfunc
7232a8d3b89SBram Moolenaar
724156919f9SBram Moolenaarfunc Test_viminfo_oldfiles()
725e11d61a3SBram Moolenaar  let v:oldfiles = []
726e11d61a3SBram Moolenaar  let lines = [
727e11d61a3SBram Moolenaar	\ '# comment line',
728e11d61a3SBram Moolenaar	\ '*encoding=utf-8',
729e11d61a3SBram Moolenaar	\ '',
7302a8d3b89SBram Moolenaar	\ ':h viminfo',
7312a8d3b89SBram Moolenaar	\ '?/session',
7322a8d3b89SBram Moolenaar	\ '=myvar',
7332a8d3b89SBram Moolenaar	\ '@123',
7342a8d3b89SBram Moolenaar	\ '',
7352a8d3b89SBram Moolenaar	\ "'E  2  0  /tmp/nothing",
7362a8d3b89SBram Moolenaar	\ '',
737e11d61a3SBram Moolenaar	\ "> /tmp/file_one.txt",
738e11d61a3SBram Moolenaar	\ "\t\"\t11\t0",
739e11d61a3SBram Moolenaar	\ "",
740e11d61a3SBram Moolenaar	\ "> /tmp/file_two.txt",
741e11d61a3SBram Moolenaar	\ "\t\"\t11\t0",
742e11d61a3SBram Moolenaar	\ "",
743e11d61a3SBram Moolenaar	\ "> /tmp/another.txt",
744e11d61a3SBram Moolenaar	\ "\t\"\t11\t0",
745e11d61a3SBram Moolenaar	\ "",
746e11d61a3SBram Moolenaar	\ ]
747e11d61a3SBram Moolenaar  call writefile(lines, 'Xviminfo')
7482a8d3b89SBram Moolenaar  delmark E
7495affc034SBram Moolenaar  edit /tmp/file_two.txt
750e11d61a3SBram Moolenaar  rviminfo! Xviminfo
751e11d61a3SBram Moolenaar  call delete('Xviminfo')
752e11d61a3SBram Moolenaar
7532a8d3b89SBram Moolenaar  call assert_equal('h viminfo', histget(':'))
7542a8d3b89SBram Moolenaar  call assert_equal('session', histget('/'))
7552a8d3b89SBram Moolenaar  call assert_equal('myvar', histget('='))
7562a8d3b89SBram Moolenaar  call assert_equal('123', histget('@'))
7572a8d3b89SBram Moolenaar  call assert_equal(2, line("'E"))
7587b668e83SBram Moolenaar  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/'}))
7597b668e83SBram Moolenaar  call assert_equal(['1: /tmp/file_one.txt', '2: /tmp/file_two.txt'], filter(split(execute('filter file_ oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
7607b668e83SBram Moolenaar  call assert_equal(['3: /tmp/another.txt'], filter(split(execute('filter /another/ oldfiles'), "\n"), {i, v -> v =~ '/tmp/'}))
7615328cb89SBram Moolenaar
7625328cb89SBram Moolenaar  new
7635328cb89SBram Moolenaar  call feedkeys("3\<CR>", 't')
7645328cb89SBram Moolenaar  browse oldfiles
7655328cb89SBram Moolenaar  call assert_equal("/tmp/another.txt", expand("%"))
7665328cb89SBram Moolenaar  bwipe
7672a8d3b89SBram Moolenaar  delmark E
7682a8d3b89SBram Moolenaarendfunc
7692a8d3b89SBram Moolenaar
7702a8d3b89SBram Moolenaar" Test for storing and restoring buffer list in 'viminfo'
7712a8d3b89SBram Moolenaarfunc Test_viminfo_bufferlist()
7722a8d3b89SBram Moolenaar  " If there are arguments, then :rviminfo doesn't read the buffer list.
7732a8d3b89SBram Moolenaar  " Need to delete all the arguments for :rviminfo to work.
7742a8d3b89SBram Moolenaar  %argdelete
77541a7f82dSYegappan Lakshmanan  set viminfo&vim
7762a8d3b89SBram Moolenaar
7772a8d3b89SBram Moolenaar  edit Xfile1
7782a8d3b89SBram Moolenaar  edit Xfile2
7792a8d3b89SBram Moolenaar  set viminfo-=%
7802a8d3b89SBram Moolenaar  wviminfo Xviminfo
7812a8d3b89SBram Moolenaar  %bwipe
7822a8d3b89SBram Moolenaar  rviminfo Xviminfo
7832a8d3b89SBram Moolenaar  call assert_equal(1, len(getbufinfo()))
7842a8d3b89SBram Moolenaar
7852a8d3b89SBram Moolenaar  edit Xfile1
7862a8d3b89SBram Moolenaar  edit Xfile2
7872a8d3b89SBram Moolenaar  set viminfo^=%
7882a8d3b89SBram Moolenaar  wviminfo Xviminfo
7892a8d3b89SBram Moolenaar  %bwipe
7902a8d3b89SBram Moolenaar  rviminfo Xviminfo
7912a8d3b89SBram Moolenaar  let l = getbufinfo()
7922a8d3b89SBram Moolenaar  call assert_equal(3, len(l))
7932a8d3b89SBram Moolenaar  call assert_equal('Xfile1', bufname(l[1].bufnr))
7942a8d3b89SBram Moolenaar  call assert_equal('Xfile2', bufname(l[2].bufnr))
7952a8d3b89SBram Moolenaar
79641a7f82dSYegappan Lakshmanan  " The quickfix, terminal, unlisted, unnamed buffers are not stored in the
79741a7f82dSYegappan Lakshmanan  " viminfo file
79841a7f82dSYegappan Lakshmanan  %bw!
79941a7f82dSYegappan Lakshmanan  edit Xfile1
80041a7f82dSYegappan Lakshmanan  new
80141a7f82dSYegappan Lakshmanan  setlocal nobuflisted
80241a7f82dSYegappan Lakshmanan  new
80341a7f82dSYegappan Lakshmanan  copen
80441a7f82dSYegappan Lakshmanan  if has('terminal')
80541a7f82dSYegappan Lakshmanan    terminal
80641a7f82dSYegappan Lakshmanan  endif
80741a7f82dSYegappan Lakshmanan  wviminfo! Xviminfo
80841a7f82dSYegappan Lakshmanan  %bwipe!
80941a7f82dSYegappan Lakshmanan  rviminfo Xviminfo
81041a7f82dSYegappan Lakshmanan  let l = getbufinfo()
81141a7f82dSYegappan Lakshmanan  call assert_equal(2, len(l))
81241a7f82dSYegappan Lakshmanan  call assert_true(bufexists('Xfile1'))
81341a7f82dSYegappan Lakshmanan
81441a7f82dSYegappan Lakshmanan  " If a count is specified for '%', then only that many buffers should be
81541a7f82dSYegappan Lakshmanan  " stored in the viminfo file.
81641a7f82dSYegappan Lakshmanan  %bw!
81741a7f82dSYegappan Lakshmanan  set viminfo&vim
81841a7f82dSYegappan Lakshmanan  new Xbuf1
81941a7f82dSYegappan Lakshmanan  new Xbuf2
82041a7f82dSYegappan Lakshmanan  set viminfo+=%1
82141a7f82dSYegappan Lakshmanan  wviminfo! Xviminfo
82241a7f82dSYegappan Lakshmanan  %bwipe!
82341a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
82441a7f82dSYegappan Lakshmanan  let l = getbufinfo()
82541a7f82dSYegappan Lakshmanan  call assert_equal(2, len(l))
82641a7f82dSYegappan Lakshmanan  call assert_true(bufexists('Xbuf1'))
82741a7f82dSYegappan Lakshmanan  call assert_false(bufexists('Xbuf2'))
82841a7f82dSYegappan Lakshmanan
8292a8d3b89SBram Moolenaar  call delete('Xviminfo')
8302a8d3b89SBram Moolenaar  %bwipe
83141a7f82dSYegappan Lakshmanan  set viminfo&vim
8322a8d3b89SBram Moolenaarendfunc
8332a8d3b89SBram Moolenaar
8342a8d3b89SBram Moolenaar" Test for errors in a viminfo file
8352a8d3b89SBram Moolenaarfunc Test_viminfo_error()
8362a8d3b89SBram Moolenaar  " Non-existing viminfo files
8372a8d3b89SBram Moolenaar  call assert_fails('rviminfo xyz', 'E195:')
8382a8d3b89SBram Moolenaar
8392a8d3b89SBram Moolenaar  " Illegal starting character
8402a8d3b89SBram Moolenaar  call writefile(["a 123"], 'Xviminfo')
8412a8d3b89SBram Moolenaar  call assert_fails('rv Xviminfo', 'E575:')
8422a8d3b89SBram Moolenaar
8432a8d3b89SBram Moolenaar  " Illegal register name in the viminfo file
8442a8d3b89SBram Moolenaar  call writefile(['"@	LINE	0'], 'Xviminfo')
8452a8d3b89SBram Moolenaar  call assert_fails('rv Xviminfo', 'E577:')
8462a8d3b89SBram Moolenaar
8472a8d3b89SBram Moolenaar  " Invalid file mark line
8482a8d3b89SBram Moolenaar  call writefile(['>', '@'], 'Xviminfo')
8492a8d3b89SBram Moolenaar  call assert_fails('rv Xviminfo', 'E576:')
8502a8d3b89SBram Moolenaar
8512a8d3b89SBram Moolenaar  " Too many errors in viminfo file
8522a8d3b89SBram Moolenaar  call writefile(repeat(["a 123"], 15), 'Xviminfo')
8539b7bf9e9SBram Moolenaar  call assert_fails('rv Xviminfo', 'E575:')
8542a8d3b89SBram Moolenaar
8552a8d3b89SBram Moolenaar  call writefile(['>'] + repeat(['@'], 10), 'Xviminfo')
8569b7bf9e9SBram Moolenaar  call assert_fails('rv Xviminfo', 'E576:')
8572a8d3b89SBram Moolenaar
8582a8d3b89SBram Moolenaar  call writefile(repeat(['"@'], 15), 'Xviminfo')
8599b7bf9e9SBram Moolenaar  call assert_fails('rv Xviminfo', 'E577:')
8602a8d3b89SBram Moolenaar
8612a8d3b89SBram Moolenaar  call delete('Xviminfo')
8622a8d3b89SBram Moolenaarendfunc
8632a8d3b89SBram Moolenaar
8642a8d3b89SBram Moolenaar" Test for saving and restoring last substitute string in viminfo
8652a8d3b89SBram Moolenaarfunc Test_viminfo_lastsub()
8662a8d3b89SBram Moolenaar  enew
8672a8d3b89SBram Moolenaar  call append(0, "blue blue blue")
8682a8d3b89SBram Moolenaar  call cursor(1, 1)
8692a8d3b89SBram Moolenaar  s/blue/green/
8702a8d3b89SBram Moolenaar  wviminfo Xviminfo
8712a8d3b89SBram Moolenaar  s/blue/yellow/
8722a8d3b89SBram Moolenaar  rviminfo! Xviminfo
8732a8d3b89SBram Moolenaar  &
8742a8d3b89SBram Moolenaar  call assert_equal("green yellow green", getline(1))
8752a8d3b89SBram Moolenaar  enew!
8762a8d3b89SBram Moolenaar  call delete('Xviminfo')
8772a8d3b89SBram Moolenaarendfunc
8782a8d3b89SBram Moolenaar
8792a8d3b89SBram Moolenaar" Test saving and restoring the register values using the older method
8802a8d3b89SBram Moolenaarfunc Test_viminfo_registers_old()
8812a8d3b89SBram Moolenaar  let lines = [
8822a8d3b89SBram Moolenaar	\ '# Viminfo version',
8832a8d3b89SBram Moolenaar	\ '|1,1',
8842a8d3b89SBram Moolenaar	\ '',
8852a8d3b89SBram Moolenaar	\ '*encoding=utf-8',
8862a8d3b89SBram Moolenaar	\ '',
8872a8d3b89SBram Moolenaar	\ '# Registers:',
8882a8d3b89SBram Moolenaar	\ '""0 CHAR  0',
8892a8d3b89SBram Moolenaar	\ '	Vim',
8902a8d3b89SBram Moolenaar	\ '"a  CHAR  0',
8912a8d3b89SBram Moolenaar	\ '	red',
89241a7f82dSYegappan Lakshmanan	\ '"c  BLOCK  0',
89341a7f82dSYegappan Lakshmanan	\ '	a',
89441a7f82dSYegappan Lakshmanan	\ '	d',
89541a7f82dSYegappan Lakshmanan	\ '"d  LINE  0',
89641a7f82dSYegappan Lakshmanan	\ '	abc',
89741a7f82dSYegappan Lakshmanan	\ '	def',
8982a8d3b89SBram Moolenaar	\ '"m@ CHAR  0',
8992a8d3b89SBram Moolenaar	\ "	:echo 'Hello'\<CR>",
9002a8d3b89SBram Moolenaar	\ "",
9012a8d3b89SBram Moolenaar	\ ]
9022a8d3b89SBram Moolenaar  call writefile(lines, 'Xviminfo')
9032a8d3b89SBram Moolenaar  let @a = 'one'
9042a8d3b89SBram Moolenaar  let @b = 'two'
9052a8d3b89SBram Moolenaar  let @m = 'three'
9062a8d3b89SBram Moolenaar  let @" = 'four'
9072a8d3b89SBram Moolenaar  let @t = ":echo 'Unix'\<CR>"
9082a8d3b89SBram Moolenaar  silent! normal @t
9092a8d3b89SBram Moolenaar  rviminfo! Xviminfo
9102a8d3b89SBram Moolenaar  call assert_equal('red', getreg('a'))
91141a7f82dSYegappan Lakshmanan  call assert_equal("v", getregtype('a'))
9122a8d3b89SBram Moolenaar  call assert_equal('two', getreg('b'))
91341a7f82dSYegappan Lakshmanan  call assert_equal("a\nd", getreg('c'))
91441a7f82dSYegappan Lakshmanan  call assert_equal("\<C-V>1", getregtype('c'))
91541a7f82dSYegappan Lakshmanan  call assert_equal("abc\ndef\n", getreg('d'))
91641a7f82dSYegappan Lakshmanan  call assert_equal("V", getregtype('d'))
9172a8d3b89SBram Moolenaar  call assert_equal(":echo 'Hello'\<CR>", getreg('m'))
9182a8d3b89SBram Moolenaar  call assert_equal('Vim', getreg('"'))
9192a8d3b89SBram Moolenaar  call assert_equal("\nHello", execute('normal @@'))
9202a8d3b89SBram Moolenaar  call delete('Xviminfo')
9212a8d3b89SBram Moolenaar  let @" = ''
9222a8d3b89SBram Moolenaarendfunc
9232a8d3b89SBram Moolenaar
9242a8d3b89SBram Moolenaar" Test for saving and restoring large number of lines in a register
9252a8d3b89SBram Moolenaarfunc Test_viminfo_large_register()
9262a8d3b89SBram Moolenaar  let save_viminfo = &viminfo
9272a8d3b89SBram Moolenaar  set viminfo&vim
9282a8d3b89SBram Moolenaar  set viminfo-=<50
9292a8d3b89SBram Moolenaar  set viminfo+=<200
9302a8d3b89SBram Moolenaar  let lines = ['"r	CHAR	0']
9312a8d3b89SBram Moolenaar  call extend(lines, repeat(["\tsun is rising"], 200))
9322a8d3b89SBram Moolenaar  call writefile(lines, 'Xviminfo')
9332a8d3b89SBram Moolenaar  let @r = ''
9342a8d3b89SBram Moolenaar  rviminfo! Xviminfo
9352a8d3b89SBram Moolenaar  call assert_equal(join(repeat(["sun is rising"], 200), "\n"), @r)
9362a8d3b89SBram Moolenaar  call delete('Xviminfo')
9376bd1d770SBram Moolenaar  let @r = ''
9382a8d3b89SBram Moolenaar  let &viminfo = save_viminfo
9392a8d3b89SBram Moolenaarendfunc
9402a8d3b89SBram Moolenaar
9412a8d3b89SBram Moolenaar" Test for setting 'viminfofile' to NONE
9422a8d3b89SBram Moolenaarfunc Test_viminfofile_none()
9436bd1d770SBram Moolenaar  let save_vif = &viminfofile
9442a8d3b89SBram Moolenaar  set viminfofile=NONE
9452a8d3b89SBram Moolenaar  wviminfo Xviminfo
9462a8d3b89SBram Moolenaar  call assert_false(filereadable('Xviminfo'))
9472a8d3b89SBram Moolenaar  call writefile([''], 'Xviminfo')
9482a8d3b89SBram Moolenaar  call assert_fails('rviminfo Xviminfo', 'E195:')
9492a8d3b89SBram Moolenaar  call delete('Xviminfo')
9506bd1d770SBram Moolenaar  let &viminfofile = save_vif
9512a8d3b89SBram Moolenaarendfunc
9522a8d3b89SBram Moolenaar
9536bd1d770SBram Moolenaar" Test for an unwritable and unreadble 'viminfo' file
9546bd1d770SBram Moolenaarfunc Test_viminfo_perm()
9556bd1d770SBram Moolenaar  CheckUnix
95607282f01SBram Moolenaar  CheckNotRoot
9572a8d3b89SBram Moolenaar  call writefile([''], 'Xviminfo')
9582a8d3b89SBram Moolenaar  call setfperm('Xviminfo', 'r-x------')
9592a8d3b89SBram Moolenaar  call assert_fails('wviminfo Xviminfo', 'E137:')
9606bd1d770SBram Moolenaar  call setfperm('Xviminfo', '--x------')
9616bd1d770SBram Moolenaar  call assert_fails('rviminfo Xviminfo', 'E195:')
9622a8d3b89SBram Moolenaar  call delete('Xviminfo')
963cde0ff39SBram Moolenaar
964cde0ff39SBram Moolenaar  " Try to write the viminfo to a directory
965cde0ff39SBram Moolenaar  call mkdir('Xdir')
966b86abadfSBram Moolenaar  call assert_fails('wviminfo Xdir', 'E137:')
967*f1e7449dSYegappan Lakshmanan  call assert_fails('rviminfo Xdir', 'E195:')
968cde0ff39SBram Moolenaar  call delete('Xdir', 'rf')
969e11d61a3SBram Moolenaarendfunc
9706bd1d770SBram Moolenaar
9716bd1d770SBram Moolenaar" Test for writing to an existing viminfo file merges the file marks
9726bd1d770SBram Moolenaarfunc XTest_viminfo_marks_merge()
9736bd1d770SBram Moolenaar  let save_viminfo = &viminfo
9746bd1d770SBram Moolenaar  set viminfo&vim
9756bd1d770SBram Moolenaar  set viminfo^=%
9766bd1d770SBram Moolenaar  enew
9776bd1d770SBram Moolenaar  %argdelete
9786bd1d770SBram Moolenaar  %bwipe
9796bd1d770SBram Moolenaar
9806bd1d770SBram Moolenaar  call writefile(repeat(['editor'], 10), 'Xbufa')
9816bd1d770SBram Moolenaar  call writefile(repeat(['Vim'], 10), 'Xbufb')
9826bd1d770SBram Moolenaar
9836bd1d770SBram Moolenaar  " set marks in buffers
9846bd1d770SBram Moolenaar  call test_settime(10)
9856bd1d770SBram Moolenaar  edit Xbufa
9866bd1d770SBram Moolenaar  4mark a
9876bd1d770SBram Moolenaar  wviminfo Xviminfo
9886bd1d770SBram Moolenaar  edit Xbufb
9896bd1d770SBram Moolenaar  4mark b
9906bd1d770SBram Moolenaar  wviminfo Xviminfo
9916bd1d770SBram Moolenaar  %bwipe
9926bd1d770SBram Moolenaar
9936bd1d770SBram Moolenaar  " set marks in buffers again
9946bd1d770SBram Moolenaar  call test_settime(20)
9956bd1d770SBram Moolenaar  edit Xbufb
9966bd1d770SBram Moolenaar  6mark b
9976bd1d770SBram Moolenaar  wviminfo Xviminfo
9986bd1d770SBram Moolenaar  edit Xbufa
9996bd1d770SBram Moolenaar  6mark a
10006bd1d770SBram Moolenaar  wviminfo Xviminfo
10016bd1d770SBram Moolenaar  %bwipe
10026bd1d770SBram Moolenaar
10036bd1d770SBram Moolenaar  " Load the buffer and check the marks
10046bd1d770SBram Moolenaar  edit Xbufa
10056bd1d770SBram Moolenaar  rviminfo! Xviminfo
10066bd1d770SBram Moolenaar  call assert_equal(6, line("'a"))
10076bd1d770SBram Moolenaar  edit Xbufb
10086bd1d770SBram Moolenaar  rviminfo! Xviminfo
10096bd1d770SBram Moolenaar  call assert_equal(6, line("'b"))
10106bd1d770SBram Moolenaar
10116bd1d770SBram Moolenaar  " cleanup
10126bd1d770SBram Moolenaar  %bwipe
10136bd1d770SBram Moolenaar  call delete('Xviminfo')
10146bd1d770SBram Moolenaar  call delete('Xbufa')
10156bd1d770SBram Moolenaar  call delete('Xbufb')
10166bd1d770SBram Moolenaar  call test_settime(0)
10176bd1d770SBram Moolenaar  let &viminfo=save_viminfo
10186bd1d770SBram Moolenaarendfunc
1019ee4e0c1eSBram Moolenaar
1020ee4e0c1eSBram Moolenaar" Test for errors in setting 'viminfo'
1021ee4e0c1eSBram Moolenaarfunc Test_viminfo_option_error()
1022ee4e0c1eSBram Moolenaar  " Missing number
1023ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=\"', 'E526:')
1024ee4e0c1eSBram Moolenaar  for c in split("'/:<@s", '\zs')
1025ee4e0c1eSBram Moolenaar    call assert_fails('set viminfo=' .. c, 'E526:')
1026ee4e0c1eSBram Moolenaar  endfor
1027ee4e0c1eSBram Moolenaar
1028ee4e0c1eSBram Moolenaar  " Missing comma
1029ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=%10!', 'E527:')
1030ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=!%10', 'E527:')
1031ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=h%10', 'E527:')
1032ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=c%10', 'E527:')
1033ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=:10%10', 'E527:')
1034ee4e0c1eSBram Moolenaar
1035ee4e0c1eSBram Moolenaar  " Missing ' setting
1036ee4e0c1eSBram Moolenaar  call assert_fails('set viminfo=%10', 'E528:')
1037ee4e0c1eSBram Moolenaarendfunc
1038ee4e0c1eSBram Moolenaar
10398e6be343SBram Moolenaarfunc Test_viminfo_oldfiles_newfile()
10408e6be343SBram Moolenaar  CheckRunVimInTerminal
10418e6be343SBram Moolenaar
10428e6be343SBram Moolenaar  let save_viminfo = &viminfo
10438e6be343SBram Moolenaar  let save_viminfofile = &viminfofile
10448e6be343SBram Moolenaar  set viminfo&vim
10458e6be343SBram Moolenaar  let v:oldfiles = []
10468e6be343SBram Moolenaar  let commands =<< trim [CODE]
10478e6be343SBram Moolenaar    set viminfofile=Xviminfofile
10488e6be343SBram Moolenaar    set viminfo&vim
10498e6be343SBram Moolenaar    w! Xnew-file.txt
10508e6be343SBram Moolenaar    qall
10518e6be343SBram Moolenaar  [CODE]
10528e6be343SBram Moolenaar  call writefile(commands, 'Xviminfotest')
10538e6be343SBram Moolenaar  let buf = RunVimInTerminal('-S Xviminfotest', #{wait_for_ruler: 0})
10548e6be343SBram Moolenaar  call WaitForAssert({-> assert_equal("finished", term_getstatus(buf))})
10558e6be343SBram Moolenaar
10568e6be343SBram Moolenaar  let &viminfofile = 'Xviminfofile'
10578e6be343SBram Moolenaar  rviminfo! Xviminfofile
10588e6be343SBram Moolenaar  call assert_match('Xnew-file.txt$', v:oldfiles[0])
10598e6be343SBram Moolenaar  call assert_equal(1, len(v:oldfiles))
10608e6be343SBram Moolenaar  call delete('Xviminfofile')
10618e6be343SBram Moolenaar  call delete('Xviminfotest')
10628e6be343SBram Moolenaar  call delete('Xnew-file.txt')
10636fd367a9SBram Moolenaar
10646fd367a9SBram Moolenaar  let v:oldfiles = test_null_list()
10656fd367a9SBram Moolenaar  call assert_equal("\nNo old files", execute('oldfiles'))
10666fd367a9SBram Moolenaar
10678e6be343SBram Moolenaar  let &viminfo = save_viminfo
10688e6be343SBram Moolenaar  let &viminfofile = save_viminfofile
10698e6be343SBram Moolenaarendfunc
10708e6be343SBram Moolenaar
107141a7f82dSYegappan Lakshmanan" When writing CTRL-V or "\n" to a viminfo file, it is converted to CTRL-V
107241a7f82dSYegappan Lakshmanan" CTRL-V and CTRL-V n respectively.
107341a7f82dSYegappan Lakshmananfunc Test_viminfo_with_Ctrl_V()
107441a7f82dSYegappan Lakshmanan  silent! exe "normal! /\<C-V>\<C-V>\n"
107541a7f82dSYegappan Lakshmanan  wviminfo Xviminfo
107641a7f82dSYegappan Lakshmanan  call assert_notequal(-1, readfile('Xviminfo')->index("?/\<C-V>\<C-V>"))
107741a7f82dSYegappan Lakshmanan  let @/ = 'abc'
107841a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
107941a7f82dSYegappan Lakshmanan  call assert_equal("\<C-V>", @/)
108041a7f82dSYegappan Lakshmanan  silent! exe "normal! /\<C-V>\<C-J>\n"
108141a7f82dSYegappan Lakshmanan  wviminfo Xviminfo
108241a7f82dSYegappan Lakshmanan  call assert_notequal(-1, readfile('Xviminfo')->index("?/\<C-V>n"))
108341a7f82dSYegappan Lakshmanan  let @/ = 'abc'
108441a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
108541a7f82dSYegappan Lakshmanan  call assert_equal("\n", @/)
108641a7f82dSYegappan Lakshmanan  call delete('Xviminfo')
108741a7f82dSYegappan Lakshmananendfunc
108841a7f82dSYegappan Lakshmanan
108941a7f82dSYegappan Lakshmanan" Test for the 'r' field in 'viminfo' (removal media)
109041a7f82dSYegappan Lakshmananfunc Test_viminfo_removable_media()
109141a7f82dSYegappan Lakshmanan  CheckUnix
109241a7f82dSYegappan Lakshmanan  if !isdirectory('/tmp') || getftype('/tmp') != 'dir'
109341a7f82dSYegappan Lakshmanan    return
109441a7f82dSYegappan Lakshmanan  endif
109541a7f82dSYegappan Lakshmanan  let save_viminfo = &viminfo
109641a7f82dSYegappan Lakshmanan  set viminfo+=r/tmp
109741a7f82dSYegappan Lakshmanan  edit /tmp/Xvima1b2c3
109841a7f82dSYegappan Lakshmanan  wviminfo Xviminfo
109941a7f82dSYegappan Lakshmanan  let matches = readfile('Xviminfo')->filter("v:val =~ 'Xvima1b2c3'")
110041a7f82dSYegappan Lakshmanan  call assert_equal(0, matches->len())
110141a7f82dSYegappan Lakshmanan  let &viminfo = save_viminfo
110241a7f82dSYegappan Lakshmanan  call delete('Xviminfo')
110341a7f82dSYegappan Lakshmananendfunc
110441a7f82dSYegappan Lakshmanan
110541a7f82dSYegappan Lakshmanan" Test for the 'h' flag in 'viminfo'. If 'h' is not present, then the last
110641a7f82dSYegappan Lakshmanan" search pattern read from 'viminfo' should be highlighted with 'hlsearch'.
110741a7f82dSYegappan Lakshmanan" If 'h' is present, then the last search pattern should not be highlighted.
110841a7f82dSYegappan Lakshmananfunc Test_viminfo_hlsearch()
110941a7f82dSYegappan Lakshmanan  set viminfo&vim
111041a7f82dSYegappan Lakshmanan
111141a7f82dSYegappan Lakshmanan  new
111241a7f82dSYegappan Lakshmanan  call setline(1, ['one two three'])
111341a7f82dSYegappan Lakshmanan  " save the screen attribute for the Search highlighted text and the normal
111441a7f82dSYegappan Lakshmanan  " text for later comparison
111541a7f82dSYegappan Lakshmanan  set hlsearch
111641a7f82dSYegappan Lakshmanan  let @/ = 'three'
111741a7f82dSYegappan Lakshmanan  redraw!
111841a7f82dSYegappan Lakshmanan  let hiSearch = screenattr(1, 9)
111941a7f82dSYegappan Lakshmanan  let hiNormal = screenattr(1, 1)
112041a7f82dSYegappan Lakshmanan
112141a7f82dSYegappan Lakshmanan  set viminfo-=h
112241a7f82dSYegappan Lakshmanan  let @/='two'
112341a7f82dSYegappan Lakshmanan  wviminfo! Xviminfo
112441a7f82dSYegappan Lakshmanan  let @/='one'
112541a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
112641a7f82dSYegappan Lakshmanan  redraw!
112741a7f82dSYegappan Lakshmanan  call assert_equal(hiSearch, screenattr(1, 5))
112841a7f82dSYegappan Lakshmanan  call assert_equal(hiSearch, screenattr(1, 6))
112941a7f82dSYegappan Lakshmanan  call assert_equal(hiSearch, screenattr(1, 7))
113041a7f82dSYegappan Lakshmanan
113141a7f82dSYegappan Lakshmanan  set viminfo+=h
113241a7f82dSYegappan Lakshmanan  let @/='two'
113341a7f82dSYegappan Lakshmanan  wviminfo! Xviminfo
113441a7f82dSYegappan Lakshmanan  let @/='one'
113541a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
113641a7f82dSYegappan Lakshmanan  redraw!
113741a7f82dSYegappan Lakshmanan  call assert_equal(hiNormal, screenattr(1, 5))
113841a7f82dSYegappan Lakshmanan  call assert_equal(hiNormal, screenattr(1, 6))
113941a7f82dSYegappan Lakshmanan  call assert_equal(hiNormal, screenattr(1, 7))
114041a7f82dSYegappan Lakshmanan
114141a7f82dSYegappan Lakshmanan  call delete('Xviminfo')
114241a7f82dSYegappan Lakshmanan  set hlsearch& viminfo&vim
114341a7f82dSYegappan Lakshmanan  bw!
114441a7f82dSYegappan Lakshmananendfunc
114541a7f82dSYegappan Lakshmanan
114641a7f82dSYegappan Lakshmanan" Test for restoring the magicness of the last search pattern from the viminfo
114741a7f82dSYegappan Lakshmanan" file.
114841a7f82dSYegappan Lakshmananfunc Test_viminfo_last_spat_magic()
114941a7f82dSYegappan Lakshmanan  set viminfo&vim
115041a7f82dSYegappan Lakshmanan  new
115141a7f82dSYegappan Lakshmanan  call setline(1, ' one abc a.c')
115241a7f82dSYegappan Lakshmanan
115341a7f82dSYegappan Lakshmanan  " restore 'nomagic'
115441a7f82dSYegappan Lakshmanan  set nomagic
115541a7f82dSYegappan Lakshmanan  exe "normal gg/a.c\<CR>"
115641a7f82dSYegappan Lakshmanan  wviminfo! Xviminfo
115741a7f82dSYegappan Lakshmanan  set magic
115841a7f82dSYegappan Lakshmanan  exe "normal gg/one\<CR>"
115941a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
116041a7f82dSYegappan Lakshmanan  exe "normal! gg/\<CR>"
116141a7f82dSYegappan Lakshmanan  call assert_equal(10, col('.'))
116241a7f82dSYegappan Lakshmanan
116341a7f82dSYegappan Lakshmanan  " restore 'magic'
116441a7f82dSYegappan Lakshmanan  set magic
116541a7f82dSYegappan Lakshmanan  exe "normal gg/a.c\<CR>"
116641a7f82dSYegappan Lakshmanan  wviminfo! Xviminfo
116741a7f82dSYegappan Lakshmanan  set nomagic
116841a7f82dSYegappan Lakshmanan  exe "normal gg/one\<CR>"
116941a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
117041a7f82dSYegappan Lakshmanan  exe "normal! gg/\<CR>"
117141a7f82dSYegappan Lakshmanan  call assert_equal(6, col('.'))
117241a7f82dSYegappan Lakshmanan
117341a7f82dSYegappan Lakshmanan  call delete('Xviminfo')
117441a7f82dSYegappan Lakshmanan  set viminfo&vim magic&
117541a7f82dSYegappan Lakshmanan  bw!
117641a7f82dSYegappan Lakshmananendfunc
117741a7f82dSYegappan Lakshmanan
117841a7f82dSYegappan Lakshmanan" Test for restoring the smartcase of the last search pattern from the viminfo
117941a7f82dSYegappan Lakshmanan" file.
118041a7f82dSYegappan Lakshmananfunc Test_viminfo_last_spat_smartcase()
118141a7f82dSYegappan Lakshmanan  new
118241a7f82dSYegappan Lakshmanan  call setline(1, ' one abc Abc')
118341a7f82dSYegappan Lakshmanan  set ignorecase smartcase
118441a7f82dSYegappan Lakshmanan
118541a7f82dSYegappan Lakshmanan  " Searching with * should disable smartcase
118641a7f82dSYegappan Lakshmanan  exe "normal! gg$b*"
118741a7f82dSYegappan Lakshmanan  wviminfo! Xviminfo
118841a7f82dSYegappan Lakshmanan  exe "normal gg/one\<CR>"
118941a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
119041a7f82dSYegappan Lakshmanan  exe "normal! gg/\<CR>"
119141a7f82dSYegappan Lakshmanan  call assert_equal(6, col('.'))
119241a7f82dSYegappan Lakshmanan
119341a7f82dSYegappan Lakshmanan  call delete('Xviminfo')
119441a7f82dSYegappan Lakshmanan  set ignorecase& smartcase& viminfo&
119541a7f82dSYegappan Lakshmanan  bw!
119641a7f82dSYegappan Lakshmananendfunc
119741a7f82dSYegappan Lakshmanan
119841a7f82dSYegappan Lakshmanan" Test for restoring the last search pattern with a line or character offset
119941a7f82dSYegappan Lakshmanan" from the viminfo file.
120041a7f82dSYegappan Lakshmananfunc Test_viminfo_last_spat_offset()
120141a7f82dSYegappan Lakshmanan  new
120241a7f82dSYegappan Lakshmanan  call setline(1, ['one', 'two', 'three', 'four', 'five'])
120341a7f82dSYegappan Lakshmanan  " line offset
120441a7f82dSYegappan Lakshmanan  exe "normal! /two/+2\<CR>"
120541a7f82dSYegappan Lakshmanan  wviminfo! Xviminfo
120641a7f82dSYegappan Lakshmanan  exe "normal gg/five\<CR>"
120741a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
120841a7f82dSYegappan Lakshmanan  exe "normal! gg/\<CR>"
120941a7f82dSYegappan Lakshmanan  call assert_equal(4, line('.'))
121041a7f82dSYegappan Lakshmanan  " character offset
121141a7f82dSYegappan Lakshmanan  exe "normal! gg/^th/e+2\<CR>"
121241a7f82dSYegappan Lakshmanan  wviminfo! Xviminfo
121341a7f82dSYegappan Lakshmanan  exe "normal gg/two\<CR>"
121441a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
121541a7f82dSYegappan Lakshmanan  exe "normal! gg/\<CR>"
121641a7f82dSYegappan Lakshmanan  call assert_equal([3, 4], [line('.'), col('.')])
121741a7f82dSYegappan Lakshmanan  call delete('Xviminfo')
121841a7f82dSYegappan Lakshmanan  bw!
121941a7f82dSYegappan Lakshmananendfunc
122041a7f82dSYegappan Lakshmanan
122141a7f82dSYegappan Lakshmanan" Test for saving and restoring the last executed register (@ command)
122241a7f82dSYegappan Lakshmanan" from the viminfo file
122341a7f82dSYegappan Lakshmananfunc Test_viminfo_last_exec_reg()
122441a7f82dSYegappan Lakshmanan  let g:val = 1
122541a7f82dSYegappan Lakshmanan  let @a = ":let g:val += 1\n"
122641a7f82dSYegappan Lakshmanan  normal! @a
122741a7f82dSYegappan Lakshmanan  wviminfo! Xviminfo
122841a7f82dSYegappan Lakshmanan  let @b = ''
122941a7f82dSYegappan Lakshmanan  normal! @b
123041a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
123141a7f82dSYegappan Lakshmanan  normal @@
123241a7f82dSYegappan Lakshmanan  call assert_equal(3, g:val)
123341a7f82dSYegappan Lakshmanan  call delete('Xviminfo')
123441a7f82dSYegappan Lakshmananendfunc
123541a7f82dSYegappan Lakshmanan
123641a7f82dSYegappan Lakshmanan" Test for merging file marks in a viminfo file
123741a7f82dSYegappan Lakshmananfunc Test_viminfo_merge_file_marks()
123841a7f82dSYegappan Lakshmanan  for [f, l, t] in [['a.txt', 5, 10], ['b.txt', 10, 20]]
123941a7f82dSYegappan Lakshmanan    call test_settime(t)
124041a7f82dSYegappan Lakshmanan    exe 'edit ' .. f
124141a7f82dSYegappan Lakshmanan    call setline(1, range(1, 20))
124241a7f82dSYegappan Lakshmanan    exe l . 'mark a'
124341a7f82dSYegappan Lakshmanan    wviminfo Xviminfo
124441a7f82dSYegappan Lakshmanan    bw!
124541a7f82dSYegappan Lakshmanan  endfor
124641a7f82dSYegappan Lakshmanan  call test_settime(30)
124741a7f82dSYegappan Lakshmanan  for [f, l] in [['a.txt', 5], ['b.txt', 10]]
124841a7f82dSYegappan Lakshmanan    exe 'edit ' .. f
124941a7f82dSYegappan Lakshmanan    rviminfo! Xviminfo
125041a7f82dSYegappan Lakshmanan    call assert_equal(l, line("'a"))
125141a7f82dSYegappan Lakshmanan    bw!
125241a7f82dSYegappan Lakshmanan  endfor
125341a7f82dSYegappan Lakshmanan  call delete('Xviminfo')
125441a7f82dSYegappan Lakshmanan  call test_settime(0)
125541a7f82dSYegappan Lakshmananendfunc
125641a7f82dSYegappan Lakshmanan
125741a7f82dSYegappan Lakshmanan" Test for merging file marks from a old viminfo file
125841a7f82dSYegappan Lakshmananfunc Test_viminfo_merge_old_filemarks()
125941a7f82dSYegappan Lakshmanan  let lines = []
126041a7f82dSYegappan Lakshmanan  call add(lines, '|1,4')
126141a7f82dSYegappan Lakshmanan  call add(lines, '> ' .. fnamemodify('a.txt', ':p:~'))
126241a7f82dSYegappan Lakshmanan  call add(lines, "\tb\t7\t0\n")
126341a7f82dSYegappan Lakshmanan  call writefile(lines, 'Xviminfo')
126441a7f82dSYegappan Lakshmanan  edit b.txt
126541a7f82dSYegappan Lakshmanan  call setline(1, range(1, 20))
126641a7f82dSYegappan Lakshmanan  12mark b
126741a7f82dSYegappan Lakshmanan  wviminfo Xviminfo
126841a7f82dSYegappan Lakshmanan  bw!
126941a7f82dSYegappan Lakshmanan  edit a.txt
127041a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
127141a7f82dSYegappan Lakshmanan  call assert_equal(7, line("'b"))
127241a7f82dSYegappan Lakshmanan  edit b.txt
127341a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
127441a7f82dSYegappan Lakshmanan  call assert_equal(12, line("'b"))
127541a7f82dSYegappan Lakshmanan  call delete('Xviminfo')
127641a7f82dSYegappan Lakshmananendfunc
127741a7f82dSYegappan Lakshmanan
127841a7f82dSYegappan Lakshmanan" Test for merging the jump list from a old viminfo file
127941a7f82dSYegappan Lakshmananfunc Test_viminfo_merge_old_jumplist()
128041a7f82dSYegappan Lakshmanan  let lines = []
128141a7f82dSYegappan Lakshmanan  call add(lines, "-'  10  1  " .. fnamemodify('a.txt', ':p:~'))
128241a7f82dSYegappan Lakshmanan  call add(lines, "-'  20  1  " .. fnamemodify('a.txt', ':p:~'))
128341a7f82dSYegappan Lakshmanan  call add(lines, "-'  30  1  " .. fnamemodify('b.txt', ':p:~'))
128441a7f82dSYegappan Lakshmanan  call add(lines, "-'  40  1  " .. fnamemodify('b.txt', ':p:~'))
128541a7f82dSYegappan Lakshmanan  call writefile(lines, 'Xviminfo')
128641a7f82dSYegappan Lakshmanan  clearjumps
128741a7f82dSYegappan Lakshmanan  rviminfo! Xviminfo
128841a7f82dSYegappan Lakshmanan  let l = getjumplist()[0]
128941a7f82dSYegappan Lakshmanan  call assert_equal([40, 30, 20, 10], [l[0].lnum, l[1].lnum, l[2].lnum,
129041a7f82dSYegappan Lakshmanan        \ l[3].lnum])
129141a7f82dSYegappan Lakshmanan  bw!
129241a7f82dSYegappan Lakshmanan  call delete('Xviminfo')
129341a7f82dSYegappan Lakshmananendfunc
129441a7f82dSYegappan Lakshmanan
1295ee4e0c1eSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1296