1
0
forked from aniani/vim

updated for version 7.3.591

Problem:    Can only move to a tab by absolute number.
Solution:   Move a number of tabs to the left or the right. (Lech Lorens)
This commit is contained in:
Bram Moolenaar 2012-07-06 18:27:39 +02:00
parent 0306ac33a5
commit 8cb8dca2f0
7 changed files with 88 additions and 3 deletions

View File

@ -173,10 +173,20 @@ Other commands:
REORDERING TAB PAGES: REORDERING TAB PAGES:
:tabm[ove] [N] *:tabm* *:tabmove* :tabm[ove] [N] *:tabm* *:tabmove*
:[N]tabm[ove]
Move the current tab page to after tab page N. Use zero to 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 make the current tab page the first one. Without N the tab
page is made the last one. page is made the last one.
: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: LOOPING OVER TAB PAGES:

View File

@ -944,7 +944,7 @@ EX(CMD_tabfind, "tabfind", ex_splitview,
EX(CMD_tabfirst, "tabfirst", ex_tabnext, EX(CMD_tabfirst, "tabfirst", ex_tabnext,
TRLBAR), TRLBAR),
EX(CMD_tabmove, "tabmove", ex_tabmove, EX(CMD_tabmove, "tabmove", ex_tabmove,
RANGE|NOTADR|ZEROR|COUNT|TRLBAR|ZEROR), RANGE|NOTADR|ZEROR|EXTRA|NOSPC|TRLBAR),
EX(CMD_tablast, "tablast", ex_tabnext, EX(CMD_tablast, "tablast", ex_tabnext,
TRLBAR), TRLBAR),
EX(CMD_tabnext, "tabnext", ex_tabnext, EX(CMD_tabnext, "tabnext", ex_tabnext,

View File

@ -7478,7 +7478,42 @@ ex_tabnext(eap)
ex_tabmove(eap) ex_tabmove(eap)
exarg_T *eap; exarg_T *eap;
{ {
tabpage_move(eap->addr_count == 0 ? 9999 : (int)eap->line2); int tab_number = 9999;
if (eap->arg && *eap->arg != NUL)
{
char_u *p = eap->arg;
int relative = 0; /* argument +N/-N means: move N places to the
* right/left relative to the current position. */
if (*eap->arg == '-')
{
relative = -1;
p = eap->arg + 1;
}
else if (*eap->arg == '+')
{
relative = 1;
p = eap->arg + 1;
}
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);
} }
/* /*

View File

@ -93,6 +93,34 @@ STARTTEST
:endif :endif
:" :"
:" :"
: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 
:"
:"
:/^Results/,$w! test.out :/^Results/,$w! test.out
:qa! :qa!
ENDTEST ENDTEST

View File

@ -8,3 +8,13 @@ settabvar: pass
tab drop 1: pass tab drop 1: pass
tab drop 2: pass tab drop 2: pass
tab drop 3: pass tab drop 3: pass
1
6
4
8
10
1
10
4
6
E474 caught.

View File

@ -714,6 +714,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
591,
/**/ /**/
590, 590,
/**/ /**/

View File

@ -3929,7 +3929,7 @@ tabpage_move(nr)
} }
/* Re-insert it at the specified position. */ /* Re-insert it at the specified position. */
if (n == 0) if (n <= 0)
{ {
curtab->tp_next = first_tabpage; curtab->tp_next = first_tabpage;
first_tabpage = curtab; first_tabpage = curtab;