diff -r ba8835947b8b src/buffer.c
--- a/src/buffer.c	Wed Feb 06 19:58:43 2013 +0100
+++ b/src/buffer.c	Fri Feb 08 01:37:08 2013 +0400
@@ -912,7 +912,8 @@
 		if (!VIM_ISDIGIT(*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 */
 			break;
 		    arg = p;
@@ -2116,11 +2117,12 @@
  * Return < 0 for error.
  */
     int
-buflist_findpat(pattern, pattern_end, unlisted, diffmode)
+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 diff-mode buffers only */
 {
     buf_T	*buf;
     regprog_T	*prog;
@@ -2188,6 +2190,29 @@
 #endif
 			    && buflist_match(prog, buf) != NULL)
 		    {
+			if (curtab_only)
+			{
+#ifdef FEAT_WINDOWS
+			    win_T	*wp;
+			    int		winnr = 0;
+			    int		found = FALSE;
+
+			    for (wp = firstwin; wp; wp = wp->w_next)
+			    {
+				++winnr;
+				if (wp->w_buffer == buf)
+				{
+				    found = TRUE;
+				    break;
+				}
+			    }
+			    if (!found)
+				continue;
+#else
+			    if (curwin->w_buffer != buf)
+				continue;
+#endif
+			}
 			if (match >= 0)		/* already found a match */
 			{
 			    match = -2;
diff -r ba8835947b8b src/diff.c
--- a/src/diff.c	Wed Feb 06 19:58:43 2013 +0100
+++ b/src/diff.c	Fri Feb 08 01:37:08 2013 +0400
@@ -2152,7 +2152,7 @@
 	    i = atol((char *)eap->arg);
 	else
 	{
-	    i = buflist_findpat(eap->arg, p, FALSE, TRUE);
+	    i = buflist_findpat(eap->arg, p, FALSE, TRUE, FALSE);
 	    if (i < 0)
 		return;		/* error message already given */
 	}
diff -r ba8835947b8b src/eval.c
--- a/src/eval.c	Wed Feb 06 19:58:43 2013 +0100
+++ b/src/eval.c	Fri Feb 08 01:37:08 2013 +0400
@@ -9001,14 +9001,15 @@
     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.
  */
     static buf_T *
-get_buf_tv(tv)
+get_buf_tv(tv, curtab_only)
     typval_T	*tv;
+    int		curtab_only;
 {
     char_u	*name = tv->vval.v_string;
     int		save_magic;
@@ -9031,7 +9032,7 @@
     p_cpo = (char_u *)"";
 
     buf = buflist_findnr(buflist_findpat(name, name + STRLEN(name),
-								TRUE, FALSE));
+						    TRUE, FALSE, curtab_only));
 
     p_magic = save_magic;
     p_cpo = save_cpo;
@@ -9055,7 +9056,7 @@
 
     (void)get_tv_number(&argvars[0]);	    /* issue errmsg if type error */
     ++emsg_off;
-    buf = get_buf_tv(&argvars[0]);
+    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);
@@ -9078,7 +9079,7 @@
 
     (void)get_tv_number(&argvars[0]);	    /* issue errmsg if type error */
     ++emsg_off;
-    buf = get_buf_tv(&argvars[0]);
+    buf = get_buf_tv(&argvars[0], FALSE);
     --emsg_off;
 
     /* If the buffer isn't found and the second argument is not zero create a
@@ -9113,7 +9114,7 @@
 
     (void)get_tv_number(&argvars[0]);	    /* issue errmsg if type error */
     ++emsg_off;
-    buf = get_buf_tv(&argvars[0]);
+    buf = get_buf_tv(&argvars[0], TRUE);
 #ifdef FEAT_WINDOWS
     for (wp = firstwin; wp; wp = wp->w_next)
     {
@@ -11077,7 +11078,7 @@
 
     (void)get_tv_number(&argvars[0]);	    /* issue errmsg if type error */
     ++emsg_off;
-    buf = get_buf_tv(&argvars[0]);
+    buf = get_buf_tv(&argvars[0], FALSE);
     --emsg_off;
 
     lnum = get_tv_lnum_buf(&argvars[1], buf);
@@ -11105,7 +11106,7 @@
     (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]);
+    buf = get_buf_tv(&argvars[0], FALSE);
 
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
@@ -16202,7 +16203,7 @@
 	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]);
+    buf = get_buf_tv(&argvars[0], FALSE);
     varp = &argvars[2];
 
     if (buf != NULL && varname != NULL && varp != NULL)
diff -r ba8835947b8b src/ex_docmd.c
--- a/src/ex_docmd.c	Wed Feb 06 19:58:43 2013 +0100
+++ b/src/ex_docmd.c	Fri Feb 08 01:37:08 2013 +0400
@@ -2643,7 +2643,8 @@
 	    while (p > ea.arg && vim_iswhite(p[-1]))
 		--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 */
 	    goto doend;
 	ea.addr_count = 1;
diff -r ba8835947b8b src/proto/buffer.pro
--- a/src/proto/buffer.pro	Wed Feb 06 19:58:43 2013 +0100
+++ b/src/proto/buffer.pro	Fri Feb 08 01:37:08 2013 +0400
@@ -17,7 +17,7 @@
 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 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));
