]> git.pld-linux.org Git - packages/vim.git/blame - 7.2.031
- new
[packages/vim.git] / 7.2.031
CommitLineData
2f43f8e6
ER
1To: vim-dev@vim.org
2Subject: Patch 7.2.031
3Fcc: outbox
4From: Bram Moolenaar <Bram@moolenaar.net>
5Mime-Version: 1.0
6Content-Type: text/plain; charset=ISO-8859-1
7Content-Transfer-Encoding: 8bit
8------------
9
10Patch 7.2.031
11Problem: Information in the viminfo file about previously edited files is
12 not available to the user. There is no way to get a complete list
13 of files edited in previous Vim sessions.
14Solution: Add v:oldfiles and fill it with the list of old file names when
15 first reading the viminfo file. Add the ":oldfiles" command,
16 ":browse oldfiles" and the "#<123" special file name. Increase
17 the default value for 'viminfo' from '20 to '100.
18Files: runtime/doc/cmdline.txt, runtime/doc/eval.txt,
19 runtime/doc/starting.txt, runtime/doc/usr_21.txt, src/eval.c,
20 src/ex_cmds.c, src/ex_cmds.h, src/ex_docmd.c, src/feature.h,
21 src/fileio.c, src/main.c, src/mark.c, src/misc1.c,
22 src/proto/eval.pro, src/proto/ex_cmds.pro, src/proto/mark.pro,
23 src/option.c, src/structs.h, src/vim.h
24
25
26*** ../vim-7.2.030/runtime/doc/cmdline.txt Sat Aug 9 19:36:46 2008
27--- runtime/doc/cmdline.txt Thu Sep 18 22:55:27 2008
28***************
29*** 1,4 ****
30! *cmdline.txt* For Vim version 7.2. Last change: 2008 Jul 29
31
32
33 VIM REFERENCE MANUAL by Bram Moolenaar
34--- 1,4 ----
35! *cmdline.txt* For Vim version 7.2. Last change: 2008 Sep 18
36
37
38 VIM REFERENCE MANUAL by Bram Moolenaar
39***************
40*** 157,162 ****
41--- 157,167 ----
42 (doesn't work at the expression prompt; some
43 things such as changing the buffer or current
44 window are not allowed to avoid side effects)
45+ When the result is a |List| the items are used
46+ as lines. They can have line breaks inside
47+ too.
48+ When the result is a Float it's automatically
49+ converted to a String.
50 See |registers| about registers. {not in Vi}
51 Implementation detail: When using the |expression| register
52 and invoking setcmdpos(), this sets the position before
53***************
54*** 730,748 ****
55 In Ex commands, at places where a file name can be used, the following
56 characters have a special meaning. These can also be used in the expression
57 function expand() |expand()|.
58! % is replaced with the current file name *:_%*
59! # is replaced with the alternate file name *:_#*
60 #n (where n is a number) is replaced with the file name of
61! buffer n. "#0" is the same as "#"
62! ## is replaced with all names in the argument list *:_##*
63 concatenated, separated by spaces. Each space in a name
64 is preceded with a backslash.
65! Note that these give the file name as it was typed. If an absolute path is
66! needed (when using the file name from a different directory), you need to add
67! ":p". See |filename-modifiers|.
68 Note that backslashes are inserted before spaces, so that the command will
69 correctly interpret the file name. But this doesn't happen for shell
70! commands. For those you probably have to use quotes: >
71 :!ls "%"
72 :r !spell "%"
73
74--- 735,763 ----
75 In Ex commands, at places where a file name can be used, the following
76 characters have a special meaning. These can also be used in the expression
77 function expand() |expand()|.
78! % Is replaced with the current file name. *:_%* *c_%*
79! # Is replaced with the alternate file name. *:_#* *c_#*
80 #n (where n is a number) is replaced with the file name of
81! buffer n. "#0" is the same as "#".
82! ## Is replaced with all names in the argument list *:_##* *c_##*
83 concatenated, separated by spaces. Each space in a name
84 is preceded with a backslash.
85! #<n (where n is a number > 0) is replaced with old *:_#<* *c_#<*
86! file name n. See |:oldfiles| or |v:oldfiles| to get the
87! number. *E809*
88! {only when compiled with the +eval and +viminfo features}
89!
90! Note that these, except "#<n", give the file name as it was typed. If an
91! absolute path is needed (when using the file name from a different directory),
92! you need to add ":p". See |filename-modifiers|.
93!
94! The "#<n" item returns an absolute path, but it will start with "~/" for files
95! below your home directory.
96!
97 Note that backslashes are inserted before spaces, so that the command will
98 correctly interpret the file name. But this doesn't happen for shell
99! commands. For those you probably have to use quotes (this fails for files
100! that contain a quote and wildcards): >
101 :!ls "%"
102 :r !spell "%"
103
104*** ../vim-7.2.030/runtime/doc/eval.txt Sat Aug 9 19:36:47 2008
105--- runtime/doc/eval.txt Sun Nov 2 14:25:38 2008
106***************
107*** 1,4 ****
108! *eval.txt* For Vim version 7.2. Last change: 2008 Aug 09
109
110
111 VIM REFERENCE MANUAL by Bram Moolenaar
112--- 1,4 ----
113! *eval.txt* For Vim version 7.2. Last change: 2008 Nov 02
114
115
116 VIM REFERENCE MANUAL by Bram Moolenaar
117***************
118*** 1484,1489 ****
119--- 1484,1500 ----
120 This is the screen column number, like with |virtcol()|. The
121 value is zero when there was no mouse button click.
122
123+ *v:oldfiles* *oldfiles-variable*
124+ v:oldfiles List of file names that is loaded from the |viminfo| file on
125+ startup. These are the files that Vim remembers marks for.
126+ The length of the List is limited by the ' argument of the
127+ 'viminfo' option (default is 100).
128+ Also see |:oldfiles| and |c_#<|.
129+ The List can be modified, but this has no effect on what is
130+ stored in the |viminfo| file later. If you use values other
131+ than String this will cause trouble.
132+ {only when compiled with the +viminfo feature}
133+
134 *v:operator* *operator-variable*
135 v:operator The last operator given in Normal mode. This is a single
136 character except for commands starting with <g> or <z>,
137*** ../vim-7.2.030/runtime/doc/starting.txt Sat Aug 9 19:36:52 2008
138--- runtime/doc/starting.txt Sun Nov 9 12:12:19 2008
139***************
140*** 1,4 ****
141! *starting.txt* For Vim version 7.2. Last change: 2008 Jun 21
142
143
144 VIM REFERENCE MANUAL by Bram Moolenaar
145--- 1,4 ----
146! *starting.txt* For Vim version 7.2. Last change: 2008 Nov 09
147
148
149 VIM REFERENCE MANUAL by Bram Moolenaar
150***************
151*** 1337,1344 ****
152 *viminfo-read*
153 When Vim is started and the 'viminfo' option is non-empty, the contents of
154 the viminfo file are read and the info can be used in the appropriate places.
155! The marks are not read in at startup (but file marks are). See
156! |initialization| for how to set the 'viminfo' option upon startup.
157
158 *viminfo-write*
159 When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo
160--- 1335,1343 ----
161 *viminfo-read*
162 When Vim is started and the 'viminfo' option is non-empty, the contents of
163 the viminfo file are read and the info can be used in the appropriate places.
164! The |v:oldfiles| variable is filled. The marks are not read in at startup
165! (but file marks are). See |initialization| for how to set the 'viminfo'
166! option upon startup.
167
168 *viminfo-write*
169 When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo
170***************
171*** 1372,1377 ****
172--- 1371,1378 ----
173 that start with any string given with the "r" flag in 'viminfo'. This can be
174 used to avoid saving marks for files on removable media (for MS-DOS you would
175 use "ra:,rb:", for Amiga "rdf0:,rdf1:,rdf2:").
176+ The |v:oldfiles| variable is filled with the file names that the viminfo file
177+ has marks for.
178
179 *viminfo-file-marks*
180 Uppercase marks ('A to 'Z) are stored when writing the viminfo file. The
181***************
182*** 1463,1470 ****
183 *:rv* *:rviminfo* *E195*
184 :rv[iminfo][!] [file] Read from viminfo file [file] (default: see above).
185 If [!] is given, then any information that is
186! already set (registers, marks, etc.) will be
187! overwritten. {not in Vi}
188
189 *:wv* *:wviminfo* *E137* *E138* *E574*
190 :wv[iminfo][!] [file] Write to viminfo file [file] (default: see above).
191--- 1464,1471 ----
192 *:rv* *:rviminfo* *E195*
193 :rv[iminfo][!] [file] Read from viminfo file [file] (default: see above).
194 If [!] is given, then any information that is
195! already set (registers, marks, |v:oldfiles|, etc.)
196! will be overwritten {not in Vi}
197
198 *:wv* *:wviminfo* *E137* *E138* *E574*
199 :wv[iminfo][!] [file] Write to viminfo file [file] (default: see above).
200***************
201*** 1479,1482 ****
202--- 1480,1499 ----
203 the .viminfo file.
204 {not in Vi}
205
206+ *:ol* *:oldfiles*
207+ :ol[dfiles] List the files that have marks stored in the viminfo
208+ file. This list is read on startup and only changes
209+ afterwards with ":rviminfo!". Also see |v:oldfiles|.
210+ The number can be used with |c_#<|.
211+ {not in Vi, only when compiled with the +eval feature}
212+
213+ :bro[wse] ol[dfiles][!]
214+ List file names as with |:oldfiles|, and then prompt
215+ for a number. When the number is valid that file from
216+ the list is edited.
217+ If you get the |press-enter| prompt you can press "q"
218+ and still get the prompt to enter a file number.
219+ Use ! to abondon a modified buffer. |abandon|
220+ {not when compiled with tiny or small features}
221+
222 vim:tw=78:ts=8:ft=help:norl:
223*** ../vim-7.2.030/runtime/doc/usr_21.txt Sat Aug 9 19:36:53 2008
224--- runtime/doc/usr_21.txt Sun Nov 9 12:14:10 2008
225***************
226*** 1,4 ****
227! *usr_21.txt* For Vim version 7.2. Last change: 2007 May 01
228
229 VIM USER MANUAL - by Bram Moolenaar
230
231--- 1,4 ----
232! *usr_21.txt* For Vim version 7.2. Last change: 2008 Nov 09
233
234 VIM USER MANUAL - by Bram Moolenaar
235
236***************
237*** 153,159 ****
238 to be lost. Each item can be remembered only once.
239
240
241! GETTING BACK TO WHERE YOU WERE
242
243 You are halfway editing a file and it's time to leave for holidays. You exit
244 Vim and go enjoy yourselves, forgetting all about your work. After a couple
245--- 153,159 ----
246 to be lost. Each item can be remembered only once.
247
248
249! GETTING BACK TO WHERE YOU STOPPED VIM
250
251 You are halfway editing a file and it's time to leave for holidays. You exit
252 Vim and go enjoy yourselves, forgetting all about your work. After a couple
253***************
254*** 168,173 ****
255--- 168,215 ----
256 The |:marks| command is useful to find out where '0 to '9 will take you.
257
258
259+ GETTING BACK TO SOME FILE
260+
261+ If you want to go back to a file that you edited recently, but not when
262+ exiting Vim, there is a slightly more complicated way. You can see a list of
263+ files by typing the command: >
264+
265+ :oldfiles
266+ < 1: ~/.viminfo ~
267+ 2: ~/text/resume.txt ~
268+ 3: /tmp/draft ~
269+
270+ Now you would like to edit the second file, which is in the list preceded by
271+ "2:". You type: >
272+
273+ :e #<2
274+
275+ Instead of ":e" you can use any command that has a file name argument, the
276+ "#<2" item works in the same place as "%" (current file name) and "#"
277+ (alternate file name). So you can also split the window to edit the third
278+ file: >
279+
280+ :split #<3
281+
282+ That #<123 thing is a bit complicated when you just want to edit a file.
283+ Fortunately there is a simpler way: >
284+
285+ :browse oldfiles
286+ < 1: ~/.viminfo ~
287+ 2: ~/text/resume.txt ~
288+ 3: /tmp/draft ~
289+ -- More --
290+
291+ You get the same list of files as with |:oldfiles|. If you want to edit
292+ "resume.txt" first press "q" to stop the listing. You will get a prompt:
293+
294+ Type number and <Enter> (empty cancels): ~
295+
296+ Type "2" and press <Enter> to edit the second file.
297+
298+ More info at |:oldfiles|, |v:oldfiles| and |c_#<|.
299+
300+
301 MOVE INFO FROM ONE VIM TO ANOTHER
302
303 You can use the ":wviminfo" and ":rviminfo" commands to save and restore the
304*** ../vim-7.2.030/src/eval.c Thu Nov 6 11:04:50 2008
305--- src/eval.c Sun Nov 9 11:59:39 2008
306***************
307*** 348,353 ****
308--- 348,354 ----
309 {VV_NAME("mouse_col", VAR_NUMBER), 0},
310 {VV_NAME("operator", VAR_STRING), VV_RO},
311 {VV_NAME("searchforward", VAR_NUMBER), 0},
312+ {VV_NAME("oldfiles", VAR_LIST), 0},
313 };
314
315 /* shorthand */
316***************
317*** 355,360 ****
318--- 356,362 ----
319 #define vv_nr vv_di.di_tv.vval.v_number
320 #define vv_float vv_di.di_tv.vval.v_float
321 #define vv_str vv_di.di_tv.vval.v_string
322+ #define vv_list vv_di.di_tv.vval.v_list
323 #define vv_tv vv_di.di_tv
324
325 /*
326***************
327*** 426,432 ****
328 static long list_idx_of_item __ARGS((list_T *l, listitem_T *item));
329 static void list_append __ARGS((list_T *l, listitem_T *item));
330 static int list_append_tv __ARGS((list_T *l, typval_T *tv));
331- static int list_append_string __ARGS((list_T *l, char_u *str, int len));
332 static int list_append_number __ARGS((list_T *l, varnumber_T n));
333 static int list_insert_tv __ARGS((list_T *l, typval_T *tv, listitem_T *item));
334 static int list_extend __ARGS((list_T *l1, list_T *l2, listitem_T *bef));
335--- 428,433 ----
336***************
337*** 845,852 ****
338 p = &vimvars[i];
339 if (p->vv_di.di_tv.v_type == VAR_STRING)
340 {
341! vim_free(p->vv_di.di_tv.vval.v_string);
342! p->vv_di.di_tv.vval.v_string = NULL;
343 }
344 }
345 hash_clear(&vimvarht);
346--- 846,858 ----
347 p = &vimvars[i];
348 if (p->vv_di.di_tv.v_type == VAR_STRING)
349 {
350! vim_free(p->vv_string);
351! p->vv_string = NULL;
352! }
353! else if (p->vv_di.di_tv.v_type == VAR_LIST)
354! {
355! list_unref(p->vv_list);
356! p->vv_list = NULL;
357 }
358 }
359 hash_clear(&vimvarht);
360***************
361*** 6057,6062 ****
362--- 6063,6087 ----
363 }
364
365 /*
366+ * Get list item "l[idx - 1]" as a string. Returns NULL for failure.
367+ */
368+ char_u *
369+ list_find_str(l, idx)
370+ list_T *l;
371+ long idx;
372+ {
373+ listitem_T *li;
374+
375+ li = list_find(l, idx - 1);
376+ if (li == NULL)
377+ {
378+ EMSGN(_(e_listidx), idx);
379+ return NULL;
380+ }
381+ return get_tv_string(&li->li_tv);
382+ }
383+
384+ /*
385 * Locate "item" list "l" and return its index.
386 * Returns -1 when "item" is not in the list.
387 */
388***************
389*** 6147,6153 ****
390 * When "len" >= 0 use "str[len]".
391 * Returns FAIL when out of memory.
392 */
393! static int
394 list_append_string(l, str, len)
395 list_T *l;
396 char_u *str;
397--- 6172,6178 ----
398 * When "len" >= 0 use "str[len]".
399 * Returns FAIL when out of memory.
400 */
401! int
402 list_append_string(l, str, len)
403 list_T *l;
404 char_u *str;
405***************
406*** 6507,6512 ****
407--- 6532,6540 ----
408 set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID);
409 }
410
411+ /* v: vars */
412+ set_ref_in_ht(&vimvarht, copyID);
413+
414 /*
415 * 2. Go through the list of dicts and free items without the copyID.
416 */
417***************
418*** 6597,6603 ****
419 {
420 case VAR_DICT:
421 dd = tv->vval.v_dict;
422! if (dd->dv_copyID != copyID)
423 {
424 /* Didn't see this dict yet. */
425 dd->dv_copyID = copyID;
426--- 6625,6631 ----
427 {
428 case VAR_DICT:
429 dd = tv->vval.v_dict;
430! if (dd != NULL && dd->dv_copyID != copyID)
431 {
432 /* Didn't see this dict yet. */
433 dd->dv_copyID = copyID;
434***************
435*** 6607,6613 ****
436
437 case VAR_LIST:
438 ll = tv->vval.v_list;
439! if (ll->lv_copyID != copyID)
440 {
441 /* Didn't see this list yet. */
442 ll->lv_copyID = copyID;
443--- 6635,6641 ----
444
445 case VAR_LIST:
446 ll = tv->vval.v_list;
447! if (ll != NULL && ll->lv_copyID != copyID)
448 {
449 /* Didn't see this list yet. */
450 ll->lv_copyID = copyID;
451***************
452*** 18106,18111 ****
453--- 18134,18150 ----
454 }
455
456 /*
457+ * Get List v: variable value. Caller must take care of reference count when
458+ * needed.
459+ */
460+ list_T *
461+ get_vim_var_list(idx)
462+ int idx;
463+ {
464+ return vimvars[idx].vv_list;
465+ }
466+
467+ /*
468 * Set v:count, v:count1 and v:prevcount.
469 */
470 void
471***************
472*** 18141,18146 ****
473--- 18180,18199 ----
474 }
475
476 /*
477+ * Set List v: variable to "val".
478+ */
479+ void
480+ set_vim_var_list(idx, val)
481+ int idx;
482+ list_T *val;
483+ {
484+ list_unref(vimvars[idx].vv_list);
485+ vimvars[idx].vv_list = val;
486+ if (val != NULL)
487+ ++val->lv_refcount;
488+ }
489+
490+ /*
491 * Set v:register if needed.
492 */
493 void
494***************
495*** 21900,21905 ****
496--- 21953,22014 ----
497 }
498 }
499
500+ /*
501+ * List v:oldfiles in a nice way.
502+ */
503+ /*ARGSUSED*/
504+ void
505+ ex_oldfiles(eap)
506+ exarg_T *eap;
507+ {
508+ list_T *l = vimvars[VV_OLDFILES].vv_list;
509+ listitem_T *li;
510+ int nr = 0;
511+
512+ if (l == NULL)
513+ msg((char_u *)_("No old files"));
514+ else
515+ {
516+ msg_start();
517+ msg_scroll = TRUE;
518+ for (li = l->lv_first; li != NULL && !got_int; li = li->li_next)
519+ {
520+ msg_outnum((long)++nr);
521+ MSG_PUTS(": ");
522+ msg_outtrans(get_tv_string(&li->li_tv));
523+ msg_putchar('\n');
524+ out_flush(); /* output one line at a time */
525+ ui_breakcheck();
526+ }
527+ /* Assume "got_int" was set to truncate the listing. */
528+ got_int = FALSE;
529+
530+ #ifdef FEAT_BROWSE_CMD
531+ if (cmdmod.browse)
532+ {
533+ quit_more = FALSE;
534+ nr = prompt_for_number(FALSE);
535+ msg_starthere();
536+ if (nr > 0)
537+ {
538+ char_u *p = list_find_str(get_vim_var_list(VV_OLDFILES),
539+ (long)nr);
540+
541+ if (p != NULL)
542+ {
543+ p = expand_env_save(p);
544+ eap->arg = p;
545+ eap->cmdidx = CMD_edit;
546+ cmdmod.browse = FALSE;
547+ do_exedit(eap, NULL);
548+ vim_free(p);
549+ }
550+ }
551+ }
552+ #endif
553+ }
554+ }
555+
556 #endif /* FEAT_EVAL */
557
558
559*** ../vim-7.2.030/src/ex_cmds.c Sun Sep 14 21:40:26 2008
560--- src/ex_cmds.c Sun Sep 14 13:45:03 2008
561***************
562*** 24,30 ****
563 static void do_filter __ARGS((linenr_T line1, linenr_T line2, exarg_T *eap, char_u *cmd, int do_in, int do_out));
564 #ifdef FEAT_VIMINFO
565 static char_u *viminfo_filename __ARGS((char_u *));
566! static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int want_info, int want_marks, int force_read));
567 static int viminfo_encoding __ARGS((vir_T *virp));
568 static int read_viminfo_up_to_marks __ARGS((vir_T *virp, int forceit, int writing));
569 #endif
570--- 24,30 ----
571 static void do_filter __ARGS((linenr_T line1, linenr_T line2, exarg_T *eap, char_u *cmd, int do_in, int do_out));
572 #ifdef FEAT_VIMINFO
573 static char_u *viminfo_filename __ARGS((char_u *));
574! static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int flags));
575 static int viminfo_encoding __ARGS((vir_T *virp));
576 static int read_viminfo_up_to_marks __ARGS((vir_T *virp, int forceit, int writing));
577 #endif
578***************
579*** 1676,1689 ****
580
581 /*
582 * read_viminfo() -- Read the viminfo file. Registers etc. which are already
583! * set are not over-written unless force is TRUE. -- webb
584 */
585 int
586! read_viminfo(file, want_info, want_marks, forceit)
587! char_u *file;
588! int want_info;
589! int want_marks;
590! int forceit;
591 {
592 FILE *fp;
593 char_u *fname;
594--- 1676,1687 ----
595
596 /*
597 * read_viminfo() -- Read the viminfo file. Registers etc. which are already
598! * set are not over-written unless "flags" includes VIF_FORCEIT. -- webb
599 */
600 int
601! read_viminfo(file, flags)
602! char_u *file; /* file name or NULL to use default name */
603! int flags; /* VIF_WANT_INFO et al. */
604 {
605 FILE *fp;
606 char_u *fname;
607***************
608*** 1691,1697 ****
609 if (no_viminfo())
610 return FAIL;
611
612! fname = viminfo_filename(file); /* may set to default if NULL */
613 if (fname == NULL)
614 return FAIL;
615 fp = mch_fopen((char *)fname, READBIN);
616--- 1689,1695 ----
617 if (no_viminfo())
618 return FAIL;
619
620! fname = viminfo_filename(file); /* get file name in allocated buffer */
621 if (fname == NULL)
622 return FAIL;
623 fp = mch_fopen((char *)fname, READBIN);
624***************
625*** 1701,1708 ****
626 verbose_enter();
627 smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"),
628 fname,
629! want_info ? _(" info") : "",
630! want_marks ? _(" marks") : "",
631 fp == NULL ? _(" FAILED") : "");
632 verbose_leave();
633 }
634--- 1699,1707 ----
635 verbose_enter();
636 smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"),
637 fname,
638! (flags & VIF_WANT_INFO) ? _(" info") : "",
639! (flags & VIF_WANT_MARKS) ? _(" marks") : "",
640! (flags & VIF_GET_OLDFILES) ? _(" oldfiles") : "",
641 fp == NULL ? _(" FAILED") : "");
642 verbose_leave();
643 }
644***************
645*** 1712,1721 ****
646 return FAIL;
647
648 viminfo_errcnt = 0;
649! do_viminfo(fp, NULL, want_info, want_marks, forceit);
650
651 fclose(fp);
652-
653 return OK;
654 }
655
656--- 1711,1719 ----
657 return FAIL;
658
659 viminfo_errcnt = 0;
660! do_viminfo(fp, NULL, flags);
661
662 fclose(fp);
663 return OK;
664 }
665
666***************
667*** 1968,1974 ****
668 }
669
670 viminfo_errcnt = 0;
671! do_viminfo(fp_in, fp_out, !forceit, !forceit, FALSE);
672
673 fclose(fp_out); /* errors are ignored !? */
674 if (fp_in != NULL)
675--- 1966,1972 ----
676 }
677
678 viminfo_errcnt = 0;
679! do_viminfo(fp_in, fp_out, forceit ? 0 : (VIF_WANT_INFO | VIF_WANT_MARKS));
680
681 fclose(fp_out); /* errors are ignored !? */
682 if (fp_in != NULL)
683***************
684*** 2041,2052 ****
685 * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo().
686 */
687 static void
688! do_viminfo(fp_in, fp_out, want_info, want_marks, force_read)
689 FILE *fp_in;
690 FILE *fp_out;
691! int want_info;
692! int want_marks;
693! int force_read;
694 {
695 int count = 0;
696 int eof = FALSE;
697--- 2039,2048 ----
698 * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo().
699 */
700 static void
701! do_viminfo(fp_in, fp_out, flags)
702 FILE *fp_in;
703 FILE *fp_out;
704! int flags;
705 {
706 int count = 0;
707 int eof = FALSE;
708***************
709*** 2061,2068 ****
710
711 if (fp_in != NULL)
712 {
713! if (want_info)
714! eof = read_viminfo_up_to_marks(&vir, force_read, fp_out != NULL);
715 else
716 /* Skip info, find start of marks */
717 while (!(eof = viminfo_readline(&vir))
718--- 2057,2065 ----
719
720 if (fp_in != NULL)
721 {
722! if (flags & VIF_WANT_INFO)
723! eof = read_viminfo_up_to_marks(&vir,
724! flags & VIF_FORCEIT, fp_out != NULL);
725 else
726 /* Skip info, find start of marks */
727 while (!(eof = viminfo_readline(&vir))
728***************
729*** 2092,2099 ****
730 write_viminfo_bufferlist(fp_out);
731 count = write_viminfo_marks(fp_out);
732 }
733! if (fp_in != NULL && want_marks)
734! copy_viminfo_marks(&vir, fp_out, count, eof);
735
736 vim_free(vir.vir_line);
737 #ifdef FEAT_MBYTE
738--- 2089,2097 ----
739 write_viminfo_bufferlist(fp_out);
740 count = write_viminfo_marks(fp_out);
741 }
742! if (fp_in != NULL
743! && (flags & (VIF_WANT_MARKS | VIF_GET_OLDFILES | VIF_FORCEIT)))
744! copy_viminfo_marks(&vir, fp_out, count, eof, flags);
745
746 vim_free(vir.vir_line);
747 #ifdef FEAT_MBYTE
748*** ../vim-7.2.030/src/ex_cmds.h Thu Nov 6 20:47:00 2008
749--- src/ex_cmds.h Thu Sep 18 22:18:14 2008
750***************
751*** 653,658 ****
752--- 653,660 ----
753 EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
754 EX(CMD_open, "open", ex_open,
755 RANGE|EXTRA),
756+ EX(CMD_oldfiles, "oldfiles", ex_oldfiles,
757+ BANG|TRLBAR|SBOXOK|CMDWIN),
758 EX(CMD_omap, "omap", ex_map,
759 EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
760 EX(CMD_omapclear, "omapclear", ex_mapclear,
761*** ../vim-7.2.030/src/ex_docmd.c Thu Nov 6 17:16:06 2008
762--- src/ex_docmd.c Mon Nov 3 21:21:17 2008
763***************
764*** 364,369 ****
765--- 364,370 ----
766 # define ex_function ex_ni
767 # define ex_delfunction ex_ni
768 # define ex_return ex_ni
769+ # define ex_oldfiles ex_ni
770 #endif
771 static char_u *arg_all __ARGS((void));
772 #ifdef FEAT_SESSION
773***************
774*** 1770,1776 ****
775 }
776 if (checkforcmd(&ea.cmd, "browse", 3))
777 {
778! #ifdef FEAT_BROWSE
779 cmdmod.browse = TRUE;
780 #endif
781 continue;
782--- 1771,1777 ----
783 }
784 if (checkforcmd(&ea.cmd, "browse", 3))
785 {
786! #ifdef FEAT_BROWSE_CMD
787 cmdmod.browse = TRUE;
788 #endif
789 continue;
790***************
791*** 9508,9531 ****
792 break;
793 }
794 s = src + 1;
795 i = (int)getdigits(&s);
796 *usedlen = (int)(s - src); /* length of what we expand */
797
798! buf = buflist_findnr(i);
799! if (buf == NULL)
800 {
801! *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'");
802 return NULL;
803 }
804! if (lnump != NULL)
805! *lnump = ECMD_LAST;
806! if (buf->b_fname == NULL)
807 {
808! result = (char_u *)"";
809! valid = 0; /* Must have ":p:h" to be valid */
810 }
811- else
812- result = buf->b_fname;
813 break;
814
815 #ifdef FEAT_SEARCHPATH
816--- 9509,9558 ----
817 break;
818 }
819 s = src + 1;
820+ if (*s == '<') /* "#<99" uses v:oldfiles */
821+ ++s;
822 i = (int)getdigits(&s);
823 *usedlen = (int)(s - src); /* length of what we expand */
824
825! if (src[1] == '<')
826 {
827! if (*usedlen < 2)
828! {
829! /* Should we give an error message for #<text? */
830! *usedlen = 1;
831! return NULL;
832! }
833! #ifdef FEAT_EVAL
834! result = list_find_str(get_vim_var_list(VV_OLDFILES),
835! (long)i);
836! if (result == NULL)
837! {
838! *errormsg = (char_u *)"";
839! return NULL;
840! }
841! #else
842! *errormsg = (char_u *)_("E809: #< is not available without the +eval feature");
843 return NULL;
844+ #endif
845 }
846! else
847 {
848! buf = buflist_findnr(i);
849! if (buf == NULL)
850! {
851! *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'");
852! return NULL;
853! }
854! if (lnump != NULL)
855! *lnump = ECMD_LAST;
856! if (buf->b_fname == NULL)
857! {
858! result = (char_u *)"";
859! valid = 0; /* Must have ":p:h" to be valid */
860! }
861! else
862! result = buf->b_fname;
863 }
864 break;
865
866 #ifdef FEAT_SEARCHPATH
867***************
868*** 10700,10706 ****
869 p_viminfo = (char_u *)"'100";
870 if (eap->cmdidx == CMD_rviminfo)
871 {
872! if (read_viminfo(eap->arg, TRUE, TRUE, eap->forceit) == FAIL)
873 EMSG(_("E195: Cannot open viminfo file for reading"));
874 }
875 else
876--- 10727,10734 ----
877 p_viminfo = (char_u *)"'100";
878 if (eap->cmdidx == CMD_rviminfo)
879 {
880! if (read_viminfo(eap->arg, VIF_WANT_INFO | VIF_WANT_MARKS
881! | (eap->forceit ? VIF_FORCEIT : 0)) == FAIL)
882 EMSG(_("E195: Cannot open viminfo file for reading"));
883 }
884 else
885*** ../vim-7.2.030/src/feature.h Wed Aug 6 18:45:07 2008
886--- src/feature.h Fri Sep 19 19:14:22 2008
887***************
888*** 767,775 ****
889
890 /*
891 * +browse ":browse" command.
892 */
893! #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))
894! # define FEAT_BROWSE
895 #endif
896
897 /*
898--- 767,779 ----
899
900 /*
901 * +browse ":browse" command.
902+ * or just the ":browse" command modifier
903 */
904! #if defined(FEAT_NORMAL)
905! # define FEAT_BROWSE_CMD
906! # 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)
907! # define FEAT_BROWSE
908! # endif
909 #endif
910
911 /*
912*** ../vim-7.2.030/src/fileio.c Thu Sep 18 21:29:07 2008
913--- src/fileio.c Mon Nov 3 21:21:47 2008
914***************
915*** 2711,2717 ****
916 {
917 if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
918 && curbuf->b_ffname != NULL)
919! read_viminfo(NULL, FALSE, TRUE, FALSE);
920
921 /* Always set b_marks_read; needed when 'viminfo' is changed to include
922 * the ' parameter after opening a buffer. */
923--- 2711,2717 ----
924 {
925 if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
926 && curbuf->b_ffname != NULL)
927! read_viminfo(NULL, VIF_WANT_MARKS);
928
929 /* Always set b_marks_read; needed when 'viminfo' is changed to include
930 * the ' parameter after opening a buffer. */
931***************
932*** 9108,9114 ****
933 set_context_in_autocmd(xp, arg, doautocmd)
934 expand_T *xp;
935 char_u *arg;
936! int doautocmd; /* TRUE for :doautocmd, FALSE for :autocmd */
937 {
938 char_u *p;
939 int group;
940--- 9109,9115 ----
941 set_context_in_autocmd(xp, arg, doautocmd)
942 expand_T *xp;
943 char_u *arg;
944! int doautocmd; /* TRUE for :doauto*, FALSE for :autocmd */
945 {
946 char_u *p;
947 int group;
948*** ../vim-7.2.030/src/main.c Thu Sep 18 20:55:19 2008
949--- src/main.c Sun Sep 14 13:26:10 2008
950***************
951*** 645,655 ****
952
953 #ifdef FEAT_VIMINFO
954 /*
955! * Read in registers, history etc, but not marks, from the viminfo file
956 */
957 if (*p_viminfo != NUL)
958 {
959! read_viminfo(NULL, TRUE, FALSE, FALSE);
960 TIME_MSG("reading viminfo");
961 }
962 #endif
963--- 645,656 ----
964
965 #ifdef FEAT_VIMINFO
966 /*
967! * Read in registers, history etc, but not marks, from the viminfo file.
968! * This is where v:oldfiles gets filled.
969 */
970 if (*p_viminfo != NUL)
971 {
972! read_viminfo(NULL, VIF_WANT_INFO | VIF_GET_OLDFILES);
973 TIME_MSG("reading viminfo");
974 }
975 #endif
976*** ../vim-7.2.030/src/mark.c Sat Aug 9 19:37:29 2008
977--- src/mark.c Sun Sep 14 13:46:19 2008
978***************
979*** 1627,1641 ****
980
981 /*
982 * Handle marks in the viminfo file:
983! * fp_out == NULL read marks for current buffer only
984! * fp_out != NULL copy marks for buffers not in buffer list
985 */
986 void
987! copy_viminfo_marks(virp, fp_out, count, eof)
988 vir_T *virp;
989 FILE *fp_out;
990 int count;
991 int eof;
992 {
993 char_u *line = virp->vir_line;
994 buf_T *buf;
995--- 1627,1643 ----
996
997 /*
998 * Handle marks in the viminfo file:
999! * fp_out != NULL: copy marks for buffers not in buffer list
1000! * fp_out == NULL && (flags & VIF_WANT_MARKS): read marks for curbuf only
1001! * fp_out == NULL && (flags & VIF_GET_OLDFILES | VIF_FORCEIT): fill v:oldfiles
1002 */
1003 void
1004! copy_viminfo_marks(virp, fp_out, count, eof, flags)
1005 vir_T *virp;
1006 FILE *fp_out;
1007 int count;
1008 int eof;
1009+ int flags;
1010 {
1011 char_u *line = virp->vir_line;
1012 buf_T *buf;
1013***************
1014*** 1647,1656 ****
1015--- 1649,1671 ----
1016 char_u *p;
1017 char_u *name_buf;
1018 pos_T pos;
1019+ #ifdef FEAT_EVAL
1020+ list_T *list = NULL;
1021+ #endif
1022
1023 if ((name_buf = alloc(LSIZE)) == NULL)
1024 return;
1025 *name_buf = NUL;
1026+
1027+ #ifdef FEAT_EVAL
1028+ if (fp_out == NULL && (flags & (VIF_GET_OLDFILES | VIF_FORCEIT)))
1029+ {
1030+ list = list_alloc();
1031+ if (list != NULL)
1032+ set_vim_var_list(VV_OLDFILES, list);
1033+ }
1034+ #endif
1035+
1036 num_marked_files = get_viminfo_parameter('\'');
1037 while (!eof && (count < num_marked_files || fp_out == NULL))
1038 {
1039***************
1040*** 1681,1686 ****
1041--- 1696,1706 ----
1042 p++;
1043 *p = NUL;
1044
1045+ #ifdef FEAT_EVAL
1046+ if (list != NULL)
1047+ list_append_string(list, str, -1);
1048+ #endif
1049+
1050 /*
1051 * If fp_out == NULL, load marks for current buffer.
1052 * If fp_out != NULL, copy marks for buffers not in buflist.
1053***************
1054*** 1688,1694 ****
1055 load_marks = copy_marks_out = FALSE;
1056 if (fp_out == NULL)
1057 {
1058! if (curbuf->b_ffname != NULL)
1059 {
1060 if (*name_buf == NUL) /* only need to do this once */
1061 home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE);
1062--- 1708,1714 ----
1063 load_marks = copy_marks_out = FALSE;
1064 if (fp_out == NULL)
1065 {
1066! if ((flags & VIF_WANT_MARKS) && curbuf->b_ffname != NULL)
1067 {
1068 if (*name_buf == NUL) /* only need to do this once */
1069 home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE);
1070*** ../vim-7.2.030/src/misc1.c Wed Jun 25 00:24:52 2008
1071--- src/misc1.c Sun Nov 9 11:47:00 2008
1072***************
1073*** 3245,3253 ****
1074
1075 /* When using ":silent" assume that <CR> was entered. */
1076 if (mouse_used != NULL)
1077! MSG_PUTS(_("Type number or click with mouse (<Enter> cancels): "));
1078 else
1079! MSG_PUTS(_("Choice number (<Enter> cancels): "));
1080
1081 /* Set the state such that text can be selected/copied/pasted and we still
1082 * get mouse events. */
1083--- 3245,3253 ----
1084
1085 /* When using ":silent" assume that <CR> was entered. */
1086 if (mouse_used != NULL)
1087! MSG_PUTS(_("Type number and <Enter> or click with mouse (empty cancels): "));
1088 else
1089! MSG_PUTS(_("Type number and <Enter> (empty cancels): "));
1090
1091 /* Set the state such that text can be selected/copied/pasted and we still
1092 * get mouse events. */
1093*** ../vim-7.2.030/src/proto/eval.pro Sun Jan 6 20:06:30 2008
1094--- src/proto/eval.pro Sun Nov 9 12:05:56 2008
1095***************
1096*** 17,23 ****
1097 int eval_to_bool __ARGS((char_u *arg, int *error, char_u **nextcmd, int skip));
1098 char_u *eval_to_string_skip __ARGS((char_u *arg, char_u **nextcmd, int skip));
1099 int skip_expr __ARGS((char_u **pp));
1100! char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int dolist));
1101 char_u *eval_to_string_safe __ARGS((char_u *arg, char_u **nextcmd, int use_sandbox));
1102 int eval_to_number __ARGS((char_u *expr));
1103 list_T *eval_spell_expr __ARGS((char_u *badword, char_u *expr));
1104--- 17,23 ----
1105 int eval_to_bool __ARGS((char_u *arg, int *error, char_u **nextcmd, int skip));
1106 char_u *eval_to_string_skip __ARGS((char_u *arg, char_u **nextcmd, int skip));
1107 int skip_expr __ARGS((char_u **pp));
1108! char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int convert));
1109 char_u *eval_to_string_safe __ARGS((char_u *arg, char_u **nextcmd, int use_sandbox));
1110 int eval_to_number __ARGS((char_u *expr));
1111 list_T *eval_spell_expr __ARGS((char_u *badword, char_u *expr));
1112***************
1113*** 46,52 ****
1114--- 46,54 ----
1115 void list_unref __ARGS((list_T *l));
1116 void list_free __ARGS((list_T *l, int recurse));
1117 dictitem_T *dict_lookup __ARGS((hashitem_T *hi));
1118+ char_u *list_find_str __ARGS((list_T *l, long idx));
1119 int list_append_dict __ARGS((list_T *list, dict_T *dict));
1120+ int list_append_string __ARGS((list_T *l, char_u *str, int len));
1121 int garbage_collect __ARGS((void));
1122 dict_T *dict_alloc __ARGS((void));
1123 int dict_add_nr_str __ARGS((dict_T *d, char *key, long nr, char_u *str));
1124***************
1125*** 58,65 ****
1126--- 60,69 ----
1127 void set_vim_var_nr __ARGS((int idx, long val));
1128 long get_vim_var_nr __ARGS((int idx));
1129 char_u *get_vim_var_str __ARGS((int idx));
1130+ list_T *get_vim_var_list __ARGS((int idx));
1131 void set_vcount __ARGS((long count, long count1));
1132 void set_vim_var_string __ARGS((int idx, char_u *val, int len));
1133+ void set_vim_var_list __ARGS((int idx, list_T *val));
1134 void set_reg_var __ARGS((int c));
1135 char_u *v_exception __ARGS((char_u *oldval));
1136 char_u *v_throwpoint __ARGS((char_u *oldval));
1137***************
1138*** 94,99 ****
1139--- 98,104 ----
1140 void write_viminfo_varlist __ARGS((FILE *fp));
1141 int store_session_globals __ARGS((FILE *fd));
1142 void last_set_msg __ARGS((scid_T scriptID));
1143+ void ex_oldfiles __ARGS((exarg_T *eap));
1144 int modify_fname __ARGS((char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen));
1145 char_u *do_string_sub __ARGS((char_u *str, char_u *pat, char_u *sub, char_u *flags));
1146 /* vim: set ft=c : */
1147*** ../vim-7.2.030/src/proto/ex_cmds.pro Sat May 5 20:13:58 2007
1148--- src/proto/ex_cmds.pro Sat Sep 13 17:27:21 2008
1149***************
1150*** 11,17 ****
1151 char_u *make_filter_cmd __ARGS((char_u *cmd, char_u *itmp, char_u *otmp));
1152 void append_redir __ARGS((char_u *buf, char_u *opt, char_u *fname));
1153 int viminfo_error __ARGS((char *errnum, char *message, char_u *line));
1154! int read_viminfo __ARGS((char_u *file, int want_info, int want_marks, int forceit));
1155 void write_viminfo __ARGS((char_u *file, int forceit));
1156 int viminfo_readline __ARGS((vir_T *virp));
1157 char_u *viminfo_readstring __ARGS((vir_T *virp, int off, int convert));
1158--- 11,17 ----
1159 char_u *make_filter_cmd __ARGS((char_u *cmd, char_u *itmp, char_u *otmp));
1160 void append_redir __ARGS((char_u *buf, char_u *opt, char_u *fname));
1161 int viminfo_error __ARGS((char *errnum, char *message, char_u *line));
1162! int read_viminfo __ARGS((char_u *file, int flags));
1163 void write_viminfo __ARGS((char_u *file, int forceit));
1164 int viminfo_readline __ARGS((vir_T *virp));
1165 char_u *viminfo_readstring __ARGS((vir_T *virp, int off, int convert));
1166*** ../vim-7.2.030/src/proto/mark.pro Sat May 5 19:29:37 2007
1167--- src/proto/mark.pro Sat Sep 13 18:06:20 2008
1168***************
1169*** 26,30 ****
1170 void write_viminfo_filemarks __ARGS((FILE *fp));
1171 int removable __ARGS((char_u *name));
1172 int write_viminfo_marks __ARGS((FILE *fp_out));
1173! void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof));
1174 /* vim: set ft=c : */
1175--- 26,30 ----
1176 void write_viminfo_filemarks __ARGS((FILE *fp));
1177 int removable __ARGS((char_u *name));
1178 int write_viminfo_marks __ARGS((FILE *fp_out));
1179! void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof, int flags));
1180 /* vim: set ft=c : */
1181*** ../vim-7.2.030/src/option.c Thu Oct 2 22:48:01 2008
1182--- src/option.c Fri Sep 26 22:20:20 2008
1183***************
1184*** 2593,2605 ****
1185 #ifdef FEAT_VIMINFO
1186 (char_u *)&p_viminfo, PV_NONE,
1187 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
1188! {(char_u *)"", (char_u *)"'20,<50,s10,h,rA:,rB:"}
1189 #else
1190 # ifdef AMIGA
1191 {(char_u *)"",
1192! (char_u *)"'20,<50,s10,h,rdf0:,rdf1:,rdf2:"}
1193 # else
1194! {(char_u *)"", (char_u *)"'20,<50,s10,h"}
1195 # endif
1196 #endif
1197 #else
1198--- 2593,2605 ----
1199 #ifdef FEAT_VIMINFO
1200 (char_u *)&p_viminfo, PV_NONE,
1201 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
1202! {(char_u *)"", (char_u *)"'100,<50,s10,h,rA:,rB:"}
1203 #else
1204 # ifdef AMIGA
1205 {(char_u *)"",
1206! (char_u *)"'100,<50,s10,h,rdf0:,rdf1:,rdf2:"}
1207 # else
1208! {(char_u *)"", (char_u *)"'100,<50,s10,h"}
1209 # endif
1210 #endif
1211 #else
1212*** ../vim-7.2.030/src/structs.h Thu Jul 31 22:04:27 2008
1213--- src/structs.h Fri Sep 19 19:15:18 2008
1214***************
1215*** 459,465 ****
1216 typedef struct
1217 {
1218 int hide; /* TRUE when ":hide" was used */
1219! # ifdef FEAT_BROWSE
1220 int browse; /* TRUE to invoke file dialog */
1221 # endif
1222 # ifdef FEAT_WINDOWS
1223--- 459,465 ----
1224 typedef struct
1225 {
1226 int hide; /* TRUE when ":hide" was used */
1227! # ifdef FEAT_BROWSE_CMD
1228 int browse; /* TRUE to invoke file dialog */
1229 # endif
1230 # ifdef FEAT_WINDOWS
1231*** ../vim-7.2.030/src/vim.h Sat Aug 9 19:37:40 2008
1232--- src/vim.h Sat Sep 13 17:41:24 2008
1233***************
1234*** 1728,1734 ****
1235 #define VV_MOUSE_COL 51
1236 #define VV_OP 52
1237 #define VV_SEARCHFORWARD 53
1238! #define VV_LEN 54 /* number of v: vars */
1239
1240 #ifdef FEAT_CLIPBOARD
1241
1242--- 1728,1735 ----
1243 #define VV_MOUSE_COL 51
1244 #define VV_OP 52
1245 #define VV_SEARCHFORWARD 53
1246! #define VV_OLDFILES 54
1247! #define VV_LEN 55 /* number of v: vars */
1248
1249 #ifdef FEAT_CLIPBOARD
1250
1251***************
1252*** 2054,2057 ****
1253--- 2055,2064 ----
1254 #define DOSO_VIMRC 1 /* loading vimrc file */
1255 #define DOSO_GVIMRC 2 /* loading gvimrc file */
1256
1257+ /* flags for read_viminfo() and children */
1258+ #define VIF_WANT_INFO 1 /* load non-mark info */
1259+ #define VIF_WANT_MARKS 2 /* load file marks */
1260+ #define VIF_FORCEIT 4 /* overwrite info already read */
1261+ #define VIF_GET_OLDFILES 8 /* load v:oldfiles */
1262+
1263 #endif /* VIM__H */
1264*** ../vim-7.2.030/src/version.c Thu Nov 6 20:47:00 2008
1265--- src/version.c Sun Nov 9 13:39:19 2008
1266***************
1267*** 678,679 ****
1268--- 678,681 ----
1269 { /* Add new patch number below this line */
1270+ /**/
1271+ 31,
1272 /**/
1273
1274--
1275hundred-and-one symptoms of being an internet addict:
1276217. Your sex life has drastically improved...so what if it's only cyber-sex!
1277
1278 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
1279/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
1280\\\ download, build and distribute -- http://www.A-A-P.org ///
1281 \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
This page took 0.177185 seconds and 4 git commands to generate.