To: vim_dev@googlegroups.com Subject: Patch 7.3.869 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.869 Problem: bufwinnr() matches buffers in other tabs. Solution: For bufwinnr() and ? only match buffers in the current tab. (Alexey Radkov) Files: src/buffer.c, src/diff.c, src/eval.c, src/ex_docmd.c, src/if_perl.xs, src/proto/buffer.pro *** ../vim-7.3.868/src/buffer.c 2013-02-17 15:45:34.000000000 +0100 --- src/buffer.c 2013-03-19 14:19:17.000000000 +0100 *************** *** 928,934 **** if (!VIM_ISDIGIT(*arg)) { p = skiptowhite_esc(arg); ! bnr = buflist_findpat(arg, p, command == DOBUF_WIPE, FALSE); if (bnr < 0) /* failed */ break; arg = p; --- 928,935 ---- if (!VIM_ISDIGIT(*arg)) { p = skiptowhite_esc(arg); ! bnr = buflist_findpat(arg, p, command == DOBUF_WIPE, ! FALSE, FALSE); if (bnr < 0) /* failed */ break; arg = p; *************** *** 2129,2146 **** return NULL; } ! #if defined(FEAT_LISTCMDS) || defined(FEAT_EVAL) || defined(FEAT_PERL) || defined(PROTO) /* * Find file in buffer list by a regexp pattern. * Return fnum of the found buffer. * Return < 0 for error. */ int ! buflist_findpat(pattern, pattern_end, unlisted, diffmode) char_u *pattern; char_u *pattern_end; /* pointer to first char after pattern */ int unlisted; /* find unlisted buffers */ int diffmode UNUSED; /* find diff-mode buffers only */ { buf_T *buf; regprog_T *prog; --- 2130,2149 ---- return NULL; } ! #if defined(FEAT_LISTCMDS) || defined(FEAT_EVAL) || defined(FEAT_PERL) \ ! || defined(PROTO) /* * Find file in buffer list by a regexp pattern. * Return fnum of the found buffer. * Return < 0 for error. */ int ! buflist_findpat(pattern, pattern_end, unlisted, diffmode, curtab_only) char_u *pattern; char_u *pattern_end; /* pointer to first char after pattern */ int unlisted; /* find unlisted buffers */ int diffmode UNUSED; /* find diff-mode buffers only */ + int curtab_only; /* find buffers in current tab only */ { buf_T *buf; regprog_T *prog; *************** *** 2208,2213 **** --- 2211,2233 ---- #endif && buflist_match(prog, buf) != NULL) { + if (curtab_only) + { + /* Ignore the match if the buffer is not open in + * the current tab. */ + #ifdef FEAT_WINDOWS + win_T *wp; + + for (wp = firstwin; wp != NULL; wp = wp->w_next) + if (wp->w_buffer == buf) + break; + if (wp == NULL) + continue; + #else + if (curwin->w_buffer != buf) + continue; + #endif + } if (match >= 0) /* already found a match */ { match = -2; *** ../vim-7.3.868/src/diff.c 2012-10-21 22:18:17.000000000 +0200 --- src/diff.c 2013-03-19 14:11:40.000000000 +0100 *************** *** 2152,2158 **** i = atol((char *)eap->arg); else { ! i = buflist_findpat(eap->arg, p, FALSE, TRUE); if (i < 0) return; /* error message already given */ } --- 2152,2158 ---- i = atol((char *)eap->arg); else { ! i = buflist_findpat(eap->arg, p, FALSE, TRUE, FALSE); if (i < 0) return; /* error message already given */ } *** ../vim-7.3.868/src/eval.c 2013-03-16 14:20:45.000000000 +0100 --- src/eval.c 2013-03-19 14:11:40.000000000 +0100 *************** *** 9019,9032 **** rettv->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL); } ! static buf_T *get_buf_tv __ARGS((typval_T *tv)); /* * Get buffer by number or pattern. */ static buf_T * ! get_buf_tv(tv) typval_T *tv; { char_u *name = tv->vval.v_string; int save_magic; --- 9019,9033 ---- rettv->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL); } ! static buf_T *get_buf_tv __ARGS((typval_T *tv, int curtab_only)); /* * Get buffer by number or pattern. */ static buf_T * ! get_buf_tv(tv, curtab_only) typval_T *tv; + int curtab_only; { char_u *name = tv->vval.v_string; int save_magic; *************** *** 9049,9055 **** p_cpo = (char_u *)""; buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name), ! TRUE, FALSE)); p_magic = save_magic; p_cpo = save_cpo; --- 9050,9056 ---- p_cpo = (char_u *)""; buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name), ! TRUE, FALSE, curtab_only)); p_magic = save_magic; p_cpo = save_cpo; *************** *** 9073,9079 **** (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ ++emsg_off; ! buf = get_buf_tv(&argvars[0]); rettv->v_type = VAR_STRING; if (buf != NULL && buf->b_fname != NULL) rettv->vval.v_string = vim_strsave(buf->b_fname); --- 9074,9080 ---- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ ++emsg_off; ! buf = get_buf_tv(&argvars[0], FALSE); rettv->v_type = VAR_STRING; if (buf != NULL && buf->b_fname != NULL) rettv->vval.v_string = vim_strsave(buf->b_fname); *************** *** 9096,9102 **** (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ ++emsg_off; ! buf = get_buf_tv(&argvars[0]); --emsg_off; /* If the buffer isn't found and the second argument is not zero create a --- 9097,9103 ---- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ ++emsg_off; ! buf = get_buf_tv(&argvars[0], FALSE); --emsg_off; /* If the buffer isn't found and the second argument is not zero create a *************** *** 9131,9137 **** (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ ++emsg_off; ! buf = get_buf_tv(&argvars[0]); #ifdef FEAT_WINDOWS for (wp = firstwin; wp; wp = wp->w_next) { --- 9132,9138 ---- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ ++emsg_off; ! buf = get_buf_tv(&argvars[0], TRUE); #ifdef FEAT_WINDOWS for (wp = firstwin; wp; wp = wp->w_next) { *************** *** 11095,11101 **** (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ ++emsg_off; ! buf = get_buf_tv(&argvars[0]); --emsg_off; lnum = get_tv_lnum_buf(&argvars[1], buf); --- 11096,11102 ---- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ ++emsg_off; ! buf = get_buf_tv(&argvars[0], FALSE); --emsg_off; lnum = get_tv_lnum_buf(&argvars[1], buf); *************** *** 11123,11129 **** (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ varname = get_tv_string_chk(&argvars[1]); ++emsg_off; ! buf = get_buf_tv(&argvars[0]); if (argvars[2].v_type != VAR_UNKNOWN) /* set the default value */ --- 11124,11130 ---- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ varname = get_tv_string_chk(&argvars[1]); ++emsg_off; ! buf = get_buf_tv(&argvars[0], FALSE); if (argvars[2].v_type != VAR_UNKNOWN) /* set the default value */ *************** *** 16216,16222 **** return; (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ varname = get_tv_string_chk(&argvars[1]); ! buf = get_buf_tv(&argvars[0]); varp = &argvars[2]; if (buf != NULL && varname != NULL && varp != NULL) --- 16217,16223 ---- return; (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */ varname = get_tv_string_chk(&argvars[1]); ! buf = get_buf_tv(&argvars[0], FALSE); varp = &argvars[2]; if (buf != NULL && varname != NULL && varp != NULL) *** ../vim-7.3.868/src/ex_docmd.c 2013-03-13 18:30:39.000000000 +0100 --- src/ex_docmd.c 2013-03-19 14:15:17.000000000 +0100 *************** *** 2645,2651 **** while (p > ea.arg && vim_iswhite(p[-1])) --p; } ! ea.line2 = buflist_findpat(ea.arg, p, (ea.argt & BUFUNL) != 0, FALSE); if (ea.line2 < 0) /* failed */ goto doend; ea.addr_count = 1; --- 2645,2652 ---- while (p > ea.arg && vim_iswhite(p[-1])) --p; } ! ea.line2 = buflist_findpat(ea.arg, p, (ea.argt & BUFUNL) != 0, ! FALSE, FALSE); if (ea.line2 < 0) /* failed */ goto doend; ea.addr_count = 1; *** ../vim-7.3.868/src/if_perl.xs 2013-02-14 22:19:47.000000000 +0100 --- src/if_perl.xs 2013-03-19 14:15:46.000000000 +0100 *************** *** 1056,1062 **** pat = (char_u *)SvPV(sv, len); ++emsg_off; ! b = buflist_findpat(pat, pat+len, FALSE, FALSE); --emsg_off; } --- 1056,1062 ---- pat = (char_u *)SvPV(sv, len); ++emsg_off; ! b = buflist_findpat(pat, pat+len, FALSE, FALSE, FALSE); --emsg_off; } *** ../vim-7.3.868/src/proto/buffer.pro 2012-10-03 18:24:55.000000000 +0200 --- src/proto/buffer.pro 2013-03-19 14:16:22.000000000 +0100 *************** *** 17,23 **** void buflist_getfpos __ARGS((void)); buf_T *buflist_findname_exp __ARGS((char_u *fname)); buf_T *buflist_findname __ARGS((char_u *ffname)); ! int buflist_findpat __ARGS((char_u *pattern, char_u *pattern_end, int unlisted, int diffmode)); int ExpandBufnames __ARGS((char_u *pat, int *num_file, char_u ***file, int options)); buf_T *buflist_findnr __ARGS((int nr)); char_u *buflist_nr2name __ARGS((int n, int fullname, int helptail)); --- 17,23 ---- void buflist_getfpos __ARGS((void)); buf_T *buflist_findname_exp __ARGS((char_u *fname)); buf_T *buflist_findname __ARGS((char_u *ffname)); ! int buflist_findpat __ARGS((char_u *pattern, char_u *pattern_end, int unlisted, int diffmode, int curtab_only)); int ExpandBufnames __ARGS((char_u *pat, int *num_file, char_u ***file, int options)); buf_T *buflist_findnr __ARGS((int nr)); char_u *buflist_nr2name __ARGS((int n, int fullname, int helptail)); *** ../vim-7.3.868/src/version.c 2013-03-19 13:56:03.000000000 +0100 --- src/version.c 2013-03-19 14:23:42.000000000 +0100 *************** *** 730,731 **** --- 730,733 ---- { /* Add new patch number below this line */ + /**/ + 869, /**/ -- Proof techniques #2: Proof by Oddity. SAMPLE: To prove that horses have an infinite number of legs. (1) Horses have an even number of legs. (2) They have two legs in back and fore legs in front. (3) This makes a total of six legs, which certainly is an odd number of legs for a horse. (4) But the only number that is both odd and even is infinity. (5) Therefore, horses must have an infinite number of legs. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///