]> granicus.if.org Git - vim/commitdiff
patch 7.4.2237 v7.4.2237
authorBram Moolenaar <Bram@vim.org>
Sun, 21 Aug 2016 17:07:17 +0000 (19:07 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 21 Aug 2016 17:07:17 +0000 (19:07 +0200)
Problem:    Can't use "." and "$" with ":tab".
Solution:   Support a range for ":tab". (Hirohito Higashi)

runtime/doc/tabpage.txt
src/ex_docmd.c
src/testdir/test_tabpage.vim
src/version.c

index b98c18b02cbfe31cb47c5c60d14f71fc61547eca..f2444c017f4b90d6ee32eaa84edd496041ea2fbc 100644 (file)
@@ -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
index 1a7fbfabb7c169e0fe437fe63d64e52c6e6ad805..9f1d2279d34af41d8f2547de6a67c7cc05f458d4 100644 (file)
@@ -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;
index e6b85d6e1459f06bcfc263083d17ff9c34d25647..f1c41e967b324748055ba7329a13a93204673522 100644 (file)
@@ -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
index 8b8653190db8e5a420f81e9d75552f65db523a79..fe60c32489cd9e812f6350ad4037f66288b818a0 100644 (file)
@@ -763,6 +763,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2237,
 /**/
     2236,
 /**/