]> granicus.if.org Git - vim/commitdiff
patch 8.2.2634: 'tagfunc' does not indicate using a pattern v8.2.2634
authorBram Moolenaar <Bram@vim.org>
Sun, 21 Mar 2021 13:49:57 +0000 (14:49 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 21 Mar 2021 13:49:57 +0000 (14:49 +0100)
Problem:    'tagfunc' does not indicate using a pattern.
Solution:   Add the "r" flag. (Andy Massimino, closes #7982)

runtime/doc/tagsrch.txt
src/tag.c
src/testdir/test_tagfunc.vim
src/version.c

index f21bc9440cb846de419e1a49b731d52d53ad41ef..69c629c00b2ed12b57656f734d48bfb0ade2dd5f 100644 (file)
@@ -888,19 +888,25 @@ like |CTRL-]|.
 
 The function used for generating the taglist is specified by setting the
 'tagfunc' option.  The function will be called with three arguments:
-   a:pattern   The tag identifier used during the tag search.
-   a:flags     List of flags to control the function behavior.
+   a:pattern   The tag identifier or pattern used during the tag search.
+   a:flags     String containing flags to control the function behavior.
    a:info      Dict containing the following entries:
                    buf_ffname    Full filename which can be used for priority.
                    user_data     Custom data String, if stored in the tag
                                  stack previously by tagfunc.
 
-Currently two flags may be passed to the tag function:
+Currently up to three flags may be passed to the tag function:
   'c'          The function was invoked by a normal command being processed
                (mnemonic: the tag function may use the context around the
                cursor to perform a better job of generating the tag list.)
   'i'          In Insert mode, the user was completing a tag (with
-               |i_CTRL-X_CTRL-]|).
+               |i_CTRL-X_CTRL-]| or 'completeopt' contains `t`).
+  'r'          The first argument to tagfunc should be interpreted as a
+               |pattern| (see |tag-regexp|), such as when using: >
+                 :tag /pat
+<              It is also given when completing in insert mode.
+               If this flag is not present, the argument is usually taken
+               literally as the full tag name.
 
 Note that when 'tagfunc' is set, the priority of the tags described in
 |tag-priority| does not apply.  Instead, the priority is exactly as the
index f26c7cd63b277dc2de6fd5b4a2a8f2460054d81e..37ed66c6e6d6bc70a082328ce6075135371a4e8b 100644 (file)
--- a/src/tag.c
+++ b/src/tag.c
@@ -1308,7 +1308,7 @@ find_tagfunc_tags(
     int         result = FAIL;
     typval_T   args[4];
     typval_T   rettv;
-    char_u      flagString[3];
+    char_u      flagString[4];
     dict_T     *d;
     taggy_T    *tag = &curwin->w_tagstack[curwin->w_tagstackidx];
 
@@ -1335,9 +1335,10 @@ find_tagfunc_tags(
     args[3].v_type = VAR_UNKNOWN;
 
     vim_snprintf((char *)flagString, sizeof(flagString),
-                "%s%s",
+                "%s%s%s",
                 g_tag_at_cursor      ? "c": "",
-                flags & TAG_INS_COMP ? "i": "");
+                flags & TAG_INS_COMP ? "i": "",
+                flags & TAG_REGEXP   ? "r": "");
 
     save_pos = curwin->w_cursor;
     result = call_vim_function(curbuf->b_p_tfu, 3, args, &rettv);
index 54c9e50b2f18e33134353018eabb55a309fcb793..3eb3904406b55a62eb82cf20fc3bb122e82395da 100644 (file)
@@ -43,12 +43,24 @@ func Test_tagfunc()
   call assert_equal('one', g:tagfunc_args[0])
   call assert_equal('c', g:tagfunc_args[1])
 
+  let g:tagfunc_args=[]
+  execute "tag /foo$"
+  call assert_equal('foo$', g:tagfunc_args[0])
+  call assert_equal('r', g:tagfunc_args[1])
+
   set cpt=t
   let g:tagfunc_args=[]
   execute "normal! i\<c-n>\<c-y>"
-  call assert_equal('ci', g:tagfunc_args[1])
+  call assert_equal('\<\k\k', g:tagfunc_args[0])
+  call assert_equal('cir', g:tagfunc_args[1])
   call assert_equal('nothing1', getline('.')[0:7])
 
+  let g:tagfunc_args=[]
+  execute "normal! ono\<c-n>\<c-n>\<c-y>"
+  call assert_equal('\<no', g:tagfunc_args[0])
+  call assert_equal('cir', g:tagfunc_args[1])
+  call assert_equal('nothing2', getline('.')[0:7])
+
   func BadTagFunc1(...)
     return 0
   endfunc
index 350f0a13341f757ad1b0319a52a609112b69e999..2ed5acaf23c33a8aae2ad81ffbb7902dd0fa9bbe 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2634,
 /**/
     2633,
 /**/