]> granicus.if.org Git - vim/commitdiff
patch 7.4.709 v7.4.709
authorBram Moolenaar <Bram@vim.org>
Tue, 21 Apr 2015 16:08:39 +0000 (18:08 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 21 Apr 2015 16:08:39 +0000 (18:08 +0200)
Problem:    ":tabmove" does not work as documented.
Solution:   Make it work consistently.  Update documentation and add tests.
            (Hirohito Higashi)

runtime/doc/tabpage.txt
src/ex_docmd.c
src/testdir/test62.in
src/testdir/test62.ok
src/version.c
src/window.c

index 2d44fe2ff53dcc4269eadb2bc7cf6814389f0ab0..46e0a8fde2eb568d2da61969b9233d20de219a99 100644 (file)
@@ -202,23 +202,29 @@ REORDERING TAB PAGES:
                Move the current tab page to after tab page N.  Use zero to
                make the current tab page the first one.  Without N the tab
                page is made the last one. >
+                   :.tabmove   " do nothing
                    :-tabmove   " move the tab page to the left
-                   :tabmove    " move the tab page to the right
-                   :.tabmove   " as above
-                   :+tabmove   " as above
+                   :+tabmove   " move the tab page to the right
                    :0tabmove   " move the tab page to the beginning of the tab
                                " list
-                   :$tabmove   " move the tab page to the end of the tab list
-<
+                   :tabmove 0  " as above
+                   :tabmove    " move the tab page to the last
+                   :$tabmove   " as above
+                   :tabmove $  " as above
 
 :tabm[ove] +[N]
 :tabm[ove] -[N]
                Move the current tab page N places to the right (with +) or to
-               the left (with -).
+               the left (with -). >
+                   :tabmove -  " move the tab page to the left
+                   :tabmove -1 " as above
+                   :tabmove +  " move the tab page to the right
+                   :tabmove +1 " as above
+
 
 Note that although it is possible to move a tab behind the N-th one by using
-:Ntabmove, it is impossible to move it by N places by using :+Ntabmove. For
-clarification what +N means in this context see |[range]|.
+:Ntabmove. And move it by N places by using :+Ntabmove. For clarification what
++N means in this context see |[range]|.
 
 
 LOOPING OVER TAB PAGES:
index e46ea05c1d4781adb18be7e588b74e60737ac179..af63b6c41058c30a071fb998eb656c126675c822 100644 (file)
@@ -8145,7 +8145,7 @@ ex_tabnext(eap)
 ex_tabmove(eap)
     exarg_T    *eap;
 {
-    int tab_number = 9999;
+    int tab_number;
 
     if (eap->arg && *eap->arg != NUL)
     {
@@ -8166,19 +8166,38 @@ ex_tabmove(eap)
        else
            p = eap->arg;
 
-       if (p == skipdigits(p))
+       if (relative == 0)
        {
-           /* No numbers as argument. */
-           eap->errmsg = e_invarg;
-           return;
+           if (STRCMP(p, "$") == 0)
+               tab_number = LAST_TAB_NR;
+           else if (p == skipdigits(p))
+           {
+               /* No numbers as argument. */
+               eap->errmsg = e_invarg;
+               return;
+           }
+           else
+               tab_number = getdigits(&p);
+       }
+       else
+       {
+           if (*p != NUL)
+               tab_number = getdigits(&p);
+           else
+               tab_number = 1;
+           tab_number = tab_number * relative + tabpage_index(curtab);
+           if (relative == -1)
+               --tab_number;
        }
-
-       tab_number = getdigits(&p);
-       if (relative != 0)
-           tab_number = tab_number * relative + tabpage_index(curtab) - 1;;
     }
     else if (eap->addr_count != 0)
+    {
        tab_number = eap->line2;
+       if (**eap->cmdlinep == '-')
+           --tab_number;
+    }
+    else
+       tab_number = LAST_TAB_NR;
 
     tabpage_move(tab_number);
 }
index c201fe713739cd3cd663c073258d65cf697518e2..c437f36a86295563ec9d4f75138bcdde250cec29 100644 (file)
@@ -96,30 +96,44 @@ STARTTEST
 :"
 :for i in range(9) | tabnew | endfor
 1gt
-Go\12=tabpagenr()\r\r\e
+:$put =tabpagenr()
 :tabmove 5
-i\12=tabpagenr()\r\r\e
+:$put =tabpagenr()
+:.tabmove
+:$put =tabpagenr()
+:tabmove -
+:$put =tabpagenr()
+:tabmove +
+:$put =tabpagenr()
 :tabmove -2
-i\12=tabpagenr()\r\r\e
+:$put =tabpagenr()
 :tabmove +4
-i\12=tabpagenr()\r\r\e
+:$put =tabpagenr()
 :tabmove
-i\12=tabpagenr()\r\r\e
+:$put =tabpagenr()
 :tabmove -20
-i\12=tabpagenr()\r\r\e
+:$put =tabpagenr()
 :tabmove +20
-i\12=tabpagenr()\r\r\e
+:$put =tabpagenr()
+:0tabmove
+:$put =tabpagenr()
+:$tabmove
+:$put =tabpagenr()
+:tabmove 0
+:$put =tabpagenr()
+:tabmove $
+:$put =tabpagenr()
 :3tabmove
-i\12=tabpagenr()\r\r\e
+:$put =tabpagenr()
 :7tabmove 5
-i\12=tabpagenr()\r\r\e
+:$put =tabpagenr()
 :let a='No error caught.'
 :try
 :tabmove foo
 :catch E474
 :let a='E474 caught.'
 :endtry
-i\12=a\r\e
+:$put =a
 :"
 :" Test autocommands
 :tabonly!
index e35b2b1c67a4c0950d02fe5711f738da829818ba..a0115bf6cd2aa0e377eda6447d4084c661317e94 100644 (file)
@@ -9,14 +9,21 @@ tab drop 1: pass
 tab drop 2: pass
 tab drop 3: pass
 1
-6
+5
+5
 4
-8
+5
+3
+7
+10
+1
+10
+1
 10
 1
 10
 4
-6
+5
 E474 caught.
 === tab split ===
 WinLeave
index a80370871f2db71aab6aef2b5f021d2a20e9f924..850f37c4cca505ea97f9abe4c2788b0e4f95fd9c 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    709,
 /**/
     708,
 /**/
index 952143003a8e215bbfbb44eadaeb5d39ebfc196c..609ab3e6a8ae59a465b05fece53e1accd81a98ac 100644 (file)
@@ -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. */