diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-02-13 21:19:14 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-02-13 21:19:14 +0100 |
commit | 943e9639a9ecb08bdec78ae6695c917bca6210b9 (patch) | |
tree | d00072ca8b4c753fe1fb4f2dc024591bae4dec1d | |
parent | 15bbd6ec871a0efdd16256e1fccbaac0fd374cbd (diff) |
patch 8.1.0911: tag line with Ex command cannot have extra fieldsv8.1.0911
Problem: Tag line with Ex command cannot have extra fields.
Solution: Recognize |;" as the end of the command. (closes #2402)
-rw-r--r-- | runtime/doc/tagsrch.txt | 9 | ||||
-rw-r--r-- | src/tag.c | 18 | ||||
-rw-r--r-- | src/testdir/test_taglist.vim | 16 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 40 insertions, 5 deletions
diff --git a/runtime/doc/tagsrch.txt b/runtime/doc/tagsrch.txt index e6589c70b6..f9cc1efdc0 100644 --- a/runtime/doc/tagsrch.txt +++ b/runtime/doc/tagsrch.txt @@ -571,7 +571,14 @@ only supported by new versions of ctags (such as Exuberant 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: <Tab>{fieldname}:{value} @@ -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 index 0a9350adc7..de9ca0c809 100644 --- 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 index 59f7b5dadd..88960bafd2 100644 --- 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, |