Hi Bram and list,

I made a patch about :tab modifier counter.

Existing features:
    :tab split      " opens current buffer in new tab page
    :tab help gt    " opens tab page with help for "gt"
    :0tab help      " opens tab page with help before the first one

New features:
    :.tab help gt   " same as `:tab help gt`
    :+tab help      " opens tab page with help after the next tab page
    :-tab help      " opens tab page with help before the current one
    :$tab help      " opens tab page with help after the last one

Note:
If [counter] specified by absolute or relative values, It will perform the 
range check.
When it does out of range(0 ~ number of tabpages), error(E16) occurs.

Check it and include please.
--
Best regards,
Hirohito Higashi (a.k.a. h_east)

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
diff --git a/runtime/doc/tabpage.txt b/runtime/doc/tabpage.txt
index b98c18b..f2444c0 100644
--- a/runtime/doc/tabpage.txt
+++ b/runtime/doc/tabpage.txt
@@ -87,14 +87,21 @@ In the GUI tab pages line you can use the right mouse button to open menu.
 		Execute {cmd} and when it opens a new window open a new tab
 		page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
 		|:execute| and |:normal|.
-		When [count] is omitted the tab page appears after the current
-		one.
-		When [count] is specified the new tab page comes after tab
-		page [count].  Use ":0tab cmd" to get the new tab page as the
-		first one.
+		If [count] is given the new tab page appears after the tab
+		page [count] otherwise the new tab page will appear after the
+		current one.
 		Examples: >
-			:tab split	" opens current buffer in new tab page
-			:tab help gt	" opens tab page with help for "gt"
+		    :tab split	    " opens current buffer in new tab page
+		    :tab help gt    " opens tab page with help for "gt"
+		    :.tab help gt   " as above
+		    :+tab help	    " opens tab page with help after the next
+				    " tab page
+		    :-tab help	    " opens tab page with help before the
+				    " current one
+		    :0tab help	    " opens tab page with help before the
+				    " first one
+		    :$tab help	    " opens tab page with help after the last
+				    " one
 
 CTRL-W gf	Open a new tab page and edit the file name under the cursor.
 		See |CTRL-W_gf|.
@@ -141,10 +148,11 @@ something else.
 		given, then they become hidden.  But modified buffers are
 		never abandoned, so changes cannot get lost. >
 		    :tabonly	    " close all tab pages except the current
+				    " one
 
 :{count}tabo[nly][!]
 		Close all tab pages except the {count}th one. >
-		    :.tabonly	    " one
+		    :.tabonly	    " as above
 		    :-tabonly	    " close all tab pages except the previous
 				    " one
 		    :+tabonly	    " close all tab pages except the next one
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 1a7fbfa..9f1d227 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -1858,9 +1858,7 @@ do_one_cmd(
 /*
  * 2. Handle command modifiers.
  */
-	p = ea.cmd;
-	if (VIM_ISDIGIT(*ea.cmd))
-	    p = skipwhite(skipdigits(ea.cmd));
+	p = skip_range(ea.cmd, NULL);
 	switch (*p)
 	{
 	    /* When adding an entry, also modify cmd_exists(). */
@@ -1992,10 +1990,19 @@ do_one_cmd(
 	    case 't':	if (checkforcmd(&p, "tab", 3))
 			{
 #ifdef FEAT_WINDOWS
-			    if (vim_isdigit(*ea.cmd))
-				cmdmod.tab = atoi((char *)ea.cmd) + 1;
-			    else
+			    long tabnr = get_address(&ea, &ea.cmd, ADDR_TABS,
+								ea.skip, FALSE);
+			    if (tabnr == MAXLNUM)
 				cmdmod.tab = tabpage_index(curtab) + 1;
+			    else
+			    {
+				if (tabnr < 0 || tabnr > LAST_TAB_NR)
+				{
+				    errormsg = (char_u *)_(e_invrange);
+				    goto doend;
+				}
+				cmdmod.tab = tabnr + 1;
+			    }
 			    ea.cmd = p;
 #endif
 			    continue;
diff --git a/src/testdir/test_tabpage.vim b/src/testdir/test_tabpage.vim
index e6b85d6..f1c41e9 100644
--- a/src/testdir/test_tabpage.vim
+++ b/src/testdir/test_tabpage.vim
@@ -186,4 +186,36 @@ function Test_tabpage_with_autocmd()
   bw!
 endfunction
 
+function Test_tabpage_with_tab_modifier()
+  for n in range(4)
+    tabedit
+  endfor
+
+  function s:check_tab(pre_nr, cmd, post_nr)
+    exec 'tabnext ' . a:pre_nr
+    exec a:cmd
+    call assert_equal(a:post_nr, tabpagenr())
+    call assert_equal('help', &filetype)
+    helpclose
+  endfunc
+
+  call s:check_tab(1, 'tab help', 2)
+  call s:check_tab(1, '3tab help', 4)
+  call s:check_tab(1, '.tab help', 2)
+  call s:check_tab(1, '.+1tab help', 3)
+  call s:check_tab(1, '0tab help', 1)
+  call s:check_tab(2, '+tab help', 4)
+  call s:check_tab(2, '+2tab help', 5)
+  call s:check_tab(4, '-tab help', 4)
+  call s:check_tab(4, '-2tab help', 3)
+  call s:check_tab(3, '$tab help', 6)
+  call assert_fails('99tab help', 'E16:')
+  call assert_fails('+99tab help', 'E16:')
+  call assert_fails('-99tab help', 'E16:')
+
+  delfunction s:check_tab
+  tabonly!
+  bw!
+endfunction
+
 " vim: shiftwidth=2 sts=2 expandtab

Raspunde prin e-mail lui