diff src/window.c @ 682:f1b013312711

updated for version 7.0205
author vimboss
date Thu, 23 Feb 2006 21:26:58 +0000
parents 9364d114ed8d
children d7e33248b9c8
line wrap: on
line diff
--- a/src/window.c
+++ b/src/window.c
@@ -622,6 +622,10 @@ win_split(size, flags)
     int		size;
     int		flags;
 {
+    /* When the ":tab" modifier was used open a new tab page instead. */
+    if (may_open_tabpage() == OK)
+	return OK;
+
     /* Add flags from ":vertical", ":topleft" and ":botright". */
     flags |= cmdmod.split;
     if ((flags & WSP_TOP) && (flags & WSP_BOT))
@@ -2303,14 +2307,13 @@ alt_tabpage()
 {
     tabpage_T	*tp;
 
-    /* Use the next tab page if we are currently at the first one. */
-    if (curtab == first_tabpage)
+    /* Use the next tab page if possible. */
+    if (curtab->tp_next != NULL)
 	return curtab->tp_next;
 
-    /* Find the previous tab page. */
-    for (tp = first_tabpage; tp->tp_next != NULL; tp = tp->tp_next)
-	if (tp->tp_next == curtab)
-	    break;
+    /* Find the last but one tab page. */
+    for (tp = first_tabpage; tp->tp_next != curtab; tp = tp->tp_next)
+	;
     return tp;
 }
 
@@ -2990,14 +2993,17 @@ free_tabpage(tp)
 /*
  * Create a new Tab page with one window.
  * It will edit the current buffer, like after ":split".
- * Put it just after the current Tab page.
+ * When "after" is 0 put it just after the current Tab page.
+ * Otherwise put it just before tab page "after".
  * Return FAIL or OK.
  */
     int
-win_new_tabpage()
+win_new_tabpage(after)
+    int		after;
 {
     tabpage_T	*tp = curtab;
     tabpage_T	*newtp;
+    int		n;
 
     newtp = alloc_tabpage();
     if (newtp == NULL)
@@ -3015,8 +3021,25 @@ win_new_tabpage()
     if (win_alloc_firstwin(tp->tp_curwin) == OK)
     {
 	/* Make the new Tab page the new topframe. */
-	newtp->tp_next = tp->tp_next;
-	tp->tp_next = newtp;
+	if (after == 1)
+	{
+	    /* New tab page becomes the first one. */
+	    newtp->tp_next = first_tabpage;
+	    first_tabpage = newtp;
+	}
+	else
+	{
+	    if (after > 0)
+	    {
+		/* Put new tab page before tab page "after". */
+		n = 2;
+		for (tp = first_tabpage; tp->tp_next != NULL
+					       && n < after; tp = tp->tp_next)
+		    ++n;
+	    }
+	    newtp->tp_next = tp->tp_next;
+	    tp->tp_next = newtp;
+	}
 	win_init_size();
 	firstwin->w_winrow = tabpageline_height();
 
@@ -3036,6 +3059,24 @@ win_new_tabpage()
 }
 
 /*
+ * Open a new tab page if ":tab cmd" was used.  It will edit the same buffer,
+ * like with ":split".
+ * Returns OK if a new tab page was created, FAIL otherwise.
+ */
+    int
+may_open_tabpage()
+{
+    int		n = cmdmod.tab;
+
+    if (cmdmod.tab != 0)
+    {
+	cmdmod.tab = 0;	    /* reset it to avoid doing it twice */
+	return win_new_tabpage(n);
+    }
+    return FAIL;
+}
+
+/*
  * Create up to "maxcount" tabpages with empty windows.
  * Returns the number of resulting tab pages.
  */
@@ -3059,7 +3100,7 @@ make_tabpages(maxcount)
 #endif
 
     for (todo = count - 1; todo > 0; --todo)
-	if (win_new_tabpage() == FAIL)
+	if (win_new_tabpage(0) == FAIL)
 	    break;
 
 #ifdef FEAT_AUTOCMD
@@ -3212,6 +3253,7 @@ goto_tabpage(n)
     int	    n;
 {
     tabpage_T	*tp;
+    tabpage_T	*ttp;
     int		i;
 
     /* If there is only one it can't work. */
@@ -3230,6 +3272,19 @@ goto_tabpage(n)
 	else
 	    tp = curtab->tp_next;
     }
+    else if (n < 0)
+    {
+	/* "gT": go to previous tab page, wrap around end.  "N gT" repeats
+	 * this N times. */
+	ttp = curtab;
+	for (i = n; i < 0; ++i)
+	{
+	    for (tp = first_tabpage; tp->tp_next != ttp && tp->tp_next != NULL;
+		    tp = tp->tp_next)
+		;
+	    ttp = tp;
+	}
+    }
     else
     {
 	/* Go to tab page "n". */
@@ -3243,7 +3298,7 @@ goto_tabpage(n)
 	}
     }
 
-    if (leave_tabpage(tp->tp_curwin->w_buffer) == OK)
+    if (tp != curtab && leave_tabpage(tp->tp_curwin->w_buffer) == OK)
     {
 	if (valid_tabpage(tp))
 	    enter_tabpage(tp, curbuf);
@@ -3253,6 +3308,51 @@ goto_tabpage(n)
 }
 
 /*
+ * Move the current tab page to before tab page "nr".
+ */
+    void
+tabpage_move(nr)
+    int		nr;
+{
+    int		n = nr;
+    tabpage_T	*tp;
+
+    if (first_tabpage->tp_next == NULL)
+	return;
+
+    /* Remove the current tab page from the list of tab pages. */
+    if (curtab == first_tabpage)
+	first_tabpage = curtab->tp_next;
+    else
+    {
+	for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
+	    if (tp->tp_next == curtab)
+		break;
+	if (tp == NULL)	/* "cannot happen" */
+	    return;
+	tp->tp_next = curtab->tp_next;
+    }
+
+    /* Re-insert it at the specified position. */
+    if (n == 0)
+    {
+	curtab->tp_next = first_tabpage;
+	first_tabpage = curtab;
+    }
+    else
+    {
+	for (tp = first_tabpage; tp->tp_next != NULL && n > 1; tp = tp->tp_next)
+	    --n;
+	curtab->tp_next = tp->tp_next;
+	tp->tp_next = curtab;
+    }
+
+    /* Need to redraw the tabline.  Tab page contents doesn't change. */
+    redraw_tabline = TRUE;
+}
+
+
+/*
  * Go to another window.
  * When jumping to another buffer, stop Visual mode.  Do this before
  * changing windows so we can yank the selection into the '*' register.