diff src/window.c @ 6775:c0bc9b60fb8a v7.4.709

patch 7.4.709 Problem: ":tabmove" does not work as documented. Solution: Make it work consistently. Update documentation and add tests. (Hirohito Higashi)
author Bram Moolenaar <bram@vim.org>
date Tue, 21 Apr 2015 18:08:39 +0200
parents fbcf54fc3a77
children 1efa7c2b9368
line wrap: on
line diff
--- a/src/window.c
+++ b/src/window.c
@@ -4120,18 +4120,27 @@ goto_tabpage_win(tp, wp)
 }
 
 /*
- * Move the current tab page to before tab page "nr".
+ * Move the current tab page to after tab page "nr".
  */
     void
 tabpage_move(nr)
     int		nr;
 {
-    int		n = nr;
-    tabpage_T	*tp;
+    int		n = 1;
+    tabpage_T	*tp, *tp_dst;
 
     if (first_tabpage->tp_next == NULL)
 	return;
 
+    for (tp = first_tabpage; tp->tp_next != NULL && n < nr; tp = tp->tp_next)
+	++n;
+
+    if (tp == curtab || (nr > 0 && tp->tp_next != NULL
+						    && tp->tp_next == curtab))
+	return;
+
+    tp_dst = tp;
+
     /* Remove the current tab page from the list of tab pages. */
     if (curtab == first_tabpage)
 	first_tabpage = curtab->tp_next;
@@ -4146,17 +4155,15 @@ tabpage_move(nr)
     }
 
     /* Re-insert it at the specified position. */
-    if (n <= 0)
+    if (nr <= 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;
+	curtab->tp_next = tp_dst->tp_next;
+	tp_dst->tp_next = curtab;
     }
 
     /* Need to redraw the tabline.  Tab page contents doesn't change. */