diff --git a/7.3.869 b/7.3.869 new file mode 100644 index 0000000..a848f0c --- /dev/null +++ b/7.3.869 @@ -0,0 +1,358 @@ +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 ///