0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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 #2402)
This commit is contained in:
Bram Moolenaar
2019-02-13 21:19:14 +01:00
parent 15bbd6ec87
commit 943e9639a9
4 changed files with 40 additions and 5 deletions

View File

@@ -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 {term} ;" The two characters semicolon and double quote. This is
interpreted by Vi as the start of a comment, which makes the interpreted by Vi as the start of a comment, which makes the
following be ignored. This is for backwards compatibility 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: {field} .. A list of optional fields. Each field has the form:
<Tab>{fieldname}:{value} <Tab>{fieldname}:{value}

View File

@@ -3014,7 +3014,10 @@ parse_match(
p = tagp->command; p = tagp->command;
if (find_extra(&p) == OK) 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 ";\"" */ p += 2; /* skip ";\"" */
if (*p++ == TAB) if (*p++ == TAB)
while (ASCII_ISALPHA(*p)) while (ASCII_ISALPHA(*p))
@@ -3784,7 +3787,7 @@ find_extra(char_u **pp)
{ {
char_u *str = *pp; char_u *str = *pp;
/* Repeat for addresses separated with ';' */ // Repeat for addresses separated with ';'
for (;;) for (;;)
{ {
if (VIM_ISDIGIT(*str)) if (VIM_ISDIGIT(*str))
@@ -3798,7 +3801,16 @@ find_extra(char_u **pp)
++str; ++str;
} }
else 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 != ';' if (str == NULL || *str != ';'
|| !(VIM_ISDIGIT(str[1]) || str[1] == '/' || str[1] == '?')) || !(VIM_ISDIGIT(str[1]) || str[1] == '/' || str[1] == '?'))
break; break;

View File

@@ -5,7 +5,9 @@ func Test_taglist()
\ "FFoo\tXfoo\t1", \ "FFoo\tXfoo\t1",
\ "FBar\tXfoo\t2", \ "FBar\tXfoo\t2",
\ "BFoo\tXbar\t1", \ "BFoo\tXbar\t1",
\ "BBar\tXbar\t2" \ "BBar\tXbar\t2",
\ "Kindly\tXbar\t3;\"\tv\tfile:",
\ "Command\tXbar\tcall cursor(3, 4)|;\"\td",
\ ], 'Xtags') \ ], 'Xtags')
set tags=Xtags set tags=Xtags
split Xtext 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(['FFoo', 'BFoo'], map(taglist("Foo", "Xfoo"), {i, v -> v.name}))
call assert_equal(['BFoo', 'FFoo'], map(taglist("Foo", "Xbar"), {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') call delete('Xtags')
bwipe bwipe
endfunc endfunc

View File

@@ -783,6 +783,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
911,
/**/ /**/
910, 910,
/**/ /**/