Mercurial > vim
diff src/search.c @ 1624:18ee39301b82 v7.2a
updated for version 7.2a
author | vimboss |
---|---|
date | Tue, 24 Jun 2008 22:58:06 +0000 |
parents | 811f29447aea |
children | 9368159253f8 |
line wrap: on
line diff
--- a/src/search.c +++ b/src/search.c @@ -14,6 +14,7 @@ static void save_re_pat __ARGS((int idx, char_u *pat, int magic)); #ifdef FEAT_EVAL +static void set_vv_searchforward __ARGS((void)); static int first_submatch __ARGS((regmmatch_T *rp)); #endif static int check_prevcol __ARGS((char_u *linep, int col, int ch, int *prevcol)); @@ -61,7 +62,7 @@ static void wvsp_one __ARGS((FILE *fp, i /* Note: only spats[0].off is really used */ struct soffset { - int dir; /* search direction */ + int dir; /* search direction, '/' or '?' */ int line; /* search has line offset */ int end; /* search set cursor at end */ long off; /* line or char offset */ @@ -325,6 +326,9 @@ restore_search_patterns() { vim_free(spats[0].pat); spats[0] = saved_spats[0]; +#if defined(FEAT_EVAL) + set_vv_searchforward(); +#endif vim_free(spats[1].pat); spats[1] = saved_spats[1]; last_idx = saved_last_idx; @@ -379,9 +383,18 @@ ignorecase(pat) } else #endif - if (*p == '\\' && p[1] != NUL) /* skip "\S" et al. */ - p += 2; - else if (isupper(*p)) + if (*p == '\\') + { + if (p[1] == '_' && p[2] != NUL) /* skip "\_X" */ + p += 3; + else if (p[1] == '%' && p[2] != NUL) /* skip "\%X" */ + p += 3; + else if (p[1] != NUL) /* skip "\X" */ + p += 2; + else + p += 1; + } + else if (MB_ISUPPER(*p)) { ic = FALSE; break; @@ -408,6 +421,9 @@ last_search_pat() reset_search_dir() { spats[0].off.dir = '/'; +#if defined(FEAT_EVAL) + set_vv_searchforward(); +#endif } #if defined(FEAT_EVAL) || defined(FEAT_VIMINFO) @@ -431,6 +447,9 @@ set_last_search_pat(s, idx, magic, setla spats[idx].magic = magic; spats[idx].no_scs = FALSE; spats[idx].off.dir = '/'; +#if defined(FEAT_EVAL) + set_vv_searchforward(); +#endif spats[idx].off.line = FALSE; spats[idx].off.end = FALSE; spats[idx].off.off = 0; @@ -970,6 +989,19 @@ searchit(win, buf, pos, dir, pat, count, } #ifdef FEAT_EVAL + void +set_search_direction(cdir) + int cdir; +{ + spats[0].off.dir = cdir; +} + + static void +set_vv_searchforward() +{ + set_vim_var_nr(VV_SEARCHFORWARD, (long)(spats[0].off.dir == '/')); +} + /* * Return the number of the first subpat that matched. */ @@ -1018,7 +1050,7 @@ first_submatch(rp) do_search(oap, dirc, pat, count, options, tm) oparg_T *oap; /* can be NULL */ int dirc; /* '/' or '?' */ - char_u *pat; + char_u *pat; long count; int options; proftime_T *tm; /* timeout limit or NULL */ @@ -1056,7 +1088,12 @@ do_search(oap, dirc, pat, count, options if (dirc == 0) dirc = spats[0].off.dir; else + { spats[0].off.dir = dirc; +#if defined(FEAT_EVAL) + set_vv_searchforward(); +#endif + } if (options & SEARCH_REV) { #ifdef WIN32 @@ -1330,21 +1367,19 @@ do_search(oap, dirc, pat, count, options else if (pos.col < MAXCOL - 2) /* just in case */ { /* to the right, check for end of file */ - if (spats[0].off.off > 0) + c = spats[0].off.off; + if (c > 0) { - for (c = spats[0].off.off; c; --c) + while (c-- > 0) if (incl(&pos) == -1) break; } /* to the left, check for start of file */ else { - if ((c = pos.col + spats[0].off.off) >= 0) - pos.col = c; - else - for (c = spats[0].off.off; c; ++c) - if (decl(&pos) == -1) - break; + while (c++ < 0) + if (decl(&pos) == -1) + break; } } }