To: vim-dev@vim.org Subject: Patch 7.1.236 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 7.1.236 Problem: When using 'incsearch' and 'hlsearch' a complicated pattern may make Vim hang until CTRL-C is pressed. Solution: Add the 'redrawtime' option. Files: runtime/doc/options.txt, src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c, src/gui.c, src/misc1.c, src/normal.c, src/option.c, src/quickfix.c, src/regexp.c, src/proto/regexp.pro, src/proto/search.pro, src/search.c, src/screen.c, src/option.h, src/spell.c, src/structs.h, src/syntax.c, src/tag.c, src/vim.h *** ../vim-7.1.235/runtime/doc/options.txt Sun Aug 12 16:55:01 2007 --- runtime/doc/options.txt Sat Jan 19 14:01:22 2008 *************** *** 3618,3623 **** --- 3636,3642 ---- When you get bored looking at the highlighted matches, you can turn it off with |:nohlsearch|. As soon as you use a search command, the highlighting comes back. + 'redrawtime' specifies the maximum time spend on finding matches. When the search pattern can match an end-of-line, Vim will try to highlight all of the matched text. However, this depends on where the search starts. This will be the first line in the window or the first *************** *** 3851,3856 **** --- 3870,3879 ---- original position when no match is found and when pressing . You still need to finish the search command with to move the cursor to the match. + When compiled with the |+reltime| feature Vim only searches for about + half a second. With a complicated pattern and/or a lot of text the + match may not be found. This is to avoid that Vim hangs while you + are typing the pattern. The highlighting can be set with the 'i' flag in 'highlight'. See also: 'hlsearch'. CTRL-L can be used to add one character from after the current match *************** *** 5185,5190 **** --- 5210,5227 ---- {not in Vi:} When using the ":view" command the 'readonly' option is set for the newly edited buffer. + *'redrawtime'* *'rdt'* + 'redrawtime' 'rdt' number (default 2000) + global + {not in Vi} + {only available when compiled with the |+reltime| + feature} + The time in milliseconds for redrawing the display. This applies to + searching for patterns for 'hlsearch' and |:match| highlighting. + When redrawing takes more than this many milliseconds no further + matches will be highlighted. This is used to avoid that Vim hangs + when using a very complicated pattern. + *'remap'* *'noremap'* 'remap' boolean (default on) global *** ../vim-7.1.235/src/ex_cmds.c Sun Jan 13 13:30:34 2008 --- src/ex_cmds.c Sat Jan 19 13:04:28 2008 *************** *** 4446,4452 **** #endif ); ++lnum) { ! nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0); if (nmatch) { colnr_T copycol; --- 4446,4453 ---- #endif ); ++lnum) { ! nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, ! (colnr_T)0, NULL); if (nmatch) { colnr_T copycol; *************** *** 4957,4963 **** || (do_ask && !re_lookbehind(regmatch.regprog)) || nmatch_tl > 0 || (nmatch = vim_regexec_multi(®match, curwin, ! curbuf, sub_firstlnum, matchcol)) == 0 || regmatch.startpos[0].lnum > 0) { if (new_start != NULL) --- 4958,4965 ---- || (do_ask && !re_lookbehind(regmatch.regprog)) || nmatch_tl > 0 || (nmatch = vim_regexec_multi(®match, curwin, ! curbuf, sub_firstlnum, ! matchcol, NULL)) == 0 || regmatch.startpos[0].lnum > 0) { if (new_start != NULL) *************** *** 5022,5028 **** } if (nmatch == -1 && !lastone) nmatch = vim_regexec_multi(®match, curwin, curbuf, ! sub_firstlnum, matchcol); /* * 5. break if there isn't another match in this line --- 5024,5030 ---- } if (nmatch == -1 && !lastone) nmatch = vim_regexec_multi(®match, curwin, curbuf, ! sub_firstlnum, matchcol, NULL); /* * 5. break if there isn't another match in this line *************** *** 5252,5258 **** for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum) { /* a match on this line? */ ! match = vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0); if ((type == 'g' && match) || (type == 'v' && !match)) { ml_setmarked(lnum); --- 5254,5261 ---- for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum) { /* a match on this line? */ ! match = vim_regexec_multi(®match, curwin, curbuf, lnum, ! (colnr_T)0, NULL); if ((type == 'g' && match) || (type == 'v' && !match)) { ml_setmarked(lnum); *** ../vim-7.1.235/src/ex_docmd.c Sun Jan 13 17:11:25 2008 --- src/ex_docmd.c Fri Jan 18 21:01:16 2008 *************** *** 3931,3937 **** curwin->w_cursor.col = 0; searchcmdlen = 0; if (!do_search(NULL, c, cmd, 1L, ! SEARCH_HIS + SEARCH_MSG + SEARCH_START)) { curwin->w_cursor = pos; cmd = NULL; --- 3931,3938 ---- curwin->w_cursor.col = 0; searchcmdlen = 0; if (!do_search(NULL, c, cmd, 1L, ! SEARCH_HIS + SEARCH_MSG + SEARCH_START, ! NULL)) { curwin->w_cursor = pos; cmd = NULL; *** ../vim-7.1.235/src/ex_getln.c Fri Jan 18 13:15:32 2008 --- src/ex_getln.c Fri Jan 18 21:34:42 2008 *************** *** 1709,1714 **** --- 1709,1717 ---- if (p_is && !cmd_silent && (firstc == '/' || firstc == '?')) { pos_T end_pos; + #ifdef FEAT_RELTIME + proftime_T tm; + #endif /* if there is a character waiting, search and redraw later */ if (char_avail()) *************** *** 1727,1734 **** cursor_off(); /* so the user knows we're busy */ out_flush(); ++emsg_off; /* So it doesn't beep if bad expr */ i = do_search(NULL, firstc, ccline.cmdbuff, count, ! SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK); --emsg_off; /* if interrupted while searching, behave like it failed */ if (got_int) --- 1730,1747 ---- cursor_off(); /* so the user knows we're busy */ out_flush(); ++emsg_off; /* So it doesn't beep if bad expr */ + #ifdef FEAT_RELTIME + /* Set the time limit to half a second. */ + profile_setlimit(500L, &tm); + #endif i = do_search(NULL, firstc, ccline.cmdbuff, count, ! SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK, ! #ifdef FEAT_RELTIME ! &tm ! #else ! NULL ! #endif ! ); --emsg_off; /* if interrupted while searching, behave like it failed */ if (got_int) *** ../vim-7.1.235/src/gui.c Thu Jan 3 16:14:25 2008 --- src/gui.c Fri Jan 18 21:01:36 2008 *************** *** 5052,5058 **** /* Search for the next match. */ i = msg_scroll; do_search(NULL, down ? '/' : '?', ga.ga_data, 1L, ! SEARCH_MSG + SEARCH_MARK); msg_scroll = i; /* don't let an error message set msg_scroll */ } --- 5052,5058 ---- /* Search for the next match. */ i = msg_scroll; do_search(NULL, down ? '/' : '?', ga.ga_data, 1L, ! SEARCH_MSG + SEARCH_MARK, NULL); msg_scroll = i; /* don't let an error message set msg_scroll */ } *** ../vim-7.1.235/src/misc1.c Thu Jan 3 12:42:38 2008 --- src/misc1.c Sat Jan 19 13:04:39 2008 *************** *** 437,443 **** { regmatch.rmm_ic = FALSE; regmatch.rmm_maxcol = 0; ! if (vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0)) { pos.lnum = regmatch.endpos[0].lnum + lnum; pos.col = regmatch.endpos[0].col; --- 437,444 ---- { regmatch.rmm_ic = FALSE; regmatch.rmm_maxcol = 0; ! if (vim_regexec_multi(®match, curwin, curbuf, lnum, ! (colnr_T)0, NULL)) { pos.lnum = regmatch.endpos[0].lnum + lnum; pos.col = regmatch.endpos[0].col; *** ../vim-7.1.235/src/normal.c Sat Jan 12 17:11:25 2008 --- src/normal.c Fri Jan 18 21:01:47 2008 *************** *** 6093,6099 **** curwin->w_set_curswant = TRUE; i = do_search(cap->oap, dir, pat, cap->count1, ! opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG); if (i == 0) clearop(cap->oap); else --- 6093,6099 ---- curwin->w_set_curswant = TRUE; i = do_search(cap->oap, dir, pat, cap->count1, ! opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG, NULL); if (i == 0) clearop(cap->oap); else *** ../vim-7.1.235/src/option.c Tue Oct 2 20:40:01 2007 --- src/option.c Sat Jan 19 13:44:33 2008 *************** *** 1991,1996 **** --- 1991,2003 ---- {"redraw", NULL, P_BOOL|P_VI_DEF, (char_u *)NULL, PV_NONE, {(char_u *)FALSE, (char_u *)0L}}, + {"redrawtime", "rdt", P_NUM|P_VI_DEF, + #ifdef FEAT_RELTIME + (char_u *)&p_rdt, PV_NONE, + #else + (char_u *)NULL, PV_NONE, + #endif + {(char_u *)2000L, (char_u *)0L}}, {"remap", NULL, P_BOOL|P_VI_DEF, (char_u *)&p_remap, PV_NONE, {(char_u *)TRUE, (char_u *)0L}}, *** ../vim-7.1.235/src/quickfix.c Sun Sep 30 14:00:41 2007 --- src/quickfix.c Sat Jan 19 13:04:53 2008 *************** *** 1803,1809 **** /* Move the cursor to the first line in the buffer */ save_cursor = curwin->w_cursor; curwin->w_cursor.lnum = 0; ! if (!do_search(NULL, '/', qf_ptr->qf_pattern, (long)1, SEARCH_KEEP)) curwin->w_cursor = save_cursor; } --- 1803,1810 ---- /* Move the cursor to the first line in the buffer */ save_cursor = curwin->w_cursor; curwin->w_cursor.lnum = 0; ! if (!do_search(NULL, '/', qf_ptr->qf_pattern, (long)1, ! SEARCH_KEEP, NULL)) curwin->w_cursor = save_cursor; } *************** *** 3159,3165 **** { col = 0; while (vim_regexec_multi(®match, curwin, buf, lnum, ! col) > 0) { ; if (qf_add_entry(qi, &prevp, --- 3160,3166 ---- { col = 0; while (vim_regexec_multi(®match, curwin, buf, lnum, ! col, NULL) > 0) { ; if (qf_add_entry(qi, &prevp, *** ../vim-7.1.235/src/regexp.c Fri Jan 18 20:36:40 2008 --- src/regexp.c Sat Jan 19 15:18:12 2008 *************** *** 3040,3046 **** } save_se_T; static char_u *reg_getline __ARGS((linenr_T lnum)); ! static long vim_regexec_both __ARGS((char_u *line, colnr_T col)); static long regtry __ARGS((regprog_T *prog, colnr_T col)); static void cleanup_subexpr __ARGS((void)); #ifdef FEAT_SYN_HL --- 3040,3046 ---- } save_se_T; static char_u *reg_getline __ARGS((linenr_T lnum)); ! static long vim_regexec_both __ARGS((char_u *line, colnr_T col, proftime_T *tm)); static long regtry __ARGS((regprog_T *prog, colnr_T col)); static void cleanup_subexpr __ARGS((void)); #ifdef FEAT_SYN_HL *************** *** 3284,3290 **** ireg_icombine = FALSE; #endif ireg_maxcol = 0; ! return (vim_regexec_both(line, col) != 0); } #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \ --- 3284,3290 ---- ireg_icombine = FALSE; #endif ireg_maxcol = 0; ! return (vim_regexec_both(line, col, NULL) != 0); } #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \ *************** *** 3308,3314 **** ireg_icombine = FALSE; #endif ireg_maxcol = 0; ! return (vim_regexec_both(line, col) != 0); } #endif --- 3308,3314 ---- ireg_icombine = FALSE; #endif ireg_maxcol = 0; ! return (vim_regexec_both(line, col, NULL) != 0); } #endif *************** *** 3321,3332 **** * match otherwise. */ long ! vim_regexec_multi(rmp, win, buf, lnum, col) regmmatch_T *rmp; win_T *win; /* window in which to search or NULL */ buf_T *buf; /* buffer in which to search */ linenr_T lnum; /* nr of line to start looking for match */ colnr_T col; /* column to start looking for match */ { long r; buf_T *save_curbuf = curbuf; --- 3321,3333 ---- * match otherwise. */ long ! vim_regexec_multi(rmp, win, buf, lnum, col, tm) regmmatch_T *rmp; win_T *win; /* window in which to search or NULL */ buf_T *buf; /* buffer in which to search */ linenr_T lnum; /* nr of line to start looking for match */ colnr_T col; /* column to start looking for match */ + proftime_T *tm; /* timeout limit or NULL */ { long r; buf_T *save_curbuf = curbuf; *************** *** 3346,3352 **** /* Need to switch to buffer "buf" to make vim_iswordc() work. */ curbuf = buf; ! r = vim_regexec_both(NULL, col); curbuf = save_curbuf; return r; --- 3347,3353 ---- /* Need to switch to buffer "buf" to make vim_iswordc() work. */ curbuf = buf; ! r = vim_regexec_both(NULL, col, tm); curbuf = save_curbuf; return r; *************** *** 3356,3365 **** * Match a regexp against a string ("line" points to the string) or multiple * lines ("line" is NULL, use reg_getline()). */ static long ! vim_regexec_both(line, col) char_u *line; colnr_T col; /* column to start looking for match */ { regprog_T *prog; char_u *s; --- 3357,3368 ---- * Match a regexp against a string ("line" points to the string) or multiple * lines ("line" is NULL, use reg_getline()). */ + /*ARGSUSED*/ static long ! vim_regexec_both(line, col, tm) char_u *line; colnr_T col; /* column to start looking for match */ + proftime_T *tm; /* timeout limit or NULL */ { regprog_T *prog; char_u *s; *************** *** 3502,3507 **** --- 3505,3513 ---- } else { + #ifdef FEAT_RELTIME + int tm_count = 0; + #endif /* Messy cases: unanchored match. */ while (!got_int) { *************** *** 3550,3555 **** --- 3556,3570 ---- else #endif ++col; + #ifdef FEAT_RELTIME + /* Check for timeout once in a twenty times to avoid overhead. */ + if (tm != NULL && ++tm_count == 20) + { + tm_count = 0; + if (profile_passed_limit(tm)) + break; + } + #endif } } *** ../vim-7.1.235/src/proto/regexp.pro Sat May 5 19:42:08 2007 --- src/proto/regexp.pro Sat Jan 19 13:14:09 2008 *************** *** 1,13 **** /* regexp.c */ - void free_regexp_stuff __ARGS((void)); int re_multiline __ARGS((regprog_T *prog)); int re_lookbehind __ARGS((regprog_T *prog)); char_u *skip_regexp __ARGS((char_u *startp, int dirc, int magic, char_u **newp)); regprog_T *vim_regcomp __ARGS((char_u *expr, int re_flags)); int vim_regcomp_had_eol __ARGS((void)); int vim_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); int vim_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); ! long vim_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col)); reg_extmatch_T *ref_extmatch __ARGS((reg_extmatch_T *em)); void unref_extmatch __ARGS((reg_extmatch_T *em)); char_u *regtilde __ARGS((char_u *source, int magic)); --- 1,13 ---- /* regexp.c */ int re_multiline __ARGS((regprog_T *prog)); int re_lookbehind __ARGS((regprog_T *prog)); char_u *skip_regexp __ARGS((char_u *startp, int dirc, int magic, char_u **newp)); regprog_T *vim_regcomp __ARGS((char_u *expr, int re_flags)); int vim_regcomp_had_eol __ARGS((void)); + void free_regexp_stuff __ARGS((void)); int vim_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); int vim_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col)); ! long vim_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm)); reg_extmatch_T *ref_extmatch __ARGS((reg_extmatch_T *em)); void unref_extmatch __ARGS((reg_extmatch_T *em)); char_u *regtilde __ARGS((char_u *source, int magic)); *** ../vim-7.1.235/src/proto/search.pro Sun Jan 6 20:05:36 2008 --- src/proto/search.pro Fri Jan 18 21:03:49 2008 *************** *** 11,17 **** void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast)); void last_pat_prog __ARGS((regmmatch_T *regmatch)); 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)); ! int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options)); int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat)); int searchc __ARGS((cmdarg_T *cap, int t_cmd)); pos_T *findmatch __ARGS((oparg_T *oap, int initc)); --- 11,17 ---- void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast)); void last_pat_prog __ARGS((regmmatch_T *regmatch)); 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)); ! int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options, proftime_T *tm)); int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat)); int searchc __ARGS((cmdarg_T *cap, int t_cmd)); pos_T *findmatch __ARGS((oparg_T *oap, int initc)); *** ../vim-7.1.235/src/search.c Sun Jan 6 20:05:36 2008 --- src/search.c Sat Jan 19 13:13:25 2008 *************** *** 606,612 **** * Look for a match somewhere in line "lnum". */ nmatched = vim_regexec_multi(®match, win, buf, ! lnum, (colnr_T)0); /* Abort searching on an error (e.g., out of stack). */ if (called_emsg) break; --- 606,618 ---- * Look for a match somewhere in line "lnum". */ nmatched = vim_regexec_multi(®match, win, buf, ! lnum, (colnr_T)0, ! #ifdef FEAT_RELTIME ! tm ! #else ! NULL ! #endif ! ); /* Abort searching on an error (e.g., out of stack). */ if (called_emsg) break; *************** *** 615,623 **** /* match may actually be in another line when using \zs */ matchpos = regmatch.startpos[0]; endpos = regmatch.endpos[0]; ! # ifdef FEAT_EVAL submatch = first_submatch(®match); ! # endif /* Line me be past end of buffer for "\n\zs". */ if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) ptr = (char_u *)""; --- 621,629 ---- /* match may actually be in another line when using \zs */ matchpos = regmatch.startpos[0]; endpos = regmatch.endpos[0]; ! #ifdef FEAT_EVAL submatch = first_submatch(®match); ! #endif /* Line me be past end of buffer for "\n\zs". */ if (lnum + matchpos.lnum > buf->b_ml.ml_line_count) ptr = (char_u *)""; *************** *** 693,699 **** if (ptr[matchcol] == NUL || (nmatched = vim_regexec_multi(®match, win, buf, lnum + matchpos.lnum, ! matchcol)) == 0) { match_ok = FALSE; break; --- 699,711 ---- if (ptr[matchcol] == NUL || (nmatched = vim_regexec_multi(®match, win, buf, lnum + matchpos.lnum, ! matchcol, ! #ifdef FEAT_RELTIME ! tm ! #else ! NULL ! #endif ! )) == 0) { match_ok = FALSE; break; *************** *** 799,805 **** if (ptr[matchcol] == NUL || (nmatched = vim_regexec_multi(®match, win, buf, lnum + matchpos.lnum, ! matchcol)) == 0) break; /* Need to get the line pointer again, a --- 811,823 ---- if (ptr[matchcol] == NUL || (nmatched = vim_regexec_multi(®match, win, buf, lnum + matchpos.lnum, ! matchcol, ! #ifdef FEAT_RELTIME ! tm ! #else ! NULL ! #endif ! )) == 0) break; /* Need to get the line pointer again, a *************** *** 977,988 **** * return 0 for failure, 1 for found, 2 for found and line offset added */ int ! do_search(oap, dirc, pat, count, options) oparg_T *oap; /* can be NULL */ int dirc; /* '/' or '?' */ char_u *pat; long count; int options; { pos_T pos; /* position of the last match */ char_u *searchstr; --- 995,1007 ---- * return 0 for failure, 1 for found, 2 for found and line offset added */ int ! do_search(oap, dirc, pat, count, options, tm) oparg_T *oap; /* can be NULL */ int dirc; /* '/' or '?' */ char_u *pat; long count; int options; + proftime_T *tm; /* timeout limit or NULL */ { pos_T pos; /* position of the last match */ char_u *searchstr; *************** *** 1256,1262 **** (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS + SEARCH_MSG + SEARCH_START + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))), ! RE_LAST, (linenr_T)0, NULL); if (dircp != NULL) *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */ --- 1275,1281 ---- (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS + SEARCH_MSG + SEARCH_START + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))), ! RE_LAST, (linenr_T)0, tm); if (dircp != NULL) *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */ *** ../vim-7.1.235/src/screen.c Sat Jan 12 16:45:25 2008 --- src/screen.c Sat Jan 19 13:52:29 2008 *************** *** 848,858 **** --- 848,863 ---- cur->hl.buf = buf; cur->hl.lnum = 0; cur->hl.first_lnum = 0; + # ifdef FEAT_RELTIME + /* Set the time limit to 'redrawtime'. */ + profile_setlimit(p_rdt, &(cur->hl.tm)); + # endif cur = cur->next; } search_hl.buf = buf; search_hl.lnum = 0; search_hl.first_lnum = 0; + /* time limit is set at the toplevel, for all windows */ #endif #ifdef FEAT_LINEBREAK *************** *** 6462,6467 **** --- 6467,6476 ---- { last_pat_prog(&search_hl.rm); search_hl.attr = hl_attr(HLF_L); + # ifdef FEAT_RELTIME + /* Set the time limit to 'redrawtime'. */ + profile_setlimit(p_rdt, &search_hl.tm); + # endif } } *************** *** 6587,6592 **** --- 6596,6609 ---- called_emsg = FALSE; for (;;) { + #ifdef FEAT_RELTIME + /* Stop searching after passing the time limit. */ + if (profile_passed_limit(&(shl->tm))) + { + shl->lnum = 0; /* no match found in time */ + break; + } + #endif /* Three situations: * 1. No useful previous match: search from start of line. * 2. Not Vi compatible or empty match: continue at next character. *************** *** 6620,6626 **** matchcol = shl->rm.endpos[0].col; shl->lnum = lnum; ! nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol); if (called_emsg) { /* Error while handling regexp: stop using this regexp. */ --- 6637,6649 ---- matchcol = shl->rm.endpos[0].col; shl->lnum = lnum; ! nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol, ! #ifdef FEAT_RELTIME ! &(shl->tm) ! #else ! NULL ! #endif ! ); if (called_emsg) { /* Error while handling regexp: stop using this regexp. */ *** ../vim-7.1.235/src/option.h Thu May 10 20:34:47 2007 --- src/option.h Sat Jan 19 13:45:51 2008 *************** *** 633,638 **** --- 633,641 ---- #ifdef FEAT_SEARCHPATH EXTERN char_u *p_cdpath; /* 'cdpath' */ #endif + #ifdef FEAT_RELTIME + EXTERN long p_rdt; /* 'redrawtime' */ + #endif EXTERN int p_remap; /* 'remap' */ EXTERN long p_report; /* 'report' */ #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) *** ../vim-7.1.235/src/spell.c Sat Jan 12 16:45:25 2008 --- src/spell.c Fri Jan 18 21:02:47 2008 *************** *** 10343,10349 **** curwin->w_cursor.lnum = 0; while (!got_int) { ! if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP) == 0 || u_save_cursor() == FAIL) break; --- 10343,10349 ---- curwin->w_cursor.lnum = 0; while (!got_int) { ! if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP, NULL) == 0 || u_save_cursor() == FAIL) break; *** ../vim-7.1.235/src/structs.h Mon Oct 1 22:53:27 2007 --- src/structs.h Fri Jan 18 21:18:53 2008 *************** *** 1717,1722 **** --- 1717,1725 ---- linenr_T first_lnum; /* first lnum to search for multi-line pat */ colnr_T startcol; /* in win_line() points to char where HL starts */ colnr_T endcol; /* in win_line() points to char where HL ends */ + #ifdef FEAT_RELTIME + proftime_T tm; /* for a time limit */ + #endif } match_T; /* *** ../vim-7.1.235/src/syntax.c Sun Jan 13 17:39:29 2008 --- src/syntax.c Sat Jan 19 13:13:49 2008 *************** *** 3097,3103 **** colnr_T col; { rmp->rmm_maxcol = syn_buf->b_p_smc; ! if (vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col) > 0) { rmp->startpos[0].lnum += lnum; rmp->endpos[0].lnum += lnum; --- 3097,3103 ---- colnr_T col; { rmp->rmm_maxcol = syn_buf->b_p_smc; ! if (vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col, NULL) > 0) { rmp->startpos[0].lnum += lnum; rmp->endpos[0].lnum += lnum; *** ../vim-7.1.235/src/tag.c Thu May 10 19:44:07 2007 --- src/tag.c Fri Jan 18 21:03:41 2008 *************** *** 3191,3197 **** #endif save_lnum = curwin->w_cursor.lnum; curwin->w_cursor.lnum = 0; /* start search before first line */ ! if (do_search(NULL, pbuf[0], pbuf + 1, (long)1, search_options)) retval = OK; else { --- 3191,3198 ---- #endif save_lnum = curwin->w_cursor.lnum; curwin->w_cursor.lnum = 0; /* start search before first line */ ! if (do_search(NULL, pbuf[0], pbuf + 1, (long)1, ! search_options, NULL)) retval = OK; else { *************** *** 3203,3209 **** */ p_ic = TRUE; if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1, ! search_options)) { /* * Failed to find pattern, take a guess: "^func (" --- 3204,3210 ---- */ p_ic = TRUE; if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1, ! search_options, NULL)) { /* * Failed to find pattern, take a guess: "^func (" *************** *** 3213,3225 **** cc = *tagp.tagname_end; *tagp.tagname_end = NUL; sprintf((char *)pbuf, "^%s\\s\\*(", tagp.tagname); ! if (!do_search(NULL, '/', pbuf, (long)1, search_options)) { /* Guess again: "^char * \ /* for access() */ # define stat(a,b) (access(a,0) ? -1 : stat(a,b)) - #endif - - #if (defined(FEAT_PROFILE) || defined(FEAT_RELTIME)) && !defined(PROTO) - # ifdef WIN3264 - typedef LARGE_INTEGER proftime_T; - # else - typedef struct timeval proftime_T; - # endif - #else - typedef int proftime_T; /* dummy for function prototypes */ #endif #include "ex_cmds.h" /* Ex command defines */ --- 1770,1775 ---- *** ../vim-7.1.235/src/version.c Fri Jan 18 20:36:40 2008 --- src/version.c Sat Jan 19 15:19:48 2008 *************** *** 668,669 **** --- 668,671 ---- { /* Add new patch number below this line */ + /**/ + 236, /**/ -- Every time I lose weight, it finds me again! /// 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 ///