summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-03-21 14:49:57 +0100
committerBram Moolenaar <Bram@vim.org>2021-03-21 14:49:57 +0100
commitf90c855c71863296859780f7b4e0386e96f1c465 (patch)
treea542be8accf9a37cd1c369c5b4a3f7d2f8df96ec
parent196a1f740981e878091fa124a400d1fc4bfa2bb0 (diff)
downloadvim-git-f90c855c71863296859780f7b4e0386e96f1c465.tar.gz
patch 8.2.2634: 'tagfunc' does not indicate using a patternv8.2.2634
Problem: 'tagfunc' does not indicate using a pattern. Solution: Add the "r" flag. (Andy Massimino, closes #7982)
-rw-r--r--runtime/doc/tagsrch.txt14
-rw-r--r--src/tag.c7
-rw-r--r--src/testdir/test_tagfunc.vim14
-rw-r--r--src/version.c2
4 files changed, 29 insertions, 8 deletions
diff --git a/runtime/doc/tagsrch.txt b/runtime/doc/tagsrch.txt
index f21bc9440..69c629c00 100644
--- a/runtime/doc/tagsrch.txt
+++ b/runtime/doc/tagsrch.txt
@@ -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
diff --git a/src/tag.c b/src/tag.c
index f26c7cd63..37ed66c6e 100644
--- 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);
diff --git a/src/testdir/test_tagfunc.vim b/src/testdir/test_tagfunc.vim
index 54c9e50b2..3eb390440 100644
--- a/src/testdir/test_tagfunc.vim
+++ b/src/testdir/test_tagfunc.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index 350f0a133..2ed5acaf2 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2634,
+/**/
2633,
/**/
2632,