To: vim_dev@googlegroups.com Subject: Patch 7.4.709 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.709 Problem: ":tabmove" does not work as documented. Solution: Make it work consistently. Update documentation and add tests. (Hirohito Higashi) Files: src/window.c, runtime/doc/tabpage.txt, src/ex_docmd.c, src/testdir/test62.in, src/testdir/test62.ok *** ../vim-7.4.708/src/window.c 2015-04-21 15:43:00.338397578 +0200 --- src/window.c 2015-04-21 18:05:36.180477302 +0200 *************** *** 4120,4137 **** } /* ! * 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; --- 4120,4146 ---- } /* ! * Move the current tab page to after tab page "nr". */ void tabpage_move(nr) int nr; { ! 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,4162 **** } /* 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. */ --- 4155,4169 ---- } /* Re-insert it at the specified position. */ ! if (nr <= 0) { curtab->tp_next = first_tabpage; first_tabpage = curtab; } else { ! curtab->tp_next = tp_dst->tp_next; ! tp_dst->tp_next = curtab; } /* Need to redraw the tabline. Tab page contents doesn't change. */ *** ../vim-7.4.708/runtime/doc/tabpage.txt 2015-01-07 16:52:53.506792420 +0100 --- runtime/doc/tabpage.txt 2015-04-21 18:01:53.042846350 +0200 *************** *** 202,224 **** 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 " move the tab page to the left ! :tabmove " move the tab page to the right ! :.tabmove " as above ! :+tabmove " as above :0tabmove " move the tab page to the beginning of the tab " list ! :$tabmove " move the tab page to the end of the tab list ! < :tabm[ove] +[N] :tabm[ove] -[N] Move the current tab page N places to the right (with +) or to ! the left (with -). 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]|. LOOPING OVER TAB PAGES: --- 202,230 ---- 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 :0tabmove " move the tab page to the beginning 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 -). > ! :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. And move it by N places by using :+Ntabmove. For clarification what ! +N means in this context see |[range]|. LOOPING OVER TAB PAGES: *** ../vim-7.4.708/src/ex_docmd.c 2015-04-13 12:35:50.180593380 +0200 --- src/ex_docmd.c 2015-04-21 18:01:53.042846350 +0200 *************** *** 8145,8151 **** ex_tabmove(eap) exarg_T *eap; { ! int tab_number = 9999; if (eap->arg && *eap->arg != NUL) { --- 8145,8151 ---- ex_tabmove(eap) exarg_T *eap; { ! int tab_number; if (eap->arg && *eap->arg != NUL) { *************** *** 8166,8184 **** else p = eap->arg; ! if (p == skipdigits(p)) { ! /* No numbers as argument. */ ! eap->errmsg = e_invarg; ! return; } - - 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; tabpage_move(tab_number); } --- 8166,8203 ---- else p = eap->arg; ! if (relative == 0) { ! 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; } } 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); } *** ../vim-7.4.708/src/testdir/test62.in 2015-01-07 15:57:13.145559792 +0100 --- src/testdir/test62.in 2015-04-21 18:01:15.231247887 +0200 *************** *** 96,125 **** :" :for i in range(9) | tabnew | endfor 1gt ! Go=tabpagenr()  :tabmove 5 ! i=tabpagenr()  :tabmove -2 ! i=tabpagenr()  :tabmove +4 ! i=tabpagenr()  :tabmove ! i=tabpagenr()  :tabmove -20 ! i=tabpagenr()  :tabmove +20 ! i=tabpagenr()  :3tabmove ! i=tabpagenr()  :7tabmove 5 ! i=tabpagenr()  :let a='No error caught.' :try :tabmove foo :catch E474 :let a='E474 caught.' :endtry ! i=a  :" :" Test autocommands :tabonly! --- 96,139 ---- :" :for i in range(9) | tabnew | endfor 1gt ! :$put =tabpagenr() :tabmove 5 ! :$put =tabpagenr() ! :.tabmove ! :$put =tabpagenr() ! :tabmove - ! :$put =tabpagenr() ! :tabmove + ! :$put =tabpagenr() :tabmove -2 ! :$put =tabpagenr() :tabmove +4 ! :$put =tabpagenr() :tabmove ! :$put =tabpagenr() :tabmove -20 ! :$put =tabpagenr() :tabmove +20 ! :$put =tabpagenr() ! :0tabmove ! :$put =tabpagenr() ! :$tabmove ! :$put =tabpagenr() ! :tabmove 0 ! :$put =tabpagenr() ! :tabmove $ ! :$put =tabpagenr() :3tabmove ! :$put =tabpagenr() :7tabmove 5 ! :$put =tabpagenr() :let a='No error caught.' :try :tabmove foo :catch E474 :let a='E474 caught.' :endtry ! :$put =a :" :" Test autocommands :tabonly! *** ../vim-7.4.708/src/testdir/test62.ok 2013-07-14 12:16:20.000000000 +0200 --- src/testdir/test62.ok 2015-04-21 18:01:15.231247887 +0200 *************** *** 9,22 **** tab drop 2: pass tab drop 3: pass 1 ! 6 4 ! 8 10 1 10 4 ! 6 E474 caught. === tab split === WinLeave --- 9,29 ---- tab drop 2: pass tab drop 3: pass 1 ! 5 ! 5 4 ! 5 ! 3 ! 7 ! 10 ! 1 ! 10 ! 1 10 1 10 4 ! 5 E474 caught. === tab split === WinLeave *** ../vim-7.4.708/src/version.c 2015-04-21 16:48:55.028917216 +0200 --- src/version.c 2015-04-21 18:00:49.083525577 +0200 *************** *** 743,744 **** --- 743,746 ---- { /* Add new patch number below this line */ + /**/ + 709, /**/ -- BEDEVERE: Why do you think she is a witch? SECOND VILLAGER: She turned me into a newt. BEDEVERE: A newt? SECOND VILLAGER: (After looking at himself for some time) I got better. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///