]> granicus.if.org Git - vim/commitdiff
patch 8.2.1835: ":help ??" finds the "!!" tag v8.2.1835
authorBram Moolenaar <Bram@vim.org>
Sun, 11 Oct 2020 17:08:33 +0000 (19:08 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 11 Oct 2020 17:08:33 +0000 (19:08 +0200)
Problem:    ":help ??" finds the "!!" tag.
Solution:   Do not translate "?" into ".".  (Naruhiko Nishino, closes #7114,
            closes #7115)

src/help.c
src/testdir/test_help_tagjump.vim
src/version.c

index 4d59ab90e1a333dac66de89a2a029a3073e69986..b361bb3850ac9104880c5c1d38d5bd57446b172a 100644 (file)
@@ -323,33 +323,57 @@ find_help_tags(
 {
     char_u     *s, *d;
     int                i;
-    static char *(mtable[]) = {"*", "g*", "[*", "]*", ":*",
-                              "/*", "/\\*", "\"*", "**",
-                              "cpo-*", "/\\(\\)", "/\\%(\\)",
-                              "?", ":?", "?<CR>", "g?", "g?g?", "g??",
-                              "-?", "q?", "v_g?",
-                              "/\\?", "/\\z(\\)", "\\=", ":s\\=",
-                              "[count]", "[quotex]",
-                              "[range]", ":[range]",
-                              "[pattern]", "\\|", "\\%$",
-                              "s/\\~", "s/\\U", "s/\\L",
-                              "s/\\1", "s/\\2", "s/\\3", "s/\\9"};
-    static char *(rtable[]) = {"star", "gstar", "[star", "]star", ":star",
-                              "/star", "/\\\\star", "quotestar", "starstar",
-                              "cpo-star", "/\\\\(\\\\)", "/\\\\%(\\\\)",
-                              "?", ":?", "?<CR>", "g?", "g?g?", "g??",
-                              "-?", "q?", "v_g?",
-                              "/\\\\?", "/\\\\z(\\\\)", "\\\\=", ":s\\\\=",
-                              "\\[count]", "\\[quotex]",
-                              "\\[range]", ":\\[range]",
-                              "\\[pattern]", "\\\\bar", "/\\\\%\\$",
-                              "s/\\\\\\~", "s/\\\\U", "s/\\\\L",
-                              "s/\\\\1", "s/\\\\2", "s/\\\\3", "s/\\\\9"};
+    // Specific tags that either have a specific replacement or won't go
+    // throught the generic rules.
+    static char *(except_tbl[][2]) = {
+       {"*",           "star"},
+       {"g*",          "gstar"},
+       {"[*",          "[star"},
+       {"]*",          "]star"},
+       {":*",          ":star"},
+       {"/*",          "/star"},
+       {"/\\*",        "/\\\\star"},
+       {"\"*",         "quotestar"},
+       {"**",          "starstar"},
+       {"cpo-*",       "cpo-star"},
+       {"/\\(\\)",     "/\\\\(\\\\)"},
+       {"/\\%(\\)",    "/\\\\%(\\\\)"},
+       {"?",           "?"},
+       {"??",          "??"},
+       {":?",          ":?"},
+       {"?<CR>",       "?<CR>"},
+       {"g?",          "g?"},
+       {"g?g?",        "g?g?"},
+       {"g??",         "g??"},
+       {"-?",          "-?"},
+       {"q?",          "q?"},
+       {"v_g?",        "v_g?"},
+       {"/\\?",        "/\\\\?"},
+       {"/\\z(\\)",    "/\\\\z(\\\\)"},
+       {"\\=",         "\\\\="},
+       {":s\\=",       ":s\\\\="},
+       {"[count]",     "\\[count]"},
+       {"[quotex]",    "\\[quotex]"},
+       {"[range]",     "\\[range]"},
+       {":[range]",    ":\\[range]"},
+       {"[pattern]",   "\\[pattern]"},
+       {"\\|",         "\\\\bar"},
+       {"\\%$",        "/\\\\%\\$"},
+       {"s/\\~",       "s/\\\\\\~"},
+       {"s/\\U",       "s/\\\\U"},
+       {"s/\\L",       "s/\\\\L"},
+       {"s/\\1",       "s/\\\\1"},
+       {"s/\\2",       "s/\\\\2"},
+       {"s/\\3",       "s/\\\\3"},
+       {"s/\\9",       "s/\\\\9"},
+       {NULL, NULL}
+    };
     static char *(expr_table[]) = {"!=?", "!~?", "<=?", "<?", "==?", "=~?",
-                               ">=?", ">?", "is?", "isnot?"};
+                                  ">=?", ">?", "is?", "isnot?"};
     int flags;
 
     d = IObuff;                    // assume IObuff is long enough!
+    d[0] = NUL;
 
     if (STRNICMP(arg, "expr-", 5) == 0)
     {
@@ -376,16 +400,16 @@ find_help_tags(
     else
     {
        // Recognize a few exceptions to the rule.  Some strings that contain
-       // '*' with "star".  Otherwise '*' is recognized as a wildcard.
-       for (i = (int)(sizeof(mtable) / sizeof(char *)); --i >= 0; )
-           if (STRCMP(arg, mtable[i]) == 0)
+       // '*'are changed to "star", otherwise '*' is recognized as a wildcard.
+       for (i = 0; except_tbl[i][0] != NULL; ++i)
+           if (STRCMP(arg, except_tbl[i][0]) == 0)
            {
-               STRCPY(d, rtable[i]);
+               STRCPY(d, except_tbl[i][1]);
                break;
            }
     }
 
-    if (i < 0) // no match in table
+    if (d[0] == NUL)   // no match in table
     {
        // Replace "\S" with "/\\S", etc.  Otherwise every tag is matched.
        // Also replace "\%^" and "\%(", they match every tag too.
index 7de2b1551c77446df5631ec2e40a5c30c99814a4..63042d99810c2cb3f2e739a5883a3926c248a208 100644 (file)
@@ -16,6 +16,11 @@ func Test_help_tagjump()
   call assert_true(getline('.') =~ '\*quote\*')
   helpclose
 
+  help *
+  call assert_equal("help", &filetype)
+  call assert_true(getline('.') =~ '\*star\*')
+  helpclose
+
   help "*
   call assert_equal("help", &filetype)
   call assert_true(getline('.') =~ '\*quotestar\*')
@@ -26,6 +31,11 @@ func Test_help_tagjump()
   call assert_true(getline('.') =~ '\*:smile\*')
   helpclose
 
+  help ??
+  call assert_equal("help", &filetype)
+  call assert_true(getline('.') =~ '\*??\*')
+  helpclose
+
   help :?
   call assert_equal("help", &filetype)
   call assert_true(getline('.') =~ '\*:?\*')
index ced1ef78d65eaba9bf19626f30d3e011b928a66f..7a8fe0589e805ba3def4036c43482c8aa5f8d6e7 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1835,
 /**/
     1834,
 /**/