changeset 15808:37d31fc37a5a v8.1.0911

patch 8.1.0911: tag line with Ex command cannot have extra fields commit https://github.com/vim/vim/commit/943e9639a9ecb08bdec78ae6695c917bca6210b9 Author: Bram Moolenaar <Bram@vim.org> 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)
author Bram Moolenaar <Bram@vim.org>
date Wed, 13 Feb 2019 21:30:06 +0100
parents 55ffa98b7166
children dd5e97262ca3
files runtime/doc/tagsrch.txt src/tag.c src/testdir/test_taglist.vim src/version.c
diffstat 4 files changed, 40 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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:
 
 			<Tab>{fieldname}:{value}
--- 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;
--- 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
--- 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,