# HG changeset patch # User Bram Moolenaar # Date 1550089806 -3600 # Node ID 37d31fc37a5acd7b4834913c199ef231021b10f2 # Parent 55ffa98b71662710877fc1b91370a16e4c6516cc patch 8.1.0911: tag line with Ex command cannot have extra fields commit https://github.com/vim/vim/commit/943e9639a9ecb08bdec78ae6695c917bca6210b9 Author: Bram Moolenaar Date: Wed Feb 13 21:19:14 2019 +0100 patch 8.1.0911: tag line with Ex command cannot have extra fields Problem: Tag line with Ex command cannot have extra fields. Solution: Recognize |;" as the end of the command. (closes https://github.com/vim/vim/issues/2402) diff --git a/runtime/doc/tagsrch.txt b/runtime/doc/tagsrch.txt --- a/runtime/doc/tagsrch.txt +++ b/runtime/doc/tagsrch.txt @@ -571,7 +571,14 @@ only supported by new versions of ctags {term} ;" The two characters semicolon and double quote. This is interpreted by Vi as the start of a comment, which makes the following be ignored. This is for backwards compatibility - with Vi, it ignores the following fields. + with Vi, it ignores the following fields. Example: + APP file /^static int APP;$/;" v + When {tagaddress} is not a line number or search pattern, then + {term} must be |;". Here the bar ends the command (excluding + the bar) and ;" is used to have Vi ignore the rest of the + line. Example: + APP file.c call cursor(3, 4)|;" v + {field} .. A list of optional fields. Each field has the form: {fieldname}:{value} diff --git a/src/tag.c b/src/tag.c --- a/src/tag.c +++ b/src/tag.c @@ -3014,7 +3014,10 @@ parse_match( p = tagp->command; if (find_extra(&p) == OK) { - tagp->command_end = p; + if (p > tagp->command && p[-1] == '|') + tagp->command_end = p - 1; // drop trailing bar + else + tagp->command_end = p; p += 2; /* skip ";\"" */ if (*p++ == TAB) while (ASCII_ISALPHA(*p)) @@ -3784,7 +3787,7 @@ find_extra(char_u **pp) { char_u *str = *pp; - /* Repeat for addresses separated with ';' */ + // Repeat for addresses separated with ';' for (;;) { if (VIM_ISDIGIT(*str)) @@ -3798,7 +3801,16 @@ find_extra(char_u **pp) ++str; } else - str = NULL; + { + // not a line number or search string, look for terminator. + str = (char_u *)strstr((char *)str, "|;\""); + if (str != NULL) + { + ++str; + break; + } + + } if (str == NULL || *str != ';' || !(VIM_ISDIGIT(str[1]) || str[1] == '/' || str[1] == '?')) break; diff --git a/src/testdir/test_taglist.vim b/src/testdir/test_taglist.vim --- a/src/testdir/test_taglist.vim +++ b/src/testdir/test_taglist.vim @@ -5,7 +5,9 @@ func Test_taglist() \ "FFoo\tXfoo\t1", \ "FBar\tXfoo\t2", \ "BFoo\tXbar\t1", - \ "BBar\tXbar\t2" + \ "BBar\tXbar\t2", + \ "Kindly\tXbar\t3;\"\tv\tfile:", + \ "Command\tXbar\tcall cursor(3, 4)|;\"\td", \ ], 'Xtags') set tags=Xtags split Xtext @@ -15,6 +17,18 @@ func Test_taglist() call assert_equal(['FFoo', 'BFoo'], map(taglist("Foo", "Xfoo"), {i, v -> v.name})) call assert_equal(['BFoo', 'FFoo'], map(taglist("Foo", "Xbar"), {i, v -> v.name})) + let kind = taglist("Kindly") + call assert_equal(1, len(kind)) + call assert_equal('v', kind[0]['kind']) + call assert_equal('3', kind[0]['cmd']) + call assert_equal(1, kind[0]['static']) + call assert_equal('Xbar', kind[0]['filename']) + + let cmd = taglist("Command") + call assert_equal(1, len(cmd)) + call assert_equal('d', cmd[0]['kind']) + call assert_equal('call cursor(3, 4)', cmd[0]['cmd']) + call delete('Xtags') bwipe endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -784,6 +784,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 911, +/**/ 910, /**/ 909,