To: vim-dev@vim.org
Subject: Patch 7.2.031
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------
Patch 7.2.031
Problem: Information in the viminfo file about previously edited files is
not available to the user. There is no way to get a complete list
of files edited in previous Vim sessions.
Solution: Add v:oldfiles and fill it with the list of old file names when
first reading the viminfo file. Add the ":oldfiles" command,
":browse oldfiles" and the "#<123" special file name. Increase
the default value for 'viminfo' from '20 to '100.
Files: runtime/doc/cmdline.txt, runtime/doc/eval.txt,
runtime/doc/starting.txt, runtime/doc/usr_21.txt, src/eval.c,
src/ex_cmds.c, src/ex_cmds.h, src/ex_docmd.c, src/feature.h,
src/fileio.c, src/main.c, src/mark.c, src/misc1.c,
src/proto/eval.pro, src/proto/ex_cmds.pro, src/proto/mark.pro,
src/option.c, src/structs.h, src/vim.h
*** ../vim-7.2.030/runtime/doc/cmdline.txt Sat Aug 9 19:36:46 2008
--- runtime/doc/cmdline.txt Thu Sep 18 22:55:27 2008
***************
*** 1,4 ****
! *cmdline.txt* For Vim version 7.2. Last change: 2008 Jul 29
VIM REFERENCE MANUAL by Bram Moolenaar
--- 1,4 ----
! *cmdline.txt* For Vim version 7.2. Last change: 2008 Sep 18
VIM REFERENCE MANUAL by Bram Moolenaar
***************
*** 157,162 ****
--- 157,167 ----
(doesn't work at the expression prompt; some
things such as changing the buffer or current
window are not allowed to avoid side effects)
+ When the result is a |List| the items are used
+ as lines. They can have line breaks inside
+ too.
+ When the result is a Float it's automatically
+ converted to a String.
See |registers| about registers. {not in Vi}
Implementation detail: When using the |expression| register
and invoking setcmdpos(), this sets the position before
***************
*** 730,748 ****
In Ex commands, at places where a file name can be used, the following
characters have a special meaning. These can also be used in the expression
function expand() |expand()|.
! % is replaced with the current file name *:_%*
! # is replaced with the alternate file name *:_#*
#n (where n is a number) is replaced with the file name of
! buffer n. "#0" is the same as "#"
! ## is replaced with all names in the argument list *:_##*
concatenated, separated by spaces. Each space in a name
is preceded with a backslash.
! Note that these give the file name as it was typed. If an absolute path is
! needed (when using the file name from a different directory), you need to add
! ":p". See |filename-modifiers|.
Note that backslashes are inserted before spaces, so that the command will
correctly interpret the file name. But this doesn't happen for shell
! commands. For those you probably have to use quotes: >
:!ls "%"
:r !spell "%"
--- 735,763 ----
In Ex commands, at places where a file name can be used, the following
characters have a special meaning. These can also be used in the expression
function expand() |expand()|.
! % Is replaced with the current file name. *:_%* *c_%*
! # Is replaced with the alternate file name. *:_#* *c_#*
#n (where n is a number) is replaced with the file name of
! buffer n. "#0" is the same as "#".
! ## Is replaced with all names in the argument list *:_##* *c_##*
concatenated, separated by spaces. Each space in a name
is preceded with a backslash.
! #<n (where n is a number > 0) is replaced with old *:_#<* *c_#<*
! file name n. See |:oldfiles| or |v:oldfiles| to get the
! number. *E809*
! {only when compiled with the +eval and +viminfo features}
!
! Note that these, except "#<n", give the file name as it was typed. If an
! absolute path is needed (when using the file name from a different directory),
! you need to add ":p". See |filename-modifiers|.
!
! The "#<n" item returns an absolute path, but it will start with "~/" for files
! below your home directory.
!
Note that backslashes are inserted before spaces, so that the command will
correctly interpret the file name. But this doesn't happen for shell
! commands. For those you probably have to use quotes (this fails for files
! that contain a quote and wildcards): >
:!ls "%"
:r !spell "%"
*** ../vim-7.2.030/runtime/doc/eval.txt Sat Aug 9 19:36:47 2008
--- runtime/doc/eval.txt Sun Nov 2 14:25:38 2008
***************
*** 1,4 ****
! *eval.txt* For Vim version 7.2. Last change: 2008 Aug 09
VIM REFERENCE MANUAL by Bram Moolenaar
--- 1,4 ----
! *eval.txt* For Vim version 7.2. Last change: 2008 Nov 02
VIM REFERENCE MANUAL by Bram Moolenaar
***************
*** 1484,1489 ****
--- 1484,1500 ----
This is the screen column number, like with |virtcol()|. The
value is zero when there was no mouse button click.
+ *v:oldfiles* *oldfiles-variable*
+ v:oldfiles List of file names that is loaded from the |viminfo| file on
+ startup. These are the files that Vim remembers marks for.
+ The length of the List is limited by the ' argument of the
+ 'viminfo' option (default is 100).
+ Also see |:oldfiles| and |c_#<|.
+ The List can be modified, but this has no effect on what is
+ stored in the |viminfo| file later. If you use values other
+ than String this will cause trouble.
+ {only when compiled with the +viminfo feature}
+
*v:operator* *operator-variable*
v:operator The last operator given in Normal mode. This is a single
character except for commands starting with <g> or <z>,
*** ../vim-7.2.030/runtime/doc/starting.txt Sat Aug 9 19:36:52 2008
--- runtime/doc/starting.txt Sun Nov 9 12:12:19 2008
***************
*** 1,4 ****
! *starting.txt* For Vim version 7.2. Last change: 2008 Jun 21
VIM REFERENCE MANUAL by Bram Moolenaar
--- 1,4 ----
! *starting.txt* For Vim version 7.2. Last change: 2008 Nov 09
VIM REFERENCE MANUAL by Bram Moolenaar
***************
*** 1337,1344 ****
*viminfo-read*
When Vim is started and the 'viminfo' option is non-empty, the contents of
the viminfo file are read and the info can be used in the appropriate places.
! The marks are not read in at startup (but file marks are). See
! |initialization| for how to set the 'viminfo' option upon startup.
*viminfo-write*
When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo
--- 1335,1343 ----
*viminfo-read*
When Vim is started and the 'viminfo' option is non-empty, the contents of
the viminfo file are read and the info can be used in the appropriate places.
! The |v:oldfiles| variable is filled. The marks are not read in at startup
! (but file marks are). See |initialization| for how to set the 'viminfo'
! option upon startup.
*viminfo-write*
When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo
***************
*** 1372,1377 ****
--- 1371,1378 ----
that start with any string given with the "r" flag in 'viminfo'. This can be
used to avoid saving marks for files on removable media (for MS-DOS you would
use "ra:,rb:", for Amiga "rdf0:,rdf1:,rdf2:").
+ The |v:oldfiles| variable is filled with the file names that the viminfo file
+ has marks for.
*viminfo-file-marks*
Uppercase marks ('A to 'Z) are stored when writing the viminfo file. The
***************
*** 1463,1470 ****
*:rv* *:rviminfo* *E195*
:rv[iminfo][!] [file] Read from viminfo file [file] (default: see above).
If [!] is given, then any information that is
! already set (registers, marks, etc.) will be
! overwritten. {not in Vi}
*:wv* *:wviminfo* *E137* *E138* *E574*
:wv[iminfo][!] [file] Write to viminfo file [file] (default: see above).
--- 1464,1471 ----
*:rv* *:rviminfo* *E195*
:rv[iminfo][!] [file] Read from viminfo file [file] (default: see above).
If [!] is given, then any information that is
! already set (registers, marks, |v:oldfiles|, etc.)
! will be overwritten {not in Vi}
*:wv* *:wviminfo* *E137* *E138* *E574*
:wv[iminfo][!] [file] Write to viminfo file [file] (default: see above).
***************
*** 1479,1482 ****
--- 1480,1499 ----
the .viminfo file.
{not in Vi}
+ *:ol* *:oldfiles*
+ :ol[dfiles] List the files that have marks stored in the viminfo
+ file. This list is read on startup and only changes
+ afterwards with ":rviminfo!". Also see |v:oldfiles|.
+ The number can be used with |c_#<|.
+ {not in Vi, only when compiled with the +eval feature}
+
+ :bro[wse] ol[dfiles][!]
+ List file names as with |:oldfiles|, and then prompt
+ for a number. When the number is valid that file from
+ the list is edited.
+ If you get the |press-enter| prompt you can press "q"
+ and still get the prompt to enter a file number.
+ Use ! to abondon a modified buffer. |abandon|
+ {not when compiled with tiny or small features}
+
vim:tw=78:ts=8:ft=help:norl:
*** ../vim-7.2.030/runtime/doc/usr_21.txt Sat Aug 9 19:36:53 2008
--- runtime/doc/usr_21.txt Sun Nov 9 12:14:10 2008
***************
*** 1,4 ****
! *usr_21.txt* For Vim version 7.2. Last change: 2007 May 01
VIM USER MANUAL - by Bram Moolenaar
--- 1,4 ----
! *usr_21.txt* For Vim version 7.2. Last change: 2008 Nov 09
VIM USER MANUAL - by Bram Moolenaar
***************
*** 153,159 ****
to be lost. Each item can be remembered only once.
! GETTING BACK TO WHERE YOU WERE
You are halfway editing a file and it's time to leave for holidays. You exit
Vim and go enjoy yourselves, forgetting all about your work. After a couple
--- 153,159 ----
to be lost. Each item can be remembered only once.
! GETTING BACK TO WHERE YOU STOPPED VIM
You are halfway editing a file and it's time to leave for holidays. You exit
Vim and go enjoy yourselves, forgetting all about your work. After a couple
***************
*** 168,173 ****
--- 168,215 ----
The |:marks| command is useful to find out where '0 to '9 will take you.
+ GETTING BACK TO SOME FILE
+
+ If you want to go back to a file that you edited recently, but not when
+ exiting Vim, there is a slightly more complicated way. You can see a list of
+ files by typing the command: >
+
+ :oldfiles
+ < 1: ~/.viminfo ~
+ 2: ~/text/resume.txt ~
+ 3: /tmp/draft ~
+
+ Now you would like to edit the second file, which is in the list preceded by
+ "2:". You type: >
+
+ :e #<2
+
+ Instead of ":e" you can use any command that has a file name argument, the
+ "#<2" item works in the same place as "%" (current file name) and "#"
+ (alternate file name). So you can also split the window to edit the third
+ file: >
+
+ :split #<3
+
+ That #<123 thing is a bit complicated when you just want to edit a file.
+ Fortunately there is a simpler way: >
+
+ :browse oldfiles
+ < 1: ~/.viminfo ~
+ 2: ~/text/resume.txt ~
+ 3: /tmp/draft ~
+ -- More --
+
+ You get the same list of files as with |:oldfiles|. If you want to edit
+ "resume.txt" first press "q" to stop the listing. You will get a prompt:
+
+ Type number and <Enter> (empty cancels): ~
+
+ Type "2" and press <Enter> to edit the second file.
+
+ More info at |:oldfiles|, |v:oldfiles| and |c_#<|.
+
+
MOVE INFO FROM ONE VIM TO ANOTHER
You can use the ":wviminfo" and ":rviminfo" commands to save and restore the
*** ../vim-7.2.030/src/eval.c Thu Nov 6 11:04:50 2008
--- src/eval.c Sun Nov 9 11:59:39 2008
***************
*** 348,353 ****
--- 348,354 ----
{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,360 ****
--- 356,362 ----
#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,432 ****
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));
--- 428,433 ----
***************
*** 845,852 ****
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;
}
}
hash_clear(&vimvarht);
--- 846,858 ----
p = &vimvars[i];
if (p->vv_di.di_tv.v_type == VAR_STRING)
{
! 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,6062 ****
--- 6063,6087 ----
}
/*
+ * 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,6153 ****
* When "len" >= 0 use "str[len]".
* Returns FAIL when out of memory.
*/
! static int
list_append_string(l, str, len)
list_T *l;
char_u *str;
--- 6172,6178 ----
* When "len" >= 0 use "str[len]".
* Returns FAIL when out of memory.
*/
! int
list_append_string(l, str, len)
list_T *l;
char_u *str;
***************
*** 6507,6512 ****
--- 6532,6540 ----
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,6603 ****
{
case VAR_DICT:
dd = tv->vval.v_dict;
! if (dd->dv_copyID != copyID)
{
/* Didn't see this dict yet. */
dd->dv_copyID = copyID;
--- 6625,6631 ----
{
case VAR_DICT:
dd = tv->vval.v_dict;
! if (dd != NULL && dd->dv_copyID != copyID)
{
/* Didn't see this dict yet. */
dd->dv_copyID = copyID;
***************
*** 6607,6613 ****
case VAR_LIST:
ll = tv->vval.v_list;
! if (ll->lv_copyID != copyID)
{
/* Didn't see this list yet. */
ll->lv_copyID = copyID;
--- 6635,6641 ----
case VAR_LIST:
ll = tv->vval.v_list;
! if (ll != NULL && ll->lv_copyID != copyID)
{
/* Didn't see this list yet. */
ll->lv_copyID = copyID;
***************
*** 18106,18111 ****
--- 18134,18150 ----
}
/*
+ * 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,18146 ****
--- 18180,18199 ----
}
/*
+ * 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,21905 ****
--- 21953,22014 ----
}
}
+ /*
+ * 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 */
*** ../vim-7.2.030/src/ex_cmds.c Sun Sep 14 21:40:26 2008
--- src/ex_cmds.c Sun Sep 14 13:45:03 2008
***************
*** 24,30 ****
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 int viminfo_encoding __ARGS((vir_T *virp));
static int read_viminfo_up_to_marks __ARGS((vir_T *virp, int forceit, int writing));
#endif
--- 24,30 ----
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 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,1689 ****
/*
* read_viminfo() -- Read the viminfo file. Registers etc. which are already
! * set are not over-written unless force is TRUE. -- webb
*/
int
! read_viminfo(file, want_info, want_marks, forceit)
! char_u *file;
! int want_info;
! int want_marks;
! int forceit;
{
FILE *fp;
char_u *fname;
--- 1676,1687 ----
/*
* read_viminfo() -- Read the viminfo file. Registers etc. which are already
! * set are not over-written unless "flags" includes VIF_FORCEIT. -- webb
*/
int
! 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,1697 ****
if (no_viminfo())
return FAIL;
! fname = viminfo_filename(file); /* may set to default if NULL */
if (fname == NULL)
return FAIL;
fp = mch_fopen((char *)fname, READBIN);
--- 1689,1695 ----
if (no_viminfo())
return FAIL;
! fname = viminfo_filename(file); /* get file name in allocated buffer */
if (fname == NULL)
return FAIL;
fp = mch_fopen((char *)fname, READBIN);
***************
*** 1701,1708 ****
verbose_enter();
smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"),
fname,
! want_info ? _(" info") : "",
! want_marks ? _(" marks") : "",
fp == NULL ? _(" FAILED") : "");
verbose_leave();
}
--- 1699,1707 ----
verbose_enter();
smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"),
fname,
! (flags & VIF_WANT_INFO) ? _(" info") : "",
! (flags & VIF_WANT_MARKS) ? _(" marks") : "",
! (flags & VIF_GET_OLDFILES) ? _(" oldfiles") : "",
fp == NULL ? _(" FAILED") : "");
verbose_leave();
}
***************
*** 1712,1721 ****
return FAIL;
viminfo_errcnt = 0;
! do_viminfo(fp, NULL, want_info, want_marks, forceit);
fclose(fp);
-
return OK;
}
--- 1711,1719 ----
return FAIL;
viminfo_errcnt = 0;
! do_viminfo(fp, NULL, flags);
fclose(fp);
return OK;
}
***************
*** 1968,1974 ****
}
viminfo_errcnt = 0;
! do_viminfo(fp_in, fp_out, !forceit, !forceit, FALSE);
fclose(fp_out); /* errors are ignored !? */
if (fp_in != NULL)
--- 1966,1972 ----
}
viminfo_errcnt = 0;
! 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,2052 ****
* 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)
FILE *fp_in;
FILE *fp_out;
! int want_info;
! int want_marks;
! int force_read;
{
int count = 0;
int eof = FALSE;
--- 2039,2048 ----
* do_viminfo() -- Should only be called from read_viminfo() & write_viminfo().
*/
static void
! do_viminfo(fp_in, fp_out, flags)
FILE *fp_in;
FILE *fp_out;
! int flags;
{
int count = 0;
int eof = FALSE;
***************
*** 2061,2068 ****
if (fp_in != NULL)
{
! if (want_info)
! eof = read_viminfo_up_to_marks(&vir, force_read, fp_out != NULL);
else
/* Skip info, find start of marks */
while (!(eof = viminfo_readline(&vir))
--- 2057,2065 ----
if (fp_in != 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,2099 ****
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);
vim_free(vir.vir_line);
#ifdef FEAT_MBYTE
--- 2089,2097 ----
write_viminfo_bufferlist(fp_out);
count = write_viminfo_marks(fp_out);
}
! 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
*** ../vim-7.2.030/src/ex_cmds.h Thu Nov 6 20:47:00 2008
--- src/ex_cmds.h Thu Sep 18 22:18:14 2008
***************
*** 653,658 ****
--- 653,660 ----
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,
*** ../vim-7.2.030/src/ex_docmd.c Thu Nov 6 17:16:06 2008
--- src/ex_docmd.c Mon Nov 3 21:21:17 2008
***************
*** 364,369 ****
--- 364,370 ----
# 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,1776 ****
}
if (checkforcmd(&ea.cmd, "browse", 3))
{
! #ifdef FEAT_BROWSE
cmdmod.browse = TRUE;
#endif
continue;
--- 1771,1777 ----
}
if (checkforcmd(&ea.cmd, "browse", 3))
{
! #ifdef FEAT_BROWSE_CMD
cmdmod.browse = TRUE;
#endif
continue;
***************
*** 9508,9531 ****
break;
}
s = src + 1;
i = (int)getdigits(&s);
*usedlen = (int)(s - src); /* length of what we expand */
! 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;
break;
#ifdef FEAT_SEARCHPATH
--- 9509,9558 ----
break;
}
s = src + 1;
+ if (*s == '<') /* "#<99" uses v:oldfiles */
+ ++s;
i = (int)getdigits(&s);
*usedlen = (int)(s - src); /* length of what we expand */
! if (src[1] == '<')
{
! 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
}
! else
{
! 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;
}
break;
#ifdef FEAT_SEARCHPATH
***************
*** 10700,10706 ****
p_viminfo = (char_u *)"'100";
if (eap->cmdidx == CMD_rviminfo)
{
! if (read_viminfo(eap->arg, TRUE, TRUE, eap->forceit) == FAIL)
EMSG(_("E195: Cannot open viminfo file for reading"));
}
else
--- 10727,10734 ----
p_viminfo = (char_u *)"'100";
if (eap->cmdidx == CMD_rviminfo)
{
! 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
*** ../vim-7.2.030/src/feature.h Wed Aug 6 18:45:07 2008
--- src/feature.h Fri Sep 19 19:14:22 2008
***************
*** 767,775 ****
/*
* +browse ":browse" command.
*/
! #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
#endif
/*
--- 767,779 ----
/*
* +browse ":browse" command.
+ * or just the ":browse" command modifier
*/
! #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
/*
*** ../vim-7.2.030/src/fileio.c Thu Sep 18 21:29:07 2008
--- src/fileio.c Mon Nov 3 21:21:47 2008
***************
*** 2711,2717 ****
{
if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
&& curbuf->b_ffname != NULL)
! read_viminfo(NULL, FALSE, TRUE, FALSE);
/* Always set b_marks_read; needed when 'viminfo' is changed to include
* the ' parameter after opening a buffer. */
--- 2711,2717 ----
{
if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
&& curbuf->b_ffname != NULL)
! 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,9114 ****
set_context_in_autocmd(xp, arg, doautocmd)
expand_T *xp;
char_u *arg;
! int doautocmd; /* TRUE for :doautocmd, FALSE for :autocmd */
{
char_u *p;
int group;
--- 9109,9115 ----
set_context_in_autocmd(xp, arg, doautocmd)
expand_T *xp;
char_u *arg;
! int doautocmd; /* TRUE for :doauto*, FALSE for :autocmd */
{
char_u *p;
int group;
*** ../vim-7.2.030/src/main.c Thu Sep 18 20:55:19 2008
--- src/main.c Sun Sep 14 13:26:10 2008
***************
*** 645,655 ****
#ifdef FEAT_VIMINFO
/*
! * Read in registers, history etc, but not marks, from the viminfo file
*/
if (*p_viminfo != NUL)
{
! read_viminfo(NULL, TRUE, FALSE, FALSE);
TIME_MSG("reading viminfo");
}
#endif
--- 645,656 ----
#ifdef FEAT_VIMINFO
/*
! * 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, VIF_WANT_INFO | VIF_GET_OLDFILES);
TIME_MSG("reading viminfo");
}
#endif
*** ../vim-7.2.030/src/mark.c Sat Aug 9 19:37:29 2008
--- src/mark.c Sun Sep 14 13:46:19 2008
***************
*** 1627,1641 ****
/*
* 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
*/
void
! copy_viminfo_marks(virp, fp_out, count, eof)
vir_T *virp;
FILE *fp_out;
int count;
int eof;
{
char_u *line = virp->vir_line;
buf_T *buf;
--- 1627,1643 ----
/*
* Handle marks in the viminfo file:
! * 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, flags)
vir_T *virp;
FILE *fp_out;
int count;
int eof;
+ int flags;
{
char_u *line = virp->vir_line;
buf_T *buf;
***************
*** 1647,1656 ****
--- 1649,1671 ----
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,1686 ****
--- 1696,1706 ----
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,1694 ****
load_marks = copy_marks_out = FALSE;
if (fp_out == NULL)
{
! if (curbuf->b_ffname != NULL)
{
if (*name_buf == NUL) /* only need to do this once */
home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE);
--- 1708,1714 ----
load_marks = copy_marks_out = FALSE;
if (fp_out == 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);
*** ../vim-7.2.030/src/misc1.c Wed Jun 25 00:24:52 2008
--- src/misc1.c Sun Nov 9 11:47:00 2008
***************
*** 3245,3253 ****
/* When using ":silent" assume that <CR> was entered. */
if (mouse_used != NULL)
! MSG_PUTS(_("Type number or click with mouse (<Enter> cancels): "));
else
! MSG_PUTS(_("Choice number (<Enter> cancels): "));
/* Set the state such that text can be selected/copied/pasted and we still
* get mouse events. */
--- 3245,3253 ----
/* When using ":silent" assume that <CR> was entered. */
if (mouse_used != NULL)
! MSG_PUTS(_("Type number and <Enter> or click with mouse (empty cancels): "));
else
! 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. */
*** ../vim-7.2.030/src/proto/eval.pro Sun Jan 6 20:06:30 2008
--- src/proto/eval.pro Sun Nov 9 12:05:56 2008
***************
*** 17,23 ****
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_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));
--- 17,23 ----
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 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,52 ****
--- 46,54 ----
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,65 ****
--- 60,69 ----
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,99 ****
--- 98,104 ----
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 : */
*** ../vim-7.2.030/src/proto/ex_cmds.pro Sat May 5 20:13:58 2007
--- src/proto/ex_cmds.pro Sat Sep 13 17:27:21 2008
***************
*** 11,17 ****
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));
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));
--- 11,17 ----
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 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));
*** ../vim-7.2.030/src/proto/mark.pro Sat May 5 19:29:37 2007
--- src/proto/mark.pro Sat Sep 13 18:06:20 2008
***************
*** 26,30 ****
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));
/* vim: set ft=c : */
--- 26,30 ----
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, int flags));
/* vim: set ft=c : */
*** ../vim-7.2.030/src/option.c Thu Oct 2 22:48:01 2008
--- src/option.c Fri Sep 26 22:20:20 2008
***************
*** 2593,2605 ****
#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:"}
#else
# ifdef AMIGA
{(char_u *)"",
! (char_u *)"'20,<50,s10,h,rdf0:,rdf1:,rdf2:"}
# else
! {(char_u *)"", (char_u *)"'20,<50,s10,h"}
# endif
#endif
#else
--- 2593,2605 ----
#ifdef FEAT_VIMINFO
(char_u *)&p_viminfo, PV_NONE,
#if defined(MSDOS) || defined(MSWIN) || defined(OS2)
! {(char_u *)"", (char_u *)"'100,<50,s10,h,rA:,rB:"}
#else
# ifdef AMIGA
{(char_u *)"",
! (char_u *)"'100,<50,s10,h,rdf0:,rdf1:,rdf2:"}
# else
! {(char_u *)"", (char_u *)"'100,<50,s10,h"}
# endif
#endif
#else
*** ../vim-7.2.030/src/structs.h Thu Jul 31 22:04:27 2008
--- src/structs.h Fri Sep 19 19:15:18 2008
***************
*** 459,465 ****
typedef struct
{
int hide; /* TRUE when ":hide" was used */
! # ifdef FEAT_BROWSE
int browse; /* TRUE to invoke file dialog */
# endif
# ifdef FEAT_WINDOWS
--- 459,465 ----
typedef struct
{
int hide; /* TRUE when ":hide" was used */
! # ifdef FEAT_BROWSE_CMD
int browse; /* TRUE to invoke file dialog */
# endif
# ifdef FEAT_WINDOWS
*** ../vim-7.2.030/src/vim.h Sat Aug 9 19:37:40 2008
--- src/vim.h Sat Sep 13 17:41:24 2008
***************
*** 1728,1734 ****
#define VV_MOUSE_COL 51
#define VV_OP 52
#define VV_SEARCHFORWARD 53
! #define VV_LEN 54 /* number of v: vars */
#ifdef FEAT_CLIPBOARD
--- 1728,1735 ----
#define VV_MOUSE_COL 51
#define VV_OP 52
#define VV_SEARCHFORWARD 53
! #define VV_OLDFILES 54
! #define VV_LEN 55 /* number of v: vars */
#ifdef FEAT_CLIPBOARD
***************
*** 2054,2057 ****
--- 2055,2064 ----
#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 */
*** ../vim-7.2.030/src/version.c Thu Nov 6 20:47:00 2008
--- src/version.c Sun Nov 9 13:39:19 2008
***************
*** 678,679 ****
--- 678,681 ----
{ /* Add new patch number below this line */
+ /**/
+ 31,
/**/
--
hundred-and-one symptoms of being an internet addict:
217. Your sex life has drastically improved...so what if it's only cyber-sex!
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ download, build and distribute -- http://www.A-A-P.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///