diff src/buffer.c @ 698:e402b0af6083

updated for version 7.0211
author vimboss
date Wed, 01 Mar 2006 22:01:55 +0000
parents 473847b050f8
children 4cf1c5977c35
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -4191,6 +4191,8 @@ do_arg_all(count, forceit)
     int		p_ea_save;
     alist_T	*alist;		/* argument list to be used */
     buf_T	*buf;
+    tabpage_T	*tpnext;
+    int		had_tab = cmdmod.tab;
 
     if (ARGCOUNT <= 0)
     {
@@ -4214,79 +4216,97 @@ do_arg_all(count, forceit)
      * Also close windows that are not full width;
      * When 'hidden' or "forceit" set the buffer becomes hidden.
      * Windows that have a changed buffer and can't be hidden won't be closed.
+     * When the ":tab" modifier was used do this for all tab pages.
      */
-    for (wp = firstwin; wp != NULL; wp = wpnext)
+    if (had_tab > 0)
+	goto_tabpage_tp(first_tabpage);
+    for (;;)
     {
-	wpnext = wp->w_next;
-	buf = wp->w_buffer;
-	if (buf->b_ffname == NULL
-		|| buf->b_nwindows > 1
-#ifdef FEAT_VERTSPLIT
-		|| wp->w_width != Columns
-#endif
-		)
-	    i = ARGCOUNT;
-	else
+	tpnext = curtab->tp_next;
+	for (wp = firstwin; wp != NULL; wp = wpnext)
 	{
-	    /* check if the buffer in this window is in the arglist */
-	    for (i = 0; i < ARGCOUNT; ++i)
+	    wpnext = wp->w_next;
+	    buf = wp->w_buffer;
+	    if (buf->b_ffname == NULL
+		    || buf->b_nwindows > 1
+#ifdef FEAT_VERTSPLIT
+		    || wp->w_width != Columns
+#endif
+		    )
+		i = ARGCOUNT;
+	    else
 	    {
-		if (ARGLIST[i].ae_fnum == buf->b_fnum
-			|| fullpathcmp(alist_name(&ARGLIST[i]),
-					      buf->b_ffname, TRUE) & FPC_SAME)
+		/* check if the buffer in this window is in the arglist */
+		for (i = 0; i < ARGCOUNT; ++i)
 		{
-		    if (i < opened_len)
-			opened[i] = TRUE;
-		    if (wp->w_alist != curwin->w_alist)
+		    if (ARGLIST[i].ae_fnum == buf->b_fnum
+			    || fullpathcmp(alist_name(&ARGLIST[i]),
+						  buf->b_ffname, TRUE) & FPC_SAME)
 		    {
-			/* Use the current argument list for all windows
-			 * containing a file from it. */
-			alist_unlink(wp->w_alist);
-			wp->w_alist = curwin->w_alist;
-			++wp->w_alist->al_refcount;
+			if (i < opened_len)
+			    opened[i] = TRUE;
+			if (wp->w_alist != curwin->w_alist)
+			{
+			    /* Use the current argument list for all windows
+			     * containing a file from it. */
+			    alist_unlink(wp->w_alist);
+			    wp->w_alist = curwin->w_alist;
+			    ++wp->w_alist->al_refcount;
+			}
+			break;
 		    }
-		    break;
+		}
+	    }
+	    wp->w_arg_idx = i;
+
+	    if (i == ARGCOUNT)		/* close this window */
+	    {
+		if (P_HID(buf) || forceit || buf->b_nwindows > 1
+							    || !bufIsChanged(buf))
+		{
+		    /* If the buffer was changed, and we would like to hide it,
+		     * try autowriting. */
+		    if (!P_HID(buf) && buf->b_nwindows <= 1 && bufIsChanged(buf))
+		    {
+			(void)autowrite(buf, FALSE);
+#ifdef FEAT_AUTOCMD
+			/* check if autocommands removed the window */
+			if (!win_valid(wp) || !buf_valid(buf))
+			{
+			    wpnext = firstwin;	/* start all over... */
+			    continue;
+			}
+#endif
+		    }
+#ifdef FEAT_WINDOWS
+		    if (firstwin == lastwin)	/* don't close last window */
+#endif
+			use_firstwin = TRUE;
+#ifdef FEAT_WINDOWS
+		    else
+		    {
+			win_close(wp, !P_HID(buf) && !bufIsChanged(buf));
+# ifdef FEAT_AUTOCMD
+			/* check if autocommands removed the next window */
+			if (!win_valid(wpnext))
+			    wpnext = firstwin;	/* start all over... */
+# endif
+		    }
+#endif
 		}
 	    }
 	}
-	wp->w_arg_idx = i;
-
-	if (i == ARGCOUNT)		/* close this window */
-	{
-	    if (P_HID(buf) || forceit || buf->b_nwindows > 1
-							|| !bufIsChanged(buf))
-	    {
-		/* If the buffer was changed, and we would like to hide it,
-		 * try autowriting. */
-		if (!P_HID(buf) && buf->b_nwindows <= 1 && bufIsChanged(buf))
-		{
-		    (void)autowrite(buf, FALSE);
-#ifdef FEAT_AUTOCMD
-		    /* check if autocommands removed the window */
-		    if (!win_valid(wp) || !buf_valid(buf))
-		    {
-			wpnext = firstwin;	/* start all over... */
-			continue;
-		    }
-#endif
-		}
-#ifdef FEAT_WINDOWS
-		if (firstwin == lastwin)	/* don't close last window */
-#endif
-		    use_firstwin = TRUE;
-#ifdef FEAT_WINDOWS
-		else
-		{
-		    win_close(wp, !P_HID(buf) && !bufIsChanged(buf));
+
+	/* Without the ":tab" modifier only do the current tab page. */
+	if (had_tab == 0 || tpnext == NULL)
+	    break;
+
 # ifdef FEAT_AUTOCMD
-		    /* check if autocommands removed the next window */
-		    if (!win_valid(wpnext))
-			wpnext = firstwin;	/* start all over... */
+	/* check if autocommands removed the next tab page */
+	if (!valid_tabpage(tpnext))
+	    tpnext = first_tabpage;	/* start all over...*/
 # endif
-		}
-#endif
-	    }
-	}
+	goto_tabpage_tp(tpnext);
     }
 
     /*
@@ -4359,6 +4379,10 @@ do_arg_all(count, forceit)
 	    use_firstwin = FALSE;
 	}
 	ui_breakcheck();
+
+	/* When ":tab" was used open a new tab for a new window repeatedly. */
+	if (had_tab > 0 && tabpage_index(NULL) <= p_tpm)
+	    cmdmod.tab = 9999;
     }
 
     /* Remove the "lock" on the argument list. */
