4 From: Bram Moolenaar <Bram@moolenaar.net>
6 Content-Type: text/plain; charset=ISO-8859-1
7 Content-Transfer-Encoding: 8bit
11 Problem: The matchparen plugin may take an unexpected amount of time, so
12 that it looks like Vim hangs.
13 Solution: Add a timeout to searchpair(), searchpairpos(), search() and
14 searchpos(). Use half a second timeout in the plugin.
15 Files: runtime/doc/eval.txt, runtime/plugin/matchparen.vim, src/edit.c,
16 src/eval.c, src/ex_cmds2.c, src/ex_docmd.c, src/normal.c,
17 src/proto/eval.pro, src/proto/ex_cmds2.pro, src/proto/search.pro,
21 *** ../vim-7.1.210/runtime/doc/eval.txt Sat Jan 5 13:34:01 2008
22 --- runtime/doc/eval.txt Sun Jan 6 16:27:33 2008
25 ! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 04
28 VIM REFERENCE MANUAL by Bram Moolenaar
30 ! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 06
33 VIM REFERENCE MANUAL by Bram Moolenaar
36 repeat( {expr}, {count}) String repeat {expr} {count} times
37 resolve( {filename}) String get filename a shortcut points to
38 reverse( {list}) List reverse {list} in-place
39 ! search( {pattern} [, {flags}]) Number search for {pattern}
40 searchdecl({name} [, {global} [, {thisblock}]])
41 Number search for variable declaration
42 ! searchpair( {start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]])
43 Number search for other end of start/end pair
44 ! searchpairpos( {start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]])
45 List search for other end of start/end pair
46 ! searchpos( {pattern} [, {flags} [, {stopline}]])
47 List search for {pattern}
48 server2client( {clientid}, {string})
49 Number send reply string
51 repeat( {expr}, {count}) String repeat {expr} {count} times
52 resolve( {filename}) String get filename a shortcut points to
53 reverse( {list}) List reverse {list} in-place
54 ! search( {pattern} [, {flags} [, {stopline} [, {timeout}]]])
55 ! Number search for {pattern}
56 searchdecl({name} [, {global} [, {thisblock}]])
57 Number search for variable declaration
58 ! searchpair( {start}, {middle}, {end} [, {flags} [, {skip} [...]]])
59 Number search for other end of start/end pair
60 ! searchpairpos( {start}, {middle}, {end} [, {flags} [, {skip} [...]]])
61 List search for other end of start/end pair
62 ! searchpos( {pattern} [, {flags} [, {stopline} [, {timeout}]]])
63 List search for {pattern}
64 server2client( {clientid}, {string})
65 Number send reply string
68 If you want a list to remain unmodified make a copy first: >
69 :let revlist = reverse(copy(mylist))
71 ! search({pattern} [, {flags} [, {stopline}]]) *search()*
72 Search for regexp pattern {pattern}. The search starts at the
73 cursor position (you can use |cursor()| to set it).
76 If you want a list to remain unmodified make a copy first: >
77 :let revlist = reverse(copy(mylist))
79 ! search({pattern} [, {flags} [, {stopline} [, {timeout}]]]) *search()*
80 Search for regexp pattern {pattern}. The search starts at the
81 cursor position (you can use |cursor()| to set it).
86 let end = search('END', '', line("w$"))
87 < When {stopline} is used and it is not zero this also implies
88 that the search does not wrap around the end of the file.
89 + A zero value is equal to not giving the argument.
91 + When the {timeout} argument is given the search stops when
92 + more than this many milli seconds have passed. Thus when
93 + {timeout} is 500 the search stops after half a second.
94 + The value must not be negative. A zero value is like not
95 + giving the argument.
96 + {only available when compiled with the +reltime feature}
98 If there is no match a 0 is returned and the cursor doesn't
99 move. No error message is given.
105 ! searchpair({start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]])
106 Search for the match of a nested start-end pair. This can be
107 used to find the "endif" that matches an "if", while other
108 if/endif pairs in between are ignored.
113 ! searchpair({start}, {middle}, {end} [, {flags} [, {skip}
114 ! [, {stopline} [, {timeout}]]]])
115 Search for the match of a nested start-end pair. This can be
116 used to find the "endif" that matches an "if", while other
117 if/endif pairs in between are ignored.
120 When evaluating {skip} causes an error the search is aborted
123 ! For {stopline} see |search()|.
125 The value of 'ignorecase' is used. 'magic' is ignored, the
126 patterns are used like it's on.
128 When evaluating {skip} causes an error the search is aborted
131 ! For {stopline} and {timeout} see |search()|.
133 The value of 'ignorecase' is used. 'magic' is ignored, the
134 patterns are used like it's on.
137 \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"')
140 ! searchpairpos({start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]])
141 Same as searchpair(), but returns a |List| with the line and
142 column position of the match. The first element of the |List|
143 is the line number and the second element is the byte index of
145 \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"')
148 ! searchpairpos({start}, {middle}, {end} [, {flags} [, {skip}
149 ! [, {stopline} [, {timeout}]]]])
150 Same as searchpair(), but returns a |List| with the line and
151 column position of the match. The first element of the |List|
152 is the line number and the second element is the byte index of
156 See |match-parens| for a bigger and more useful example.
158 ! searchpos({pattern} [, {flags} [, {stopline}]]) *searchpos()*
159 Same as |search()|, but returns a |List| with the line and
160 column position of the match. The first element of the |List|
161 is the line number and the second element is the byte index of
164 See |match-parens| for a bigger and more useful example.
166 ! searchpos({pattern} [, {flags} [, {stopline} [, {timeout}]]]) *searchpos()*
167 Same as |search()|, but returns a |List| with the line and
168 column position of the match. The first element of the |List|
169 is the line number and the second element is the byte index of
170 *** ../vim-7.1.210/runtime/plugin/matchparen.vim Sat Aug 18 18:20:57 2007
171 --- runtime/plugin/matchparen.vim Sun Jan 6 16:22:39 2008
174 " Vim plugin for showing matching parens
175 " Maintainer: Bram Moolenaar <Bram@vim.org>
176 ! " Last Change: 2007 Aug 8
179 " - this plugin was already loaded (or disabled)
181 " Vim plugin for showing matching parens
182 " Maintainer: Bram Moolenaar <Bram@vim.org>
183 ! " Last Change: 2008 Jan 06
186 " - this plugin was already loaded (or disabled)
189 \ '=~? "string\\|character\\|singlequote\\|comment"'
190 execute 'if' s_skip '| let s_skip = 0 | endif'
192 ! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline)
195 call winrestview(save_cursor)
197 \ '=~? "string\\|character\\|singlequote\\|comment"'
198 execute 'if' s_skip '| let s_skip = 0 | endif'
201 ! " Limit the search time to 500 msec to avoid a hang on very long lines.
202 ! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 500)
204 ! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline)
208 call winrestview(save_cursor)
209 *** ../vim-7.1.210/src/edit.c Wed Jan 2 22:08:43 2008
210 --- src/edit.c Sun Jan 6 16:08:00 2008
213 found_new_match = searchit(NULL, ins_buf, pos,
215 compl_pattern, 1L, SEARCH_KEEP + SEARCH_NFMSG,
216 ! RE_LAST, (linenr_T)0);
221 found_new_match = searchit(NULL, ins_buf, pos,
223 compl_pattern, 1L, SEARCH_KEEP + SEARCH_NFMSG,
224 ! RE_LAST, (linenr_T)0, NULL);
228 *** ../vim-7.1.210/src/eval.c Sat Jan 5 22:15:21 2008
229 --- src/eval.c Sun Jan 6 16:37:42 2008
232 {"repeat", 2, 2, f_repeat},
233 {"resolve", 1, 1, f_resolve},
234 {"reverse", 1, 1, f_reverse},
235 ! {"search", 1, 3, f_search},
236 {"searchdecl", 1, 3, f_searchdecl},
237 ! {"searchpair", 3, 6, f_searchpair},
238 ! {"searchpairpos", 3, 6, f_searchpairpos},
239 ! {"searchpos", 1, 3, f_searchpos},
240 {"server2client", 2, 2, f_server2client},
241 {"serverlist", 0, 0, f_serverlist},
242 {"setbufvar", 3, 3, f_setbufvar},
244 {"repeat", 2, 2, f_repeat},
245 {"resolve", 1, 1, f_resolve},
246 {"reverse", 1, 1, f_reverse},
247 ! {"search", 1, 4, f_search},
248 {"searchdecl", 1, 3, f_searchdecl},
249 ! {"searchpair", 3, 7, f_searchpair},
250 ! {"searchpairpos", 3, 7, f_searchpairpos},
251 ! {"searchpos", 1, 4, f_searchpos},
252 {"server2client", 2, 2, f_server2client},
253 {"serverlist", 0, 0, f_serverlist},
254 {"setbufvar", 3, 3, f_setbufvar},
259 int retval = 0; /* default: FAIL */
262 + #ifdef FEAT_RELTIME
263 + long time_limit = 0;
265 int options = SEARCH_KEEP;
271 options |= SEARCH_END;
273 ! /* Optional extra argument: line number to stop searching. */
274 ! if (argvars[1].v_type != VAR_UNKNOWN
275 ! && argvars[2].v_type != VAR_UNKNOWN)
277 lnum_stop = get_tv_number_chk(&argvars[2], NULL);
283 * This function does not accept SP_REPEAT and SP_RETCOUNT flags.
284 * Check to make sure only those flags are set.
287 options |= SEARCH_END;
289 ! /* Optional arguments: line number to stop searching and timeout. */
290 ! if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN)
292 lnum_stop = get_tv_number_chk(&argvars[2], NULL);
295 + #ifdef FEAT_RELTIME
296 + if (argvars[3].v_type != VAR_UNKNOWN)
298 + time_limit = get_tv_number_chk(&argvars[3], NULL);
299 + if (time_limit < 0)
305 + #ifdef FEAT_RELTIME
306 + /* Set the time limit, if there is one. */
307 + profile_setlimit(time_limit, &tm);
311 * This function does not accept SP_REPEAT and SP_RETCOUNT flags.
312 * Check to make sure only those flags are set.
316 pos = save_cursor = curwin->w_cursor;
317 subpatnum = searchit(curwin, curbuf, &pos, dir, pat, 1L,
318 ! options, RE_SEARCH, (linenr_T)lnum_stop);
319 if (subpatnum != FAIL)
321 if (flags & SP_SUBPAT)
324 pos = save_cursor = curwin->w_cursor;
325 subpatnum = searchit(curwin, curbuf, &pos, dir, pat, 1L,
326 ! options, RE_SEARCH, (linenr_T)lnum_stop, &tm);
327 if (subpatnum != FAIL)
329 if (flags & SP_SUBPAT)
333 char_u nbuf3[NUMBUFLEN];
334 int retval = 0; /* default: FAIL */
336 + long time_limit = 0;
338 /* Get the three pattern arguments: start, middle, end. */
339 spat = get_tv_string_chk(&argvars[0]);
342 lnum_stop = get_tv_number_chk(&argvars[5], NULL);
348 goto theend; /* type error */
350 retval = do_searchpair(spat, mpat, epat, dir, skip, flags,
351 ! match_pos, lnum_stop);
356 lnum_stop = get_tv_number_chk(&argvars[5], NULL);
359 + #ifdef FEAT_RELTIME
360 + if (argvars[6].v_type != VAR_UNKNOWN)
362 + time_limit = get_tv_number_chk(&argvars[6], NULL);
363 + if (time_limit < 0)
370 goto theend; /* type error */
372 retval = do_searchpair(spat, mpat, epat, dir, skip, flags,
373 ! match_pos, lnum_stop, time_limit);
379 * Returns 0 or -1 for no match,
382 ! do_searchpair(spat, mpat, epat, dir, skip, flags, match_pos, lnum_stop)
383 char_u *spat; /* start pattern */
384 char_u *mpat; /* middle pattern */
385 char_u *epat; /* end pattern */
387 * Returns 0 or -1 for no match,
390 ! do_searchpair(spat, mpat, epat, dir, skip, flags, match_pos,
391 ! lnum_stop, time_limit)
392 char_u *spat; /* start pattern */
393 char_u *mpat; /* middle pattern */
394 char_u *epat; /* end pattern */
398 int flags; /* SP_SETPCMARK and other SP_ values */
400 linenr_T lnum_stop; /* stop at this line if not zero */
401 + long time_limit; /* stop after this many msec */
404 char_u *pat, *pat2 = NULL, *pat3 = NULL;
410 int options = SEARCH_KEEP;
413 /* Make 'cpoptions' empty, the 'l' flag should not be used here. */
415 p_cpo = (char_u *)"";
417 + #ifdef FEAT_RELTIME
418 + /* Set the time limit, if there is one. */
419 + profile_setlimit(time_limit, &tm);
422 /* Make two search patterns: start/end (pat2, for in nested pairs) and
423 * start/middle/end (pat3, for the top pair). */
424 pat2 = alloc((unsigned)(STRLEN(spat) + STRLEN(epat) + 15));
429 n = searchit(curwin, curbuf, &pos, dir, pat, 1L,
430 ! options, RE_SEARCH, lnum_stop);
431 if (n == FAIL || (firstpos.lnum != 0 && equalpos(pos, firstpos)))
432 /* didn't find it or found the first match again: FAIL */
437 n = searchit(curwin, curbuf, &pos, dir, pat, 1L,
438 ! options, RE_SEARCH, lnum_stop, &tm);
439 if (n == FAIL || (firstpos.lnum != 0 && equalpos(pos, firstpos)))
440 /* didn't find it or found the first match again: FAIL */
442 *** ../vim-7.1.210/src/ex_cmds2.c Fri Jan 4 16:00:10 2008
443 --- src/ex_cmds2.c Sun Jan 6 18:22:28 2008
446 sprintf(buf, "%10.6lf", (double)tm->QuadPart / (double)fr.QuadPart);
448 sprintf(buf, "%3ld.%06ld", (long)tm->tv_sec, (long)tm->tv_usec);
453 ! # endif /* FEAT_PROFILE || FEAT_RELTIME */
455 - # if defined(FEAT_PROFILE) || defined(PROTO)
457 ! * Functions for profiling.
459 ! static void script_do_profile __ARGS((scriptitem_T *si));
460 ! static void script_dump_profile __ARGS((FILE *fd));
461 ! static proftime_T prof_wait_time;
464 * Set the time in "tm" to zero.
466 sprintf(buf, "%10.6lf", (double)tm->QuadPart / (double)fr.QuadPart);
468 sprintf(buf, "%3ld.%06ld", (long)tm->tv_sec, (long)tm->tv_usec);
474 ! * Put the time "msec" past now in "tm".
477 ! profile_setlimit(msec, tm)
481 ! if (msec <= 0) /* no limit */
488 ! QueryPerformanceCounter(tm);
489 ! QueryPerformanceFrequency(&fr);
490 ! tm->QuadPart += (double)msec / 1000.0 * (double)fr.QuadPart;
494 ! gettimeofday(tm, NULL);
495 ! usec = (long)tm->tv_usec + (long)msec * 1000;
496 ! tm->tv_usec = usec % 1000000L;
497 ! tm->tv_sec += usec / 1000000L;
503 ! * Return TRUE if the current time is past "tm".
506 ! profile_passed_limit(tm)
512 ! if (tm->QuadPart == 0) /* timer was not set */
514 ! QueryPerformanceCounter(&now);
515 ! return (now.QuadPart > tm->QuadPart);
517 ! if (tm->tv_sec == 0) /* timer was not set */
519 ! gettimeofday(&now, NULL);
520 ! return (now.tv_sec > tm->tv_sec
521 ! || (now.tv_sec == tm->tv_sec && now.tv_usec > tm->tv_usec));
526 * Set the time in "tm" to zero.
534 + # endif /* FEAT_PROFILE || FEAT_RELTIME */
536 + # if defined(FEAT_PROFILE) || defined(PROTO)
538 + * Functions for profiling.
540 + static void script_do_profile __ARGS((scriptitem_T *si));
541 + static void script_dump_profile __ARGS((FILE *fd));
542 + static proftime_T prof_wait_time;
545 * Add the time "tm2" to "tm".
546 *** ../vim-7.1.210/src/ex_docmd.c Fri Jan 4 16:00:10 2008
547 --- src/ex_docmd.c Sun Jan 6 16:08:29 2008
550 *cmd == '?' ? BACKWARD : FORWARD,
552 SEARCH_MSG + SEARCH_START,
553 ! i, (linenr_T)0) != FAIL)
558 *cmd == '?' ? BACKWARD : FORWARD,
560 SEARCH_MSG + SEARCH_START,
561 ! i, (linenr_T)0, NULL) != FAIL)
565 *** ../vim-7.1.210/src/normal.c Sat Jan 5 13:34:01 2008
566 --- src/normal.c Sun Jan 6 16:08:54 2008
571 t = searchit(curwin, curbuf, &curwin->w_cursor, FORWARD,
572 ! pat, 1L, searchflags, RE_LAST, (linenr_T)0);
573 if (curwin->w_cursor.lnum >= old_pos.lnum)
574 t = FAIL; /* match after start is failure too */
579 t = searchit(curwin, curbuf, &curwin->w_cursor, FORWARD,
580 ! pat, 1L, searchflags, RE_LAST, (linenr_T)0, NULL);
581 if (curwin->w_cursor.lnum >= old_pos.lnum)
582 t = FAIL; /* match after start is failure too */
584 *** ../vim-7.1.210/src/proto/eval.pro Sun May 6 15:18:09 2007
585 --- src/proto/eval.pro Sun Jan 6 15:55:47 2008
588 long get_dict_number __ARGS((dict_T *d, char_u *key));
589 char_u *get_function_name __ARGS((expand_T *xp, int idx));
590 char_u *get_expr_name __ARGS((expand_T *xp, int idx));
591 ! long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop));
592 void set_vim_var_nr __ARGS((int idx, long val));
593 long get_vim_var_nr __ARGS((int idx));
594 char_u *get_vim_var_str __ARGS((int idx));
596 long get_dict_number __ARGS((dict_T *d, char_u *key));
597 char_u *get_function_name __ARGS((expand_T *xp, int idx));
598 char_u *get_expr_name __ARGS((expand_T *xp, int idx));
599 ! long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit));
600 void set_vim_var_nr __ARGS((int idx, long val));
601 long get_vim_var_nr __ARGS((int idx));
602 char_u *get_vim_var_str __ARGS((int idx));
603 *** ../vim-7.1.210/src/proto/ex_cmds2.pro Sat May 5 20:21:13 2007
604 --- src/proto/ex_cmds2.pro Sun Jan 6 16:42:24 2008
608 void profile_end __ARGS((proftime_T *tm));
609 void profile_sub __ARGS((proftime_T *tm, proftime_T *tm2));
610 char *profile_msg __ARGS((proftime_T *tm));
611 + void profile_setlimit __ARGS((long msec, proftime_T *tm));
612 + int profile_passed_limit __ARGS((proftime_T *tm));
613 void profile_zero __ARGS((proftime_T *tm));
614 void profile_add __ARGS((proftime_T *tm, proftime_T *tm2));
615 void profile_self __ARGS((proftime_T *self, proftime_T *total, proftime_T *children));
616 *** ../vim-7.1.210/src/proto/search.pro Wed Aug 8 22:48:16 2007
617 --- src/proto/search.pro Sun Jan 6 16:11:53 2008
620 void reset_search_dir __ARGS((void));
621 void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast));
622 void last_pat_prog __ARGS((regmmatch_T *regmatch));
623 ! int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum));
624 int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options));
625 int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat));
626 int searchc __ARGS((cmdarg_T *cap, int t_cmd));
628 void reset_search_dir __ARGS((void));
629 void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast));
630 void last_pat_prog __ARGS((regmmatch_T *regmatch));
631 ! int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum, proftime_T *tm));
632 int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options));
633 int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat));
634 int searchc __ARGS((cmdarg_T *cap, int t_cmd));
635 *** ../vim-7.1.210/src/search.c Tue Jan 1 15:42:45 2008
636 --- src/search.c Sun Jan 6 18:23:37 2008
639 * When FEAT_EVAL is defined, returns the index of the first matching
640 * subpattern plus one; one if there was none.
643 ! searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum)
644 win_T *win; /* window to search in; can be NULL for a
645 buffer without a window! */
648 * When FEAT_EVAL is defined, returns the index of the first matching
649 * subpattern plus one; one if there was none.
653 ! searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum, tm)
654 win_T *win; /* window to search in; can be NULL for a
655 buffer without a window! */
661 int pat_use; /* which pattern to use when "pat" is empty */
662 linenr_T stop_lnum; /* stop after this line number when != 0 */
663 + proftime_T *tm; /* timeout limit or NULL */
666 linenr_T lnum; /* no init to shut up Apollo cc */
670 if (stop_lnum != 0 && (dir == FORWARD
671 ? lnum > stop_lnum : lnum < stop_lnum))
673 + #ifdef FEAT_RELTIME
674 + /* Stop after passing the "tm" time limit. */
675 + if (tm != NULL && profile_passed_limit(tm))
680 * Look for a match somewhere in line "lnum".
683 (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS
684 + SEARCH_MSG + SEARCH_START
685 + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))),
686 ! RE_LAST, (linenr_T)0);
689 *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */
691 (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS
692 + SEARCH_MSG + SEARCH_START
693 + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))),
694 ! RE_LAST, (linenr_T)0, NULL);
697 *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */
700 if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|\\_s\\=>\\)",
702 (char_u *)"</[^>]*>", BACKWARD, (char_u *)"", 0,
703 ! NULL, (linenr_T)0) <= 0)
705 curwin->w_cursor = old_pos;
708 if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|\\_s\\=>\\)",
710 (char_u *)"</[^>]*>", BACKWARD, (char_u *)"", 0,
711 ! NULL, (linenr_T)0, 0L) <= 0)
713 curwin->w_cursor = old_pos;
717 sprintf((char *)epat, "</%.*s>\\c", len, p);
719 r = do_searchpair(spat, (char_u *)"", epat, FORWARD, (char_u *)"",
720 ! 0, NULL, (linenr_T)0);
725 sprintf((char *)epat, "</%.*s>\\c", len, p);
727 r = do_searchpair(spat, (char_u *)"", epat, FORWARD, (char_u *)"",
728 ! 0, NULL, (linenr_T)0, 0L);
732 *** ../vim-7.1.210/src/version.c Sun Jan 6 17:18:16 2008
733 --- src/version.c Sun Jan 6 20:00:03 2008
737 { /* Add new patch number below this line */
743 No letters of the alphabet were harmed in the creation of this message.
745 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
746 /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
747 \\\ download, build and distribute -- http://www.A-A-P.org ///
748 \\\ help me help AIDS victims -- http://ICCF-Holland.org ///