forked from aniani/vim
updated for version 7.3.030
Problem: Cannot store Dict and List in viminfo file. Solution: Add support for this. (Christian Brabandt)
This commit is contained in:
@@ -7530,8 +7530,9 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
! When included, save and restore global variables that start
|
! When included, save and restore global variables that start
|
||||||
with an uppercase letter, and don't contain a lowercase
|
with an uppercase letter, and don't contain a lowercase
|
||||||
letter. Thus "KEEPTHIS and "K_L_M" are stored, but "KeepThis"
|
letter. Thus "KEEPTHIS and "K_L_M" are stored, but "KeepThis"
|
||||||
and "_K_L_M" are not. Only String and Number types are
|
and "_K_L_M" are not. Nested List and Dict items may not be
|
||||||
stored.
|
read back correctly, you end up with a string representation
|
||||||
|
instead.
|
||||||
" Maximum number of lines saved for each register. Old name of
|
" Maximum number of lines saved for each register. Old name of
|
||||||
the '<' item, with the disadvantage that you need to put a
|
the '<' item, with the disadvantage that you need to put a
|
||||||
backslash before the ", otherwise it will be recognized as the
|
backslash before the ", otherwise it will be recognized as the
|
||||||
|
37
src/eval.c
37
src/eval.c
@@ -22520,18 +22520,21 @@ read_viminfo_varlist(virp, writing)
|
|||||||
if (tab != NULL)
|
if (tab != NULL)
|
||||||
{
|
{
|
||||||
*tab++ = '\0'; /* isolate the variable name */
|
*tab++ = '\0'; /* isolate the variable name */
|
||||||
if (*tab == 'S') /* string var */
|
switch (*tab)
|
||||||
type = VAR_STRING;
|
{
|
||||||
|
case 'S': type = VAR_STRING; break;
|
||||||
#ifdef FEAT_FLOAT
|
#ifdef FEAT_FLOAT
|
||||||
else if (*tab == 'F')
|
case 'F': type = VAR_FLOAT; break;
|
||||||
type = VAR_FLOAT;
|
|
||||||
#endif
|
#endif
|
||||||
|
case 'D': type = VAR_DICT; break;
|
||||||
|
case 'L': type = VAR_LIST; break;
|
||||||
|
}
|
||||||
|
|
||||||
tab = vim_strchr(tab, '\t');
|
tab = vim_strchr(tab, '\t');
|
||||||
if (tab != NULL)
|
if (tab != NULL)
|
||||||
{
|
{
|
||||||
tv.v_type = type;
|
tv.v_type = type;
|
||||||
if (type == VAR_STRING)
|
if (type == VAR_STRING || type == VAR_DICT || type == VAR_LIST)
|
||||||
tv.vval.v_string = viminfo_readstring(virp,
|
tv.vval.v_string = viminfo_readstring(virp,
|
||||||
(int)(tab - virp->vir_line + 1), TRUE);
|
(int)(tab - virp->vir_line + 1), TRUE);
|
||||||
#ifdef FEAT_FLOAT
|
#ifdef FEAT_FLOAT
|
||||||
@@ -22540,9 +22543,27 @@ read_viminfo_varlist(virp, writing)
|
|||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
tv.vval.v_number = atol((char *)tab + 1);
|
tv.vval.v_number = atol((char *)tab + 1);
|
||||||
|
if (type == VAR_DICT || type == VAR_LIST)
|
||||||
|
{
|
||||||
|
typval_T *etv = eval_expr(tv.vval.v_string, NULL);
|
||||||
|
|
||||||
|
if (etv == NULL)
|
||||||
|
/* Failed to parse back the dict or list, use it as a
|
||||||
|
* string. */
|
||||||
|
tv.v_type = VAR_STRING;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vim_free(tv.vval.v_string);
|
||||||
|
tv = *etv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
set_var(virp->vir_line + 1, &tv, FALSE);
|
set_var(virp->vir_line + 1, &tv, FALSE);
|
||||||
if (type == VAR_STRING)
|
|
||||||
|
if (tv.v_type == VAR_STRING)
|
||||||
vim_free(tv.vval.v_string);
|
vim_free(tv.vval.v_string);
|
||||||
|
else if (tv.v_type == VAR_DICT || tv.v_type == VAR_LIST)
|
||||||
|
clear_tv(&tv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22584,8 +22605,10 @@ write_viminfo_varlist(fp)
|
|||||||
case VAR_STRING: s = "STR"; break;
|
case VAR_STRING: s = "STR"; break;
|
||||||
case VAR_NUMBER: s = "NUM"; break;
|
case VAR_NUMBER: s = "NUM"; break;
|
||||||
#ifdef FEAT_FLOAT
|
#ifdef FEAT_FLOAT
|
||||||
case VAR_FLOAT: s = "FLO"; break;
|
case VAR_FLOAT: s = "FLO"; break;
|
||||||
#endif
|
#endif
|
||||||
|
case VAR_DICT: s = "DIC"; break;
|
||||||
|
case VAR_LIST: s = "LIS"; break;
|
||||||
default: continue;
|
default: continue;
|
||||||
}
|
}
|
||||||
fprintf(fp, "!%s\t%s\t", this_var->di_key, s);
|
fprintf(fp, "!%s\t%s\t", this_var->di_key, s);
|
||||||
|
@@ -27,7 +27,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
|
|||||||
test56.out test57.out test58.out test59.out test60.out \
|
test56.out test57.out test58.out test59.out test60.out \
|
||||||
test61.out test62.out test63.out test64.out test65.out \
|
test61.out test62.out test63.out test64.out test65.out \
|
||||||
test66.out test67.out test68.out test69.out test70.out \
|
test66.out test67.out test68.out test69.out test70.out \
|
||||||
test71.out test72.out test73.out
|
test71.out test72.out test73.out test74.out
|
||||||
|
|
||||||
.SUFFIXES: .in .out
|
.SUFFIXES: .in .out
|
||||||
|
|
||||||
@@ -120,3 +120,4 @@ test70.out: test70.in
|
|||||||
test71.out: test71.in
|
test71.out: test71.in
|
||||||
test72.out: test72.in
|
test72.out: test72.in
|
||||||
test73.out: test73.in
|
test73.out: test73.in
|
||||||
|
test74.out: test74.in
|
||||||
|
@@ -27,7 +27,8 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
|
|||||||
test30.out test31.out test32.out test33.out test34.out \
|
test30.out test31.out test32.out test33.out test34.out \
|
||||||
test37.out test38.out test39.out test40.out test41.out \
|
test37.out test38.out test39.out test40.out test41.out \
|
||||||
test42.out test52.out test65.out test66.out test67.out \
|
test42.out test52.out test65.out test66.out test67.out \
|
||||||
test68.out test69.out test71.out test72.out test73.out
|
test68.out test69.out test71.out test72.out test73.out \
|
||||||
|
test74.out
|
||||||
|
|
||||||
SCRIPTS32 = test50.out test70.out
|
SCRIPTS32 = test50.out test70.out
|
||||||
|
|
||||||
|
@@ -47,7 +47,8 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
|
|||||||
test30.out test31.out test32.out test33.out test34.out \
|
test30.out test31.out test32.out test33.out test34.out \
|
||||||
test37.out test38.out test39.out test40.out test41.out \
|
test37.out test38.out test39.out test40.out test41.out \
|
||||||
test42.out test52.out test65.out test66.out test67.out \
|
test42.out test52.out test65.out test66.out test67.out \
|
||||||
test68.out test69.out test71.out test72.out test72.out
|
test68.out test69.out test71.out test72.out test73.out \
|
||||||
|
test74.out
|
||||||
|
|
||||||
SCRIPTS32 = test50.out test70.out
|
SCRIPTS32 = test50.out test70.out
|
||||||
|
|
||||||
|
@@ -27,7 +27,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
|
|||||||
test56.out test57.out test58.out test59.out test60.out \
|
test56.out test57.out test58.out test59.out test60.out \
|
||||||
test61.out test62.out test63.out test64.out test65.out \
|
test61.out test62.out test63.out test64.out test65.out \
|
||||||
test66.out test67.out test68.out test69.out test70.out \
|
test66.out test67.out test68.out test69.out test70.out \
|
||||||
test71.out test72.out test73.out
|
test71.out test72.out test73.out test74.out
|
||||||
|
|
||||||
.SUFFIXES: .in .out
|
.SUFFIXES: .in .out
|
||||||
|
|
||||||
|
@@ -74,7 +74,7 @@ SCRIPT = test1.out test2.out test3.out test4.out test5.out \
|
|||||||
test56.out test57.out test60.out \
|
test56.out test57.out test60.out \
|
||||||
test61.out test62.out test63.out test64.out test65.out \
|
test61.out test62.out test63.out test64.out test65.out \
|
||||||
test66.out test67.out test68.out test69.out \
|
test66.out test67.out test68.out test69.out \
|
||||||
test71.out test72.out
|
test71.out test72.out test74.out
|
||||||
|
|
||||||
# Known problems:
|
# Known problems:
|
||||||
# Test 30: a problem around mac format - unknown reason
|
# Test 30: a problem around mac format - unknown reason
|
||||||
|
@@ -10,6 +10,7 @@ VIMPROG = ../vim
|
|||||||
# This will make testing about 10 times as slow.
|
# This will make testing about 10 times as slow.
|
||||||
# VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=15 --log-file=valgrind.$*
|
# VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=15 --log-file=valgrind.$*
|
||||||
|
|
||||||
|
|
||||||
SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
|
SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
|
||||||
test7.out test8.out test9.out test10.out test11.out \
|
test7.out test8.out test9.out test10.out test11.out \
|
||||||
test12.out test13.out test14.out test15.out test17.out \
|
test12.out test13.out test14.out test15.out test17.out \
|
||||||
@@ -23,7 +24,8 @@ SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
|
|||||||
test54.out test55.out test56.out test57.out test58.out \
|
test54.out test55.out test56.out test57.out test58.out \
|
||||||
test59.out test60.out test61.out test62.out test63.out \
|
test59.out test60.out test61.out test62.out test63.out \
|
||||||
test64.out test65.out test66.out test67.out test68.out \
|
test64.out test65.out test66.out test67.out test68.out \
|
||||||
test69.out test70.out test71.out test72.out test73.out
|
test69.out test70.out test71.out test72.out test73.out \
|
||||||
|
test74.out
|
||||||
|
|
||||||
SCRIPTS_GUI = test16.out
|
SCRIPTS_GUI = test16.out
|
||||||
|
|
||||||
|
@@ -13,7 +13,7 @@ Scripts = test1.out test2.out test3.out test4.out test5.out test6.out
|
|||||||
test33.out test34.out test35.out test36.out test37.out
|
test33.out test34.out test35.out test36.out test37.out
|
||||||
test38.out test39.out test40.out test41.out test42.out
|
test38.out test39.out test40.out test41.out test42.out
|
||||||
test43.out test44.out test45.out test46.out test47.out
|
test43.out test44.out test45.out test46.out test47.out
|
||||||
test48.out test49.out
|
test48.out test49.out test74.out
|
||||||
|
|
||||||
ScriptsGUI = test16.out
|
ScriptsGUI = test16.out
|
||||||
|
|
||||||
|
36
src/testdir/test74.in
Normal file
36
src/testdir/test74.in
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
" Tests for storing global variables in the .viminfo file vim: set ft=vim:
|
||||||
|
|
||||||
|
STARTTEST
|
||||||
|
:so small.vim
|
||||||
|
:" Do all test in a separate window to avoid E211 when we recursively
|
||||||
|
:" delete the Xfind directory during cleanup
|
||||||
|
:"
|
||||||
|
:" This will cause a few errors, do it silently.
|
||||||
|
:set visualbell
|
||||||
|
:set nocp viminfo+=!,nviminfo
|
||||||
|
:let MY_GLOBAL_DICT={'foo': 1, 'bar': 0, 'longvarible': 1000}
|
||||||
|
:" store a really long list, so line wrapping will occur in viminfo file
|
||||||
|
:let MY_GLOBAL_LIST=range(1,100)
|
||||||
|
:wv! Xviminfo
|
||||||
|
:unlet MY_GLOBAL_DICT
|
||||||
|
:unlet MY_GLOBAL_LIST
|
||||||
|
:rv! Xviminfo
|
||||||
|
:call delete('Xviminfo')
|
||||||
|
:if exists("MY_GLOBAL_DICT")
|
||||||
|
:redir >> test.out
|
||||||
|
:echo MY_GLOBAL_DICT
|
||||||
|
:redir end
|
||||||
|
:endif
|
||||||
|
:if exists("MY_GLOBAL_LIST")
|
||||||
|
:redir >> test.out
|
||||||
|
:echo MY_GLOBAL_LIST
|
||||||
|
:redir end
|
||||||
|
:endif
|
||||||
|
:redir >> test.out
|
||||||
|
:echo "foobar"
|
||||||
|
:redir end
|
||||||
|
:endif
|
||||||
|
:qa!
|
||||||
|
ENDTEST
|
||||||
|
|
||||||
|
eof
|
5
src/testdir/test74.ok
Normal file
5
src/testdir/test74.ok
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
{'foo': 1, 'longvarible': 1000, 'bar': 0}
|
||||||
|
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
|
||||||
|
|
||||||
|
foobar
|
@@ -714,6 +714,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
30,
|
||||||
/**/
|
/**/
|
||||||
29,
|
29,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user