@@ -4390,6 +4414,10 @@ ex_buffer_all(eap)
     int		r;
     int		count;		/* Maximum number of windows to open. */
     int		all;		/* When TRUE also load inactive buffers. */
+#ifdef FEAT_WINDOWS
+    int		had_tab = cmdmod.tab;
+    tabpage_T	*tpnext;
+#endif
 
     if (eap->addr_count == 0)	/* make as many windows as possible */
 	count = 9999;
@@ -4410,27 +4438,48 @@ ex_buffer_all(eap)
      * Close superfluous windows (two windows for the same buffer).
      * Also close windows that are not full-width.
      */
-    for (wp = firstwin; wp != NULL; wp = wpnext)
+#ifdef FEAT_WINDOWS
+    if (had_tab > 0)
+	goto_tabpage_tp(first_tabpage);
+    for (;;)
     {
-	wpnext = wp->w_next;
-	if (wp->w_buffer->b_nwindows > 1
-#ifdef FEAT_VERTSPLIT
-		|| ((cmdmod.split & WSP_VERT)
-			  ? wp->w_height + wp->w_status_height < Rows - p_ch
-			  : wp->w_width != Columns)
-#endif
-		)
+#endif
+	tpnext = curtab->tp_next;
+	for (wp = firstwin; wp != NULL; wp = wpnext)
 	{
-	    win_close(wp, FALSE);
+	    wpnext = wp->w_next;
+	    if (wp->w_buffer->b_nwindows > 1
+#ifdef FEAT_VERTSPLIT
+		    || ((cmdmod.split & WSP_VERT)
+			? wp->w_height + wp->w_status_height < Rows - p_ch
+			: wp->w_width != Columns)
+#endif
+		    )
+	    {
+		win_close(wp, FALSE);
 #ifdef FEAT_AUTOCMD
-	    wpnext = firstwin;	/* just in case an autocommand does something
-				   strange with windows */
-	    open_wins = 0;
-#endif
+		wpnext = firstwin;	/* just in case an autocommand does
+					   something strange with windows */
+		open_wins = 0;
+#endif
+	    }
+	    else
+		++open_wins;
 	}
-	else
-	    ++open_wins;
+
+#ifdef FEAT_WINDOWS
+	/* Without the ":tab" modifier only do the current tab page. */
+	if (had_tab == 0 || tpnext == NULL)
+	    break;
+
+# ifdef FEAT_AUTOCMD
+	/* check if autocommands removed the next tab page */
+	if (!valid_tabpage(tpnext))
+	    tpnext = first_tabpage;	/* start all over...*/
+# endif
+	goto_tabpage_tp(tpnext);
     }
+#endif
 
     /*
      * Go through the buffer list.  When a buffer doesn't have a window yet,
@@ -4523,6 +4572,11 @@ ex_buffer_all(eap)
 	if (aborting())
 	    break;
 #endif
+#ifdef FEAT_WINDOWS
+	/* When ":tab" was used open a new tab for a new window repeatedly. */
+	if (had_tab > 0 && tabpage_index(NULL) <= p_tpm)
+	    cmdmod.tab = 9999;
+#endif
     }
 #ifdef FEAT_AUTOCMD
     --autocmd_no_enter;