0
0
mirror of https://github.com/vim/vim.git synced 2025-09-09 22:23:37 -04:00

patch 8.0.0499: taglist() does not prioritize tags for a buffer

Problem:    taglist() does not prioritize tags for a buffer.
Solution:   Add an optional buffer argument. (Duncan McDougall, closes #1194)
This commit is contained in:
Bram Moolenaar 2017-03-21 17:09:10 +01:00
parent e94260f358
commit c6aafbaf3e
8 changed files with 44 additions and 10 deletions

View File

@ -2363,7 +2363,7 @@ systemlist({expr} [, {input}]) List output of shell command/filter {expr}
tabpagebuflist([{arg}]) List list of buffer numbers in tab page tabpagebuflist([{arg}]) List list of buffer numbers in tab page
tabpagenr([{arg}]) Number number of current or last tab page tabpagenr([{arg}]) Number number of current or last tab page
tabpagewinnr({tabarg}[, {arg}]) Number number of current window in tab page tabpagewinnr({tabarg}[, {arg}]) Number number of current window in tab page
taglist({expr}) List list of tags matching {expr} taglist({expr}[, {filename}]) List list of tags matching {expr}
tagfiles() List tags files used tagfiles() List tags files used
tan({expr}) Float tangent of {expr} tan({expr}) Float tangent of {expr}
tanh({expr}) Float hyperbolic tangent of {expr} tanh({expr}) Float hyperbolic tangent of {expr}
@ -7741,8 +7741,13 @@ tagfiles() Returns a |List| with the file names used to search for tags
for the current buffer. This is the 'tags' option expanded. for the current buffer. This is the 'tags' option expanded.
taglist({expr}) *taglist()* taglist({expr}[, {filename}]) *taglist()*
Returns a list of tags matching the regular expression {expr}. Returns a list of tags matching the regular expression {expr}.
If {filename} is passed it is used to prioritize the results
in the same way that |:tselect| does. See |tag-priority|.
{filename} should be the full path of the file.
Each list item is a dictionary with at least the following Each list item is a dictionary with at least the following
entries: entries:
name Name of the tag. name Name of the tag.

View File

@ -2213,6 +2213,7 @@ test_arglist \
test_tabpage \ test_tabpage \
test_tagcase \ test_tagcase \
test_tagjump \ test_tagjump \
test_taglist \
test_tcl \ test_tcl \
test_textobjects \ test_textobjects \
test_timers \ test_timers \

View File

@ -824,7 +824,7 @@ static struct fst
{"tabpagenr", 0, 1, f_tabpagenr}, {"tabpagenr", 0, 1, f_tabpagenr},
{"tabpagewinnr", 1, 2, f_tabpagewinnr}, {"tabpagewinnr", 1, 2, f_tabpagewinnr},
{"tagfiles", 0, 0, f_tagfiles}, {"tagfiles", 0, 0, f_tagfiles},
{"taglist", 1, 1, f_taglist}, {"taglist", 1, 2, f_taglist},
#ifdef FEAT_FLOAT #ifdef FEAT_FLOAT
{"tan", 1, 1, f_tan}, {"tan", 1, 1, f_tan},
{"tanh", 1, 1, f_tanh}, {"tanh", 1, 1, f_tanh},
@ -3589,7 +3589,8 @@ f_foldtextresult(typval_T *argvars UNUSED, typval_T *rettv)
fold_count = foldedCount(curwin, lnum, &foldinfo); fold_count = foldedCount(curwin, lnum, &foldinfo);
if (fold_count > 0) if (fold_count > 0)
{ {
text = get_foldtext(curwin, lnum, lnum + fold_count - 1, &foldinfo, buf); text = get_foldtext(curwin, lnum, lnum + fold_count - 1,
&foldinfo, buf);
if (text == buf) if (text == buf)
text = vim_strsave(text); text = vim_strsave(text);
rettv->vval.v_string = text; rettv->vval.v_string = text;
@ -12267,6 +12268,7 @@ f_tagfiles(typval_T *argvars UNUSED, typval_T *rettv)
static void static void
f_taglist(typval_T *argvars, typval_T *rettv) f_taglist(typval_T *argvars, typval_T *rettv)
{ {
char_u *fname = NULL;
char_u *tag_pattern; char_u *tag_pattern;
tag_pattern = get_tv_string(&argvars[0]); tag_pattern = get_tv_string(&argvars[0]);
@ -12275,8 +12277,10 @@ f_taglist(typval_T *argvars, typval_T *rettv)
if (*tag_pattern == NUL) if (*tag_pattern == NUL)
return; return;
if (argvars[1].v_type != VAR_UNKNOWN)
fname = get_tv_string(&argvars[1]);
if (rettv_list_alloc(rettv) == OK) if (rettv_list_alloc(rettv) == OK)
(void)get_tags(rettv->vval.v_list, tag_pattern); (void)get_tags(rettv->vval.v_list, tag_pattern, fname);
} }
/* /*

View File

@ -8,5 +8,5 @@ int get_tagfname(tagname_T *tnp, int first, char_u *buf);
void tagname_free(tagname_T *tnp); void tagname_free(tagname_T *tnp);
void simplify_filename(char_u *filename); void simplify_filename(char_u *filename);
int expand_tags(int tagnames, char_u *pat, int *num_file, char_u ***file); int expand_tags(int tagnames, char_u *pat, int *num_file, char_u ***file);
int get_tags(list_T *list, char_u *pat); int get_tags(list_T *list, char_u *pat, char_u *buf_fname);
/* vim: set ft=c : */ /* vim: set ft=c : */

View File

@ -3876,11 +3876,11 @@ add_tag_field(
} }
/* /*
* Add the tags matching the specified pattern to the list "list" * Add the tags matching the specified pattern "pat" to the list "list"
* as a dictionary * as a dictionary. Use "buf_fname" for priority, unless NULL.
*/ */
int int
get_tags(list_T *list, char_u *pat) get_tags(list_T *list, char_u *pat, char_u *buf_fname)
{ {
int num_matches, i, ret; int num_matches, i, ret;
char_u **matches, *p; char_u **matches, *p;
@ -3890,7 +3890,7 @@ get_tags(list_T *list, char_u *pat)
long is_static; long is_static;
ret = find_tags(pat, &num_matches, &matches, ret = find_tags(pat, &num_matches, &matches,
TAG_REGEXP | TAG_NOIC, (int)MAXCOL, NULL); TAG_REGEXP | TAG_NOIC, (int)MAXCOL, buf_fname);
if (ret == OK && num_matches > 0) if (ret == OK && num_matches > 0)
{ {
for (i = 0; i < num_matches; ++i) for (i = 0; i < num_matches; ++i)

View File

@ -47,6 +47,7 @@ source test_tabline.vim
source test_tabpage.vim source test_tabpage.vim
source test_tagcase.vim source test_tagcase.vim
source test_tagjump.vim source test_tagjump.vim
source test_taglist.vim
source test_timers.vim source test_timers.vim
source test_true_false.vim source test_true_false.vim
source test_unlet.vim source test_unlet.vim

View File

@ -0,0 +1,21 @@
" test 'taglist' function
func Test_taglist()
call writefile([
\ "FFoo\tXfoo\t1",
\ "FBar\tXfoo\t2",
\ "BFoo\tXbar\t1",
\ "BBar\tXbar\t2"
\ ], 'Xtags')
set tags=Xtags
split Xtext
call assert_equal(['FFoo', 'BFoo'], map(taglist("Foo"), {i, v -> v.name}))
call assert_equal(['FFoo', 'BFoo'], map(taglist("Foo", "Xtext"), {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 delete('Xtags')
bwipe
endfunc

View File

@ -764,6 +764,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 */
/**/
499,
/**/ /**/
498, 498,
/**/ /**/