| 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 |
| |
| |
| |
| |
| |
| *** 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 "%" |
| |
| |
| |
| |
| *** 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>, |
| |
| |
| |
| *** 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: |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 */ |
| |
| |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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, |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| |
| /* |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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); |
| |
| |
| |
| *** 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. */ |
| |
| |
| |
| *** 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 : */ |
| |
| |
| |
| *** 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)); |
| |
| |
| |
| *** 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 : */ |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 */ |
| |
| |
| |
| *** 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 /// |