To: vim_dev@googlegroups.com
Subject: Patch 7.4.709
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
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 ///