]> granicus.if.org Git - vim/commitdiff
patch 8.1.1087: tag stack is incorrect after CTRL-T and then :tag v8.1.1087
authorBram Moolenaar <Bram@vim.org>
Sat, 30 Mar 2019 18:12:02 +0000 (19:12 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 30 Mar 2019 18:12:02 +0000 (19:12 +0100)
Problem:    tag stack is incorrect after CTRL-T and then :tag
Solution:   Handle DT_TAG differently. (test by Andy Massimino, closes #3944,
            closes #4177)

src/tag.c
src/testdir/test_tagjump.vim
src/version.c

index 950ab8d95aa07876a7a5aa5f4e589b5e601f171c..c5cec8bc097d91d1575efa1f918d5ec65f8c6c6c 100644 (file)
--- a/src/tag.c
+++ b/src/tag.c
@@ -504,13 +504,16 @@ do_tag(
                tagmatchname = vim_strsave(name);
            }
 
-           if (type == DT_TAG || type == DT_SELECT || type == DT_JUMP
+           if (type == DT_SELECT || type == DT_JUMP
 #if defined(FEAT_QUICKFIX)
                || type == DT_LTAG
 #endif
                )
                cur_match = MAXCOL - 1;
-           max_num_matches = cur_match + 1;
+           if (type == DT_TAG)
+               max_num_matches = MAXCOL;
+           else
+               max_num_matches = cur_match + 1;
 
            /* when the argument starts with '/', use it as a regexp */
            if (!no_regexp && *name == '/')
@@ -583,7 +586,7 @@ do_tag(
            }
            else
 #endif
-           if (type == DT_TAG)
+           if (type == DT_TAG && *tag != NUL)
                /*
                 * If a count is supplied to the ":tag <name>" command, then
                 * jump to count'th matching tag.
index ae47a69c3ed9552ae17ce6afd1b39efd2ff136c7..4ce9ece879639421e84b4c61675f01a043343cf0 100644 (file)
@@ -366,4 +366,77 @@ func Test_getsettagstack()
   set tags&
 endfunc
 
+func Test_tag_with_count()
+  call writefile([
+       \ 'test Xtest.h /^void test();$/;"      p       typeref:typename:void   signature:()',
+       \ ], 'Xtags')
+  call writefile([
+       \ 'main Xtest.c /^int main()$/;"        f       typeref:typename:int    signature:()',
+       \ 'test Xtest.c /^void test()$/;"       f       typeref:typename:void   signature:()',
+       \ ], 'Ytags')
+  cal writefile([
+       \ 'int main()',
+       \ 'void test()',
+       \ ], 'Xtest.c')
+  cal writefile([
+       \ 'void test();',
+       \ ], 'Xtest.h')
+  set tags=Xtags,Ytags
+
+  new Xtest.c
+  let tl = taglist('test', 'Xtest.c')
+  call assert_equal(tl[0].filename, 'Xtest.c')
+  call assert_equal(tl[1].filename, 'Xtest.h')
+
+  tag test
+  call assert_equal(bufname('%'), 'Xtest.c')
+  1tag test
+  call assert_equal(bufname('%'), 'Xtest.c')
+  2tag test
+  call assert_equal(bufname('%'), 'Xtest.h')
+
+  set tags&
+  call delete('Xtags')
+  call delete('Ytags')
+  bwipe Xtest.h
+  bwipe Xtest.c
+  call delete('Xtest.h')
+  call delete('Xtest.c')
+endfunc
+
+func Test_tagnr_recall()
+  call writefile([
+       \ 'test Xtest.h /^void test();$/;"      p',
+       \ 'main Xtest.c /^int main()$/;"        f',
+       \ 'test Xtest.c /^void test()$/;"       f',
+       \ ], 'Xtags')
+  cal writefile([
+       \ 'int main()',
+       \ 'void test()',
+       \ ], 'Xtest.c')
+  cal writefile([
+       \ 'void test();',
+       \ ], 'Xtest.h')
+  set tags=Xtags
+
+  new Xtest.c
+  let tl = taglist('test', 'Xtest.c')
+  call assert_equal(tl[0].filename, 'Xtest.c')
+  call assert_equal(tl[1].filename, 'Xtest.h')
+
+  2tag test
+  call assert_equal(bufname('%'), 'Xtest.h')
+  pop
+  call assert_equal(bufname('%'), 'Xtest.c')
+  tag
+  call assert_equal(bufname('%'), 'Xtest.h')
+
+  set tag&
+  call delete('Xtags')
+  bwipe Xtest.h
+  bwipe Xtest.c
+  call delete('Xtest.h')
+  call delete('Xtest.c')
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index 063dea0a599eb18c3fbfa9a8da2998e2faab6f73..6d1df32f750242bfd41f40ba7d5d14082e4f5e27 100644 (file)
@@ -775,6 +775,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1087,
 /**/
     1086,
 /**/