mirror of
https://github.com/zoriya/vim.git
synced 2025-12-19 05:35:17 +00:00
updated for version 7.3.869
Problem: bufwinnr() matches buffers in other tabs.
Solution: For bufwinnr() and ? only match buffers in the current tab.
(Alexey Radkov)
This commit is contained in:
26
src/buffer.c
26
src/buffer.c
@@ -928,7 +928,8 @@ do_bufdel(command, arg, addr_count, start_bnr, end_bnr, forceit)
|
|||||||
if (!VIM_ISDIGIT(*arg))
|
if (!VIM_ISDIGIT(*arg))
|
||||||
{
|
{
|
||||||
p = skiptowhite_esc(arg);
|
p = skiptowhite_esc(arg);
|
||||||
bnr = buflist_findpat(arg, p, command == DOBUF_WIPE, FALSE);
|
bnr = buflist_findpat(arg, p, command == DOBUF_WIPE,
|
||||||
|
FALSE, FALSE);
|
||||||
if (bnr < 0) /* failed */
|
if (bnr < 0) /* failed */
|
||||||
break;
|
break;
|
||||||
arg = p;
|
arg = p;
|
||||||
@@ -2129,18 +2130,20 @@ buflist_findname_stat(ffname, stp)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(FEAT_LISTCMDS) || defined(FEAT_EVAL) || defined(FEAT_PERL) || defined(PROTO)
|
#if defined(FEAT_LISTCMDS) || defined(FEAT_EVAL) || defined(FEAT_PERL) \
|
||||||
|
|| defined(PROTO)
|
||||||
/*
|
/*
|
||||||
* Find file in buffer list by a regexp pattern.
|
* Find file in buffer list by a regexp pattern.
|
||||||
* Return fnum of the found buffer.
|
* Return fnum of the found buffer.
|
||||||
* Return < 0 for error.
|
* Return < 0 for error.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
buflist_findpat(pattern, pattern_end, unlisted, diffmode)
|
buflist_findpat(pattern, pattern_end, unlisted, diffmode, curtab_only)
|
||||||
char_u *pattern;
|
char_u *pattern;
|
||||||
char_u *pattern_end; /* pointer to first char after pattern */
|
char_u *pattern_end; /* pointer to first char after pattern */
|
||||||
int unlisted; /* find unlisted buffers */
|
int unlisted; /* find unlisted buffers */
|
||||||
int diffmode UNUSED; /* find diff-mode buffers only */
|
int diffmode UNUSED; /* find diff-mode buffers only */
|
||||||
|
int curtab_only; /* find buffers in current tab only */
|
||||||
{
|
{
|
||||||
buf_T *buf;
|
buf_T *buf;
|
||||||
regprog_T *prog;
|
regprog_T *prog;
|
||||||
@@ -2208,6 +2211,23 @@ buflist_findpat(pattern, pattern_end, unlisted, diffmode)
|
|||||||
#endif
|
#endif
|
||||||
&& buflist_match(prog, buf) != NULL)
|
&& 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 */
|
if (match >= 0) /* already found a match */
|
||||||
{
|
{
|
||||||
match = -2;
|
match = -2;
|
||||||
|
|||||||
@@ -2152,7 +2152,7 @@ ex_diffgetput(eap)
|
|||||||
i = atol((char *)eap->arg);
|
i = atol((char *)eap->arg);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
i = buflist_findpat(eap->arg, p, FALSE, TRUE);
|
i = buflist_findpat(eap->arg, p, FALSE, TRUE, FALSE);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
return; /* error message already given */
|
return; /* error message already given */
|
||||||
}
|
}
|
||||||
|
|||||||
19
src/eval.c
19
src/eval.c
@@ -9019,14 +9019,15 @@ f_bufloaded(argvars, rettv)
|
|||||||
rettv->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL);
|
rettv->vval.v_number = (buf != NULL && buf->b_ml.ml_mfp != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static buf_T *get_buf_tv __ARGS((typval_T *tv));
|
static buf_T *get_buf_tv __ARGS((typval_T *tv, int curtab_only));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get buffer by number or pattern.
|
* Get buffer by number or pattern.
|
||||||
*/
|
*/
|
||||||
static buf_T *
|
static buf_T *
|
||||||
get_buf_tv(tv)
|
get_buf_tv(tv, curtab_only)
|
||||||
typval_T *tv;
|
typval_T *tv;
|
||||||
|
int curtab_only;
|
||||||
{
|
{
|
||||||
char_u *name = tv->vval.v_string;
|
char_u *name = tv->vval.v_string;
|
||||||
int save_magic;
|
int save_magic;
|
||||||
@@ -9049,7 +9050,7 @@ get_buf_tv(tv)
|
|||||||
p_cpo = (char_u *)"";
|
p_cpo = (char_u *)"";
|
||||||
|
|
||||||
buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name),
|
buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name),
|
||||||
TRUE, FALSE));
|
TRUE, FALSE, curtab_only));
|
||||||
|
|
||||||
p_magic = save_magic;
|
p_magic = save_magic;
|
||||||
p_cpo = save_cpo;
|
p_cpo = save_cpo;
|
||||||
@@ -9073,7 +9074,7 @@ f_bufname(argvars, rettv)
|
|||||||
|
|
||||||
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
||||||
++emsg_off;
|
++emsg_off;
|
||||||
buf = get_buf_tv(&argvars[0]);
|
buf = get_buf_tv(&argvars[0], FALSE);
|
||||||
rettv->v_type = VAR_STRING;
|
rettv->v_type = VAR_STRING;
|
||||||
if (buf != NULL && buf->b_fname != NULL)
|
if (buf != NULL && buf->b_fname != NULL)
|
||||||
rettv->vval.v_string = vim_strsave(buf->b_fname);
|
rettv->vval.v_string = vim_strsave(buf->b_fname);
|
||||||
@@ -9096,7 +9097,7 @@ f_bufnr(argvars, rettv)
|
|||||||
|
|
||||||
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
||||||
++emsg_off;
|
++emsg_off;
|
||||||
buf = get_buf_tv(&argvars[0]);
|
buf = get_buf_tv(&argvars[0], FALSE);
|
||||||
--emsg_off;
|
--emsg_off;
|
||||||
|
|
||||||
/* If the buffer isn't found and the second argument is not zero create a
|
/* If the buffer isn't found and the second argument is not zero create a
|
||||||
@@ -9131,7 +9132,7 @@ f_bufwinnr(argvars, rettv)
|
|||||||
|
|
||||||
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
||||||
++emsg_off;
|
++emsg_off;
|
||||||
buf = get_buf_tv(&argvars[0]);
|
buf = get_buf_tv(&argvars[0], TRUE);
|
||||||
#ifdef FEAT_WINDOWS
|
#ifdef FEAT_WINDOWS
|
||||||
for (wp = firstwin; wp; wp = wp->w_next)
|
for (wp = firstwin; wp; wp = wp->w_next)
|
||||||
{
|
{
|
||||||
@@ -11095,7 +11096,7 @@ f_getbufline(argvars, rettv)
|
|||||||
|
|
||||||
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
||||||
++emsg_off;
|
++emsg_off;
|
||||||
buf = get_buf_tv(&argvars[0]);
|
buf = get_buf_tv(&argvars[0], FALSE);
|
||||||
--emsg_off;
|
--emsg_off;
|
||||||
|
|
||||||
lnum = get_tv_lnum_buf(&argvars[1], buf);
|
lnum = get_tv_lnum_buf(&argvars[1], buf);
|
||||||
@@ -11123,7 +11124,7 @@ f_getbufvar(argvars, rettv)
|
|||||||
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
||||||
varname = get_tv_string_chk(&argvars[1]);
|
varname = get_tv_string_chk(&argvars[1]);
|
||||||
++emsg_off;
|
++emsg_off;
|
||||||
buf = get_buf_tv(&argvars[0]);
|
buf = get_buf_tv(&argvars[0], FALSE);
|
||||||
|
|
||||||
if (argvars[2].v_type != VAR_UNKNOWN)
|
if (argvars[2].v_type != VAR_UNKNOWN)
|
||||||
/* set the default value */
|
/* set the default value */
|
||||||
@@ -16216,7 +16217,7 @@ f_setbufvar(argvars, rettv)
|
|||||||
return;
|
return;
|
||||||
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
(void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
|
||||||
varname = get_tv_string_chk(&argvars[1]);
|
varname = get_tv_string_chk(&argvars[1]);
|
||||||
buf = get_buf_tv(&argvars[0]);
|
buf = get_buf_tv(&argvars[0], FALSE);
|
||||||
varp = &argvars[2];
|
varp = &argvars[2];
|
||||||
|
|
||||||
if (buf != NULL && varname != NULL && varp != NULL)
|
if (buf != NULL && varname != NULL && varp != NULL)
|
||||||
|
|||||||
@@ -2645,7 +2645,8 @@ do_one_cmd(cmdlinep, sourcing,
|
|||||||
while (p > ea.arg && vim_iswhite(p[-1]))
|
while (p > ea.arg && vim_iswhite(p[-1]))
|
||||||
--p;
|
--p;
|
||||||
}
|
}
|
||||||
ea.line2 = buflist_findpat(ea.arg, p, (ea.argt & BUFUNL) != 0, FALSE);
|
ea.line2 = buflist_findpat(ea.arg, p, (ea.argt & BUFUNL) != 0,
|
||||||
|
FALSE, FALSE);
|
||||||
if (ea.line2 < 0) /* failed */
|
if (ea.line2 < 0) /* failed */
|
||||||
goto doend;
|
goto doend;
|
||||||
ea.addr_count = 1;
|
ea.addr_count = 1;
|
||||||
|
|||||||
@@ -1056,7 +1056,7 @@ Buffers(...)
|
|||||||
|
|
||||||
pat = (char_u *)SvPV(sv, len);
|
pat = (char_u *)SvPV(sv, len);
|
||||||
++emsg_off;
|
++emsg_off;
|
||||||
b = buflist_findpat(pat, pat+len, FALSE, FALSE);
|
b = buflist_findpat(pat, pat+len, FALSE, FALSE, FALSE);
|
||||||
--emsg_off;
|
--emsg_off;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ int buflist_getfile __ARGS((int n, linenr_T lnum, int options, int forceit));
|
|||||||
void buflist_getfpos __ARGS((void));
|
void buflist_getfpos __ARGS((void));
|
||||||
buf_T *buflist_findname_exp __ARGS((char_u *fname));
|
buf_T *buflist_findname_exp __ARGS((char_u *fname));
|
||||||
buf_T *buflist_findname __ARGS((char_u *ffname));
|
buf_T *buflist_findname __ARGS((char_u *ffname));
|
||||||
int buflist_findpat __ARGS((char_u *pattern, char_u *pattern_end, int unlisted, int diffmode));
|
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));
|
int ExpandBufnames __ARGS((char_u *pat, int *num_file, char_u ***file, int options));
|
||||||
buf_T *buflist_findnr __ARGS((int nr));
|
buf_T *buflist_findnr __ARGS((int nr));
|
||||||
char_u *buflist_nr2name __ARGS((int n, int fullname, int helptail));
|
char_u *buflist_nr2name __ARGS((int n, int fullname, int helptail));
|
||||||
|
|||||||
@@ -728,6 +728,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
869,
|
||||||
/**/
|
/**/
|
||||||
868,
|
868,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user