Re: [new feature] :tab modifier's counter supports dollar and relative number

2016-08-21 Fir de Conversatie Bram Moolenaar

Hirohito Higashi wrote:

> 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.

Thanks, I'll include it.

-- 
hundred-and-one symptoms of being an internet addict:
40. You tell the cab driver you live at
http://123.elm.street/house/bluetrim.html
41. You actually try that 123.elm.street address.

 /// Bram Moolenaar -- b...@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///

-- 
-- 
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.


[new feature] :tab modifier's counter supports dollar and relative number

2016-08-21 Fir de Conversatie h_east
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, '