| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.869 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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 */ |
| } |
| |
| |
| |
| *** 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) |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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; |
| } |
| |
| |
| |
| |
| *** 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)); |
| |
| |
| |
| *** 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 /// |