summaryrefslogtreecommitdiffstats
path: root/source/ap/vim/patches/7.2.031
diff options
context:
space:
mode:
Diffstat (limited to 'source/ap/vim/patches/7.2.031')
-rw-r--r--source/ap/vim/patches/7.2.0311281
1 files changed, 1281 insertions, 0 deletions
diff --git a/source/ap/vim/patches/7.2.031 b/source/ap/vim/patches/7.2.031
new file mode 100644
index 000000000..4b2bca700
--- /dev/null
+++ b/source/ap/vim/patches/7.2.031
@@ -0,0 +1,1281 @@
+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 ///