summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/eval.c121
-rw-r--r--src/ex_cmds.c40
-rw-r--r--src/ex_cmds.h2
-rw-r--r--src/ex_docmd.c52
-rw-r--r--src/feature.h8
-rw-r--r--src/fileio.c4
-rw-r--r--src/main.c5
-rw-r--r--src/mark.c28
-rw-r--r--src/misc1.c4
-rw-r--r--src/option.c6
-rw-r--r--src/proto/eval.pro7
-rw-r--r--src/proto/ex_cmds.pro2
-rw-r--r--src/proto/mark.pro2
-rw-r--r--src/structs.h2
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h9
16 files changed, 235 insertions, 59 deletions
diff --git a/src/eval.c b/src/eval.c
index e5ed0fa520..e455cb825c 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -348,6 +348,7 @@ static struct vimvar
{VV_NAME("mouse_col", VAR_NUMBER), 0},
{VV_NAME("operator", VAR_STRING), VV_RO},
{VV_NAME("searchforward", VAR_NUMBER), 0},
+ {VV_NAME("oldfiles", VAR_LIST), 0},
};
/* shorthand */
@@ -355,6 +356,7 @@ static struct vimvar
#define vv_nr vv_di.di_tv.vval.v_number
#define vv_float vv_di.di_tv.vval.v_float
#define vv_str vv_di.di_tv.vval.v_string
+#define vv_list vv_di.di_tv.vval.v_list
#define vv_tv vv_di.di_tv
/*
@@ -426,7 +428,6 @@ static long list_find_nr __ARGS((list_T *l, long idx, int *errorp));
static long list_idx_of_item __ARGS((list_T *l, listitem_T *item));
static void list_append __ARGS((list_T *l, listitem_T *item));
static int list_append_tv __ARGS((list_T *l, typval_T *tv));
-static int list_append_string __ARGS((list_T *l, char_u *str, int len));
static int list_append_number __ARGS((list_T *l, varnumber_T n));
static int list_insert_tv __ARGS((list_T *l, typval_T *tv, listitem_T *item));
static int list_extend __ARGS((list_T *l1, list_T *l2, listitem_T *bef));
@@ -845,8 +846,13 @@ eval_clear()
p = &vimvars[i];
if (p->vv_di.di_tv.v_type == VAR_STRING)
{
- vim_free(p->vv_di.di_tv.vval.v_string);
- p->vv_di.di_tv.vval.v_string = NULL;
+ vim_free(p->vv_string);
+ p->vv_string = NULL;
+ }
+ else if (p->vv_di.di_tv.v_type == VAR_LIST)
+ {
+ list_unref(p->vv_list);
+ p->vv_list = NULL;
}
}
hash_clear(&vimvarht);
@@ -6057,6 +6063,25 @@ list_find_nr(l, idx, errorp)
}
/*
+ * Get list item "l[idx - 1]" as a string. Returns NULL for failure.
+ */
+ char_u *
+list_find_str(l, idx)
+ list_T *l;
+ long idx;
+{
+ listitem_T *li;
+
+ li = list_find(l, idx - 1);
+ if (li == NULL)
+ {
+ EMSGN(_(e_listidx), idx);
+ return NULL;
+ }
+ return get_tv_string(&li->li_tv);
+}
+
+/*
* Locate "item" list "l" and return its index.
* Returns -1 when "item" is not in the list.
*/
@@ -6147,7 +6172,7 @@ list_append_dict(list, dict)
* When "len" >= 0 use "str[len]".
* Returns FAIL when out of memory.
*/
- static int
+ int
list_append_string(l, str, len)
list_T *l;
char_u *str;
@@ -6507,6 +6532,9 @@ garbage_collect()
set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID);
}
+ /* v: vars */
+ set_ref_in_ht(&vimvarht, copyID);
+
/*
* 2. Go through the list of dicts and free items without the copyID.
*/
@@ -6597,7 +6625,7 @@ set_ref_in_item(tv, copyID)
{
case VAR_DICT:
dd = tv->vval.v_dict;
- if (dd->dv_copyID != copyID)
+ if (dd != NULL && dd->dv_copyID != copyID)
{
/* Didn't see this dict yet. */
dd->dv_copyID = copyID;
@@ -6607,7 +6635,7 @@ set_ref_in_item(tv, copyID)
case VAR_LIST:
ll = tv->vval.v_list;
- if (ll->lv_copyID != copyID)
+ if (ll != NULL && ll->lv_copyID != copyID)
{
/* Didn't see this list yet. */
ll->lv_copyID = copyID;
@@ -18106,6 +18134,17 @@ get_vim_var_str(idx)
}
/*
+ * Get List v: variable value. Caller must take care of reference count when
+ * needed.
+ */
+ list_T *
+get_vim_var_list(idx)
+ int idx;
+{
+ return vimvars[idx].vv_list;
+}
+
+/*
* Set v:count, v:count1 and v:prevcount.
*/
void
@@ -18141,6 +18180,20 @@ set_vim_var_string(idx, val, len)
}
/*
+ * Set List v: variable to "val".
+ */
+ void
+set_vim_var_list(idx, val)
+ int idx;
+ list_T *val;
+{
+ list_unref(vimvars[idx].vv_list);
+ vimvars[idx].vv_list = val;
+ if (val != NULL)
+ ++val->lv_refcount;
+}
+
+/*
* Set v:register if needed.
*/
void
@@ -21900,6 +21953,62 @@ last_set_msg(scriptID)
}
}
+/*
+ * List v:oldfiles in a nice way.
+ */
+/*ARGSUSED*/
+ void
+ex_oldfiles(eap)
+ exarg_T *eap;
+{
+ list_T *l = vimvars[VV_OLDFILES].vv_list;
+ listitem_T *li;
+ int nr = 0;
+
+ if (l == NULL)
+ msg((char_u *)_("No old files"));
+ else
+ {
+ msg_start();
+ msg_scroll = TRUE;
+ for (li = l->lv_first; li != NULL && !got_int; li = li->li_next)
+ {
+ msg_outnum((long)++nr);
+ MSG_PUTS(": ");
+ msg_outtrans(get_tv_string(&li->li_tv));
+ msg_putchar('\n');
+ out_flush(); /* output one line at a time */
+ ui_breakcheck();
+ }
+ /* Assume "got_int" was set to truncate the listing. */
+ got_int = FALSE;
+
+#ifdef FEAT_BROWSE_CMD
+ if (cmdmod.browse)
+ {
+ quit_more = FALSE;
+ nr = prompt_for_number(FALSE);
+ msg_starthere();
+ if (nr > 0)
+ {
+ char_u *p = list_find_str(get_vim_var_list(VV_OLDFILES),
+ (long)nr);
+
+ if (p != NULL)
+ {
+ p = expand_env_save(p);
+ eap->arg = p;
+ eap->cmdidx = CMD_edit;
+ cmdmod.browse = FALSE;
+ do_exedit(eap, NULL);
+ vim_free(p);
+ }
+ }
+ }
+#endif
+ }
+}
+
#endif /* FEAT_EVAL */
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 02d5b3ebe8..5d382d18ef 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -24,7 +24,7 @@ static int linelen __ARGS((int *has_tab));
static void do_filter __ARGS((linenr_T line1, linenr_T line2, exarg_T *eap, char_u *cmd, int do_in, int do_out));
#ifdef FEAT_VIMINFO
static char_u *viminfo_filename __ARGS((char_u *));
-static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int want_info, int want_marks, int force_read));
+static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int flags));
static int viminfo_encoding __ARGS((vir_T *virp));
static int read_viminfo_up_to_marks __ARGS((vir_T *virp, int forceit, int writing));
#endif
@@ -1676,14 +1676,12 @@ viminfo_error(errnum, message, line)
/*
* read_viminfo() -- Read the viminfo file. Registers etc. which are already
- * set are not over-written unless force is TRUE. -- webb
+ * set are not over-written unless "flags" includes VIF_FORCEIT. -- webb
*/
int
-read_viminfo(file, want_info, want_marks, forceit)
- char_u *file;
- int want_info;
- int want_marks;
- int forceit;
+read_viminfo(file, flags)
+ char_u *file; /* file name or NULL to use default name */
+ int flags; /* VIF_WANT_INFO et al. */
{
FILE *fp;
char_u *fname;
@@ -1691,7 +1689,7 @@ read_viminfo(file, want_info, want_marks, forceit)
if (no_viminfo())
return FAIL;
- fname = viminfo_filename(file); /* may set to default if NULL */
+ fname = viminfo_filename(file); /* get file name in allocated buffer */
if (fname == NULL)
return FAIL;
fp = mch_fopen((char *)fname, READBIN);
@@ -1701,8 +1699,9 @@ read_viminfo(file, want_info, want_marks, forceit)
verbose_enter();
smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"),
fname,
- want_info ? _(" info") : "",
- want_marks ? _(" marks") : "",
+ (flags & VIF_WANT_INFO) ? _(" info") : "",
+ (flags & VIF_WANT_MARKS) ? _(" marks") : "",
+ (flags & VIF_GET_OLDFILES) ? _(" oldfiles") : "",
fp == NULL ? _(" FAILED") : "");
verbose_leave();
}
@@ -1712,10 +1711,9 @@ read_viminfo(file, want_info, want_marks, forceit)
return FAIL;
viminfo_errcnt = 0;
- do_viminfo(fp, NULL, want_info, want_marks, forceit);
+ do_viminfo(fp, NULL, flags);
fclose(fp);
-
return OK;
}
@@ -1968,7 +1966,7 @@ write_viminfo(file, forceit)
}
viminfo_errcnt = 0;
- do_viminfo(fp_in, fp_out, !forceit, !forceit, FALSE);
+ do_viminfo(fp_in, fp_out, forceit ? 0 : (VIF_WANT_INFO | VIF_WANT_MARKS));
fclose(fp_out); /* errors are ignored !? */
if (fp_in != NULL)
@@ -2041,12 +2039,10 @@ viminfo_filename(file)
* do_viminfo() -- Should only be called from read_viminfo() & write_viminfo().
*/
static void
-do_viminfo(fp_in, fp_out, want_info, want_marks, force_read)
+do_viminfo(fp_in, fp_out, flags)
FILE *fp_in;
FILE *fp_out;
- int want_info;
- int want_marks;
- int force_read;
+ int flags;
{
int count = 0;
int eof = FALSE;
@@ -2061,8 +2057,9 @@ do_viminfo(fp_in, fp_out, want_info, want_marks, force_read)
if (fp_in != NULL)
{
- if (want_info)
- eof = read_viminfo_up_to_marks(&vir, force_read, fp_out != NULL);
+ if (flags & VIF_WANT_INFO)
+ eof = read_viminfo_up_to_marks(&vir,
+ flags & VIF_FORCEIT, fp_out != NULL);
else
/* Skip info, find start of marks */
while (!(eof = viminfo_readline(&vir))
@@ -2092,8 +2089,9 @@ do_viminfo(fp_in, fp_out, want_info, want_marks, force_read)
write_viminfo_bufferlist(fp_out);
count = write_viminfo_marks(fp_out);
}
- if (fp_in != NULL && want_marks)
- copy_viminfo_marks(&vir, fp_out, count, eof);
+ if (fp_in != NULL
+ && (flags & (VIF_WANT_MARKS | VIF_GET_OLDFILES | VIF_FORCEIT)))
+ copy_viminfo_marks(&vir, fp_out, count, eof, flags);
vim_free(vir.vir_line);
#ifdef FEAT_MBYTE
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index c6036fa2bf..49167505c6 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -653,6 +653,8 @@ EX(CMD_nunmenu, "nunmenu", ex_menu,
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
EX(CMD_open, "open", ex_open,
RANGE|EXTRA),
+EX(CMD_oldfiles, "oldfiles", ex_oldfiles,
+ BANG|TRLBAR|SBOXOK|CMDWIN),
EX(CMD_omap, "omap", ex_map,
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
EX(CMD_omapclear, "omapclear", ex_mapclear,
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index c6cbd0d493..8d21ee1ebf 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -364,6 +364,7 @@ static void ex_tag_cmd __ARGS((exarg_T *eap, char_u *name));
# define ex_function ex_ni
# define ex_delfunction ex_ni
# define ex_return ex_ni
+# define ex_oldfiles ex_ni
#endif
static char_u *arg_all __ARGS((void));
#ifdef FEAT_SESSION
@@ -1770,7 +1771,7 @@ do_one_cmd(cmdlinep, sourcing,
}
if (checkforcmd(&ea.cmd, "browse", 3))
{
-#ifdef FEAT_BROWSE
+#ifdef FEAT_BROWSE_CMD
cmdmod.browse = TRUE;
#endif
continue;
@@ -9508,24 +9509,50 @@ eval_vars(src, srcstart, usedlen, lnump, errormsg, escaped)
break;
}
s = src + 1;
+ if (*s == '<') /* "#<99" uses v:oldfiles */
+ ++s;
i = (int)getdigits(&s);
*usedlen = (int)(s - src); /* length of what we expand */
- buf = buflist_findnr(i);
- if (buf == NULL)
+ if (src[1] == '<')
{
- *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'");
+ if (*usedlen < 2)
+ {
+ /* Should we give an error message for #<text? */
+ *usedlen = 1;
+ return NULL;
+ }
+#ifdef FEAT_EVAL
+ result = list_find_str(get_vim_var_list(VV_OLDFILES),
+ (long)i);
+ if (result == NULL)
+ {
+ *errormsg = (char_u *)"";
+ return NULL;
+ }
+#else
+ *errormsg = (char_u *)_("E809: #< is not available without the +eval feature");
return NULL;
+#endif
}
- if (lnump != NULL)
- *lnump = ECMD_LAST;
- if (buf->b_fname == NULL)
+ else
{
- result = (char_u *)"";
- valid = 0; /* Must have ":p:h" to be valid */
+ buf = buflist_findnr(i);
+ if (buf == NULL)
+ {
+ *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'");
+ return NULL;
+ }
+ if (lnump != NULL)
+ *lnump = ECMD_LAST;
+ if (buf->b_fname == NULL)
+ {
+ result = (char_u *)"";
+ valid = 0; /* Must have ":p:h" to be valid */
+ }
+ else
+ result = buf->b_fname;
}
- else
- result = buf->b_fname;
break;
#ifdef FEAT_SEARCHPATH
@@ -10700,7 +10727,8 @@ ex_viminfo(eap)
p_viminfo = (char_u *)"'100";
if (eap->cmdidx == CMD_rviminfo)
{
- if (read_viminfo(eap->arg, TRUE, TRUE, eap->forceit) == FAIL)
+ if (read_viminfo(eap->arg, VIF_WANT_INFO | VIF_WANT_MARKS
+ | (eap->forceit ? VIF_FORCEIT : 0)) == FAIL)
EMSG(_("E195: Cannot open viminfo file for reading"));
}
else
diff --git a/src/feature.h b/src/feature.h
index c560a9f7f8..ae16750353 100644
--- a/src/feature.h
+++ b/src/feature.h
@@ -767,9 +767,13 @@
/*
* +browse ":browse" command.
+ * or just the ":browse" command modifier
*/
-#if defined(FEAT_NORMAL) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC))
-# define FEAT_BROWSE
+#if defined(FEAT_NORMAL)
+# define FEAT_BROWSE_CMD
+# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
+# define FEAT_BROWSE
+# endif
#endif
/*
diff --git a/src/fileio.c b/src/fileio.c
index c86f55dbbc..67e8cfe439 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2711,7 +2711,7 @@ check_marks_read()
{
if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
&& curbuf->b_ffname != NULL)
- read_viminfo(NULL, FALSE, TRUE, FALSE);
+ read_viminfo(NULL, VIF_WANT_MARKS);
/* Always set b_marks_read; needed when 'viminfo' is changed to include
* the ' parameter after opening a buffer. */
@@ -9108,7 +9108,7 @@ static int include_groups = FALSE;
set_context_in_autocmd(xp, arg, doautocmd)
expand_T *xp;
char_u *arg;
- int doautocmd; /* TRUE for :doautocmd, FALSE for :autocmd */
+ int doautocmd; /* TRUE for :doauto*, FALSE for :autocmd */
{
char_u *p;
int group;
diff --git a/src/main.c b/src/main.c
index 0fc59412cd..53f55c0be6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -645,11 +645,12 @@ main
#ifdef FEAT_VIMINFO
/*
- * Read in registers, history etc, but not marks, from the viminfo file
+ * Read in registers, history etc, but not marks, from the viminfo file.
+ * This is where v:oldfiles gets filled.
*/
if (*p_viminfo != NUL)
{
- read_viminfo(NULL, TRUE, FALSE, FALSE);
+ read_viminfo(NULL, VIF_WANT_INFO | VIF_GET_OLDFILES);
TIME_MSG("reading viminfo");
}
#endif
diff --git a/src/mark.c b/src/mark.c
index 2adf098f5e..3dddad65d5 100644
--- a/src/mark.c
+++ b/src/mark.c
@@ -1627,15 +1627,17 @@ write_one_mark(fp_out, c, pos)
/*
* Handle marks in the viminfo file:
- * fp_out == NULL read marks for current buffer only
- * fp_out != NULL copy marks for buffers not in buffer list
+ * fp_out != NULL: copy marks for buffers not in buffer list
+ * fp_out == NULL && (flags & VIF_WANT_MARKS): read marks for curbuf only
+ * fp_out == NULL && (flags & VIF_GET_OLDFILES | VIF_FORCEIT): fill v:oldfiles
*/
void
-copy_viminfo_marks(virp, fp_out, count, eof)
+copy_viminfo_marks(virp, fp_out, count, eof, flags)
vir_T *virp;
FILE *fp_out;
int count;
int eof;
+ int flags;
{
char_u *line = virp->vir_line;
buf_T *buf;
@@ -1647,10 +1649,23 @@ copy_viminfo_marks(virp, fp_out, count, eof)
char_u *p;
char_u *name_buf;
pos_T pos;
+#ifdef FEAT_EVAL
+ list_T *list = NULL;
+#endif
if ((name_buf = alloc(LSIZE)) == NULL)
return;
*name_buf = NUL;
+
+#ifdef FEAT_EVAL
+ if (fp_out == NULL && (flags & (VIF_GET_OLDFILES | VIF_FORCEIT)))
+ {
+ list = list_alloc();
+ if (list != NULL)
+ set_vim_var_list(VV_OLDFILES, list);
+ }
+#endif
+
num_marked_files = get_viminfo_parameter('\'');
while (!eof && (count < num_marked_files || fp_out == NULL))
{
@@ -1681,6 +1696,11 @@ copy_viminfo_marks(virp, fp_out, count, eof)
p++;
*p = NUL;
+#ifdef FEAT_EVAL
+ if (list != NULL)
+ list_append_string(list, str, -1);
+#endif
+
/*
* If fp_out == NULL, load marks for current buffer.
* If fp_out != NULL, copy marks for buffers not in buflist.
@@ -1688,7 +1708,7 @@ copy_viminfo_marks(virp, fp_out, count, eof)
load_marks = copy_marks_out = FALSE;
if (fp_out == NULL)
{
- if (curbuf->b_ffname != NULL)
+ if ((flags & VIF_WANT_MARKS) && curbuf->b_ffname != NULL)
{
if (*name_buf == NUL) /* only need to do this once */
home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE);
diff --git a/src/misc1.c b/src/misc1.c
index a626182ac0..727951febe 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -3245,9 +3245,9 @@ prompt_for_number(mouse_used)
/* When using ":silent" assume that <CR> was entered. */
if (mouse_used != NULL)
- MSG_PUTS(_("Type number or click with mouse (<Enter> cancels): "));
+ MSG_PUTS(_("Type number and <Enter> or click with mouse (empty cancels): "));
else
- MSG_PUTS(_("Choice number (<Enter> cancels): "));
+ MSG_PUTS(_("Type number and <Enter> (empty cancels): "));
/* Set the state such that text can be selected/copied/pasted and we still
* get mouse events. */
diff --git a/src/option.c b/src/option.c
index 20fef41076..e8b8b0c7cb 100644
--- a/src/option.c
+++ b/src/option.c
@@ -2593,13 +2593,13 @@ static struct vimoption
#ifdef FEAT_VIMINFO
(char_u *)&p_viminfo, PV_NONE,
#if defined(MSDOS) || defined(MSWIN) || defined(OS2)
- {(char_u *)"", (char_u *)"'20,<50,s10,h,rA:,rB:"}
+ {(char_u *)"", (char_u *)"'100,<50,s10,h,rA:,rB:"}
#else
# ifdef AMIGA
{(char_u *)"",
- (char_u *)"'20,<50,s10,h,rdf0:,rdf1:,rdf2:"}
+ (char_u *)"'100,<50,s10,h,rdf0:,rdf1:,rdf2:"}
# else
- {(char_u *)"", (char_u *)"'20,<50,s10,h"}
+ {(char_u *)"", (char_u *)"'100,<50,s10,h"}
# endif
#endif
#else
diff --git a/src/proto/eval.pro b/src/proto/eval.pro
index def81e397f..7aabf0ba13 100644
--- a/src/proto/eval.pro
+++ b/src/proto/eval.pro
@@ -17,7 +17,7 @@ void eval_patch __ARGS((char_u *origfile, char_u *difffile, char_u *outfile));
int eval_to_bool __ARGS((char_u *arg, int *error, char_u **nextcmd, int skip));
char_u *eval_to_string_skip __ARGS((char_u *arg, char_u **nextcmd, int skip));
int skip_expr __ARGS((char_u **pp));
-char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int dolist));
+char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int convert));
char_u *eval_to_string_safe __ARGS((char_u *arg, char_u **nextcmd, int use_sandbox));
int eval_to_number __ARGS((char_u *expr));
list_T *eval_spell_expr __ARGS((char_u *badword, char_u *expr));
@@ -46,7 +46,9 @@ list_T *list_alloc __ARGS((void));
void list_unref __ARGS((list_T *l));
void list_free __ARGS((list_T *l, int recurse));
dictitem_T *dict_lookup __ARGS((hashitem_T *hi));
+char_u *list_find_str __ARGS((list_T *l, long idx));
int list_append_dict __ARGS((list_T *list, dict_T *dict));
+int list_append_string __ARGS((list_T *l, char_u *str, int len));
int garbage_collect __ARGS((void));
dict_T *dict_alloc __ARGS((void));
int dict_add_nr_str __ARGS((dict_T *d, char *key, long nr, char_u *str));
@@ -58,8 +60,10 @@ long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, ch
void set_vim_var_nr __ARGS((int idx, long val));
long get_vim_var_nr __ARGS((int idx));
char_u *get_vim_var_str __ARGS((int idx));
+list_T *get_vim_var_list __ARGS((int idx));
void set_vcount __ARGS((long count, long count1));
void set_vim_var_string __ARGS((int idx, char_u *val, int len));
+void set_vim_var_list __ARGS((int idx, list_T *val));
void set_reg_var __ARGS((int c));
char_u *v_exception __ARGS((char_u *oldval));
char_u *v_throwpoint __ARGS((char_u *oldval));
@@ -94,6 +98,7 @@ int read_viminfo_varlist __ARGS((vir_T *virp, int writing));
void write_viminfo_varlist __ARGS((FILE *fp));
int store_session_globals __ARGS((FILE *fd));
void last_set_msg __ARGS((scid_T scriptID));
+void ex_oldfiles __ARGS((exarg_T *eap));
int modify_fname __ARGS((char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen));
char_u *do_string_sub __ARGS((char_u *str, char_u *pat, char_u *sub, char_u *flags));
/* vim: set ft=c : */
diff --git a/src/proto/ex_cmds.pro b/src/proto/ex_cmds.pro
index 4382e6530a..dced028c17 100644
--- a/src/proto/ex_cmds.pro
+++ b/src/proto/ex_cmds.pro
@@ -11,7 +11,7 @@ void do_shell __ARGS((char_u *cmd, int flags));
char_u *make_filter_cmd __ARGS((char_u *cmd, char_u *itmp, char_u *otmp));
void append_redir __ARGS((char_u *buf, char_u *opt, char_u *fname));
int viminfo_error __ARGS((char *errnum, char *message, char_u *line));
-int read_viminfo __ARGS((char_u *file, int want_info, int want_marks, int forceit));
+int read_viminfo __ARGS((char_u *file, int flags));
void write_viminfo __ARGS((char_u *file, int forceit));
int viminfo_readline __ARGS((vir_T *virp));
char_u *viminfo_readstring __ARGS((vir_T *virp, int off, int convert));
diff --git a/src/proto/mark.pro b/src/proto/mark.pro
index 13e186899e..1457829a74 100644
--- a/src/proto/mark.pro
+++ b/src/proto/mark.pro
@@ -26,5 +26,5 @@ int read_viminfo_filemark __ARGS((vir_T *virp, int force));
void write_viminfo_filemarks __ARGS((FILE *fp));
int removable __ARGS((char_u *name));
int write_viminfo_marks __ARGS((FILE *fp_out));
-void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof));
+void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof, int flags));
/* vim: set ft=c : */
diff --git a/src/structs.h b/src/structs.h
index a485ec15c3..1ecdddbc15 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -459,7 +459,7 @@ typedef struct expand
typedef struct
{
int hide; /* TRUE when ":hide" was used */
-# ifdef FEAT_BROWSE
+# ifdef FEAT_BROWSE_CMD
int browse; /* TRUE to invoke file dialog */
# endif
# ifdef FEAT_WINDOWS
diff --git a/src/version.c b/src/version.c
index cc9bad4ee8..fb96904f19 100644
--- a/src/version.c
+++ b/src/version.c
@@ -677,6 +677,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 31,
+/**/
30,
/**/
29,
diff --git a/src/vim.h b/src/vim.h
index b1a088d865..0421cff285 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -1728,7 +1728,8 @@ typedef int proftime_T; /* dummy for function prototypes */
#define VV_MOUSE_COL 51
#define VV_OP 52
#define VV_SEARCHFORWARD 53
-#define VV_LEN 54 /* number of v: vars */
+#define VV_OLDFILES 54
+#define VV_LEN 55 /* number of v: vars */
#ifdef FEAT_CLIPBOARD
@@ -2054,4 +2055,10 @@ typedef int VimClipboard; /* This is required for the prototypes. */
#define DOSO_VIMRC 1 /* loading vimrc file */
#define DOSO_GVIMRC 2 /* loading gvimrc file */
+/* flags for read_viminfo() and children */
+#define VIF_WANT_INFO 1 /* load non-mark info */
+#define VIF_WANT_MARKS 2 /* load file marks */
+#define VIF_FORCEIT 4 /* overwrite info already read */
+#define VIF_GET_OLDFILES 8 /* load v:oldfiles */
+
#endif /* VIM__H */