--- ../runtime/doc/eval.txt.000 2006-11-14 22:21:25.000000000 +0200 +++ ../runtime/doc/eval.txt 2006-11-18 01:23:14.000000000 +0200 @@ -1400,6 +1400,11 @@ v:profiling Normally zero. Set to one after using ":profile start". See |profiling|. + *v:searchforward* *searchforward-variable* +v:searchforward Search direction. 1-forward, 0-backward. See |n|, |@/|. + Caution: every return from function restores search direction. + Read-write. + *v:progname* *progname-variable* v:progname Contains the name (with path removed) with which Vim was invoked. Allows you to do special initialisations for "view", --- eval.c.000 2006-11-14 22:21:25.000000000 +0200 +++ eval.c 2006-11-18 01:24:01.000000000 +0200 @@ -345,6 +345,7 @@ {VV_NAME("mouse_win", VAR_NUMBER), 0}, {VV_NAME("mouse_lnum", VAR_NUMBER), 0}, {VV_NAME("mouse_col", VAR_NUMBER), 0}, + {VV_NAME("searchforward", VAR_NUMBER), } /* VV_SEARCHFORWARD */ }; /* shorthand */ @@ -778,6 +779,7 @@ /* add to compat scope dict */ hash_add(&compat_hashtab, p->vv_di.di_key); } + set_vim_var_nr( VV_SEARCHFORWARD, 1); } #if defined(EXITFREE) || defined(PROTO) @@ -17870,7 +17872,11 @@ else if (v->di_tv.v_type != VAR_NUMBER) EMSG2(_(e_intern2), "set_var()"); else + { v->di_tv.vval.v_number = get_tv_number(tv); + if (STRCMP(varname, vimvars[VV_SEARCHFORWARD].vv_di.di_key) == 0) + set_search_direction( (v->di_tv.vval.v_number ? '/' : '?'), 0); + } return; } --- vim.h.000 2006-11-14 22:21:25.000000000 +0200 +++ vim.h 2006-11-14 22:26:06.000000000 +0200 @@ -1672,7 +1672,8 @@ #define VV_MOUSE_WIN 49 #define VV_MOUSE_LNUM 50 #define VV_MOUSE_COL 51 -#define VV_LEN 52 /* number of v: vars */ +#define VV_SEARCHFORWARD 52 +#define VV_LEN 53 /* number of v: vars */ #ifdef FEAT_CLIPBOARD --- search.c.000 2006-11-14 22:21:25.000000000 +0200 +++ search.c 2006-11-15 00:10:07.000000000 +0200 @@ -61,7 +61,7 @@ /* 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 */ @@ -326,6 +326,9 @@ { vim_free(spats[0].pat); spats[0] = saved_spats[0]; +#if defined(FEAT_EVAL) + set_vim_var_nr( VV_SEARCHFORWARD, (spats[0].off.dir == '/' )); +#endif vim_free(spats[1].pat); spats[1] = saved_spats[1]; last_idx = saved_last_idx; @@ -334,6 +337,17 @@ # endif } } + + void +set_search_direction(cdir, update_vvar) + int cdir; +{ + spats[0].off.dir = cdir; +#if defined(FEAT_EVAL) + if (update_vvar) + set_vim_var_nr(VV_SEARCHFORWARD, (spats[0].off.dir == '/' )); +#endif +} #endif #if defined(EXITFREE) || defined(PROTO) @@ -409,6 +423,9 @@ reset_search_dir() { spats[0].off.dir = '/'; +#if defined(FEAT_EVAL) + set_vim_var_nr( VV_SEARCHFORWARD, 1 ); +#endif } #if defined(FEAT_EVAL) || defined(FEAT_VIMINFO) @@ -432,6 +449,9 @@ spats[idx].magic = magic; spats[idx].no_scs = FALSE; spats[idx].off.dir = '/'; +#if defined(FEAT_EVAL) + set_vim_var_nr( VV_SEARCHFORWARD, (spats[0].off.dir == '/')); +#endif spats[idx].off.line = FALSE; spats[idx].off.end = FALSE; spats[idx].off.off = 0; @@ -1003,7 +1023,12 @@ if (dirc == 0) dirc = spats[0].off.dir; else + { spats[0].off.dir = dirc; +#if defined(FEAT_EVAL) + set_vim_var_nr( VV_SEARCHFORWARD, (spats[0].off.dir == '/')); +#endif + } if (options & SEARCH_REV) { #ifdef WIN32