diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-03-21 17:09:10 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-03-21 17:09:10 +0100 |
commit | c6aafbaf3ea755e3ab4ee2e3045911126a08b038 (patch) | |
tree | d2a2ea57ffe7e8969d16c3d7423d53acd6e14b04 | |
parent | e94260f3582cf928cc59e792b3b6ede57794a4a6 (diff) | |
download | vim-git-c6aafbaf3ea755e3ab4ee2e3045911126a08b038.tar.gz |
patch 8.0.0499: taglist() does not prioritize tags for a bufferv8.0.0499
Problem: taglist() does not prioritize tags for a buffer.
Solution: Add an optional buffer argument. (Duncan McDougall, closes #1194)
-rw-r--r-- | runtime/doc/eval.txt | 9 | ||||
-rw-r--r-- | src/Makefile | 1 | ||||
-rw-r--r-- | src/evalfunc.c | 10 | ||||
-rw-r--r-- | src/proto/tag.pro | 2 | ||||
-rw-r--r-- | src/tag.c | 8 | ||||
-rw-r--r-- | src/testdir/test_alot.vim | 1 | ||||
-rw-r--r-- | src/testdir/test_taglist.vim | 21 | ||||
-rw-r--r-- | src/version.c | 2 |
8 files changed, 44 insertions, 10 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 5fa31a2e7..ff1b71fee 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -2363,7 +2363,7 @@ systemlist({expr} [, {input}]) List output of shell command/filter {expr} tabpagebuflist([{arg}]) List list of buffer numbers in tab page tabpagenr([{arg}]) Number number of current or last 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 tan({expr}) Float 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. -taglist({expr}) *taglist()* +taglist({expr}[, {filename}]) *taglist()* 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 entries: name Name of the tag. diff --git a/src/Makefile b/src/Makefile index 3d13b85e5..1309a636d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2213,6 +2213,7 @@ test_arglist \ test_tabpage \ test_tagcase \ test_tagjump \ + test_taglist \ test_tcl \ test_textobjects \ test_timers \ diff --git a/src/evalfunc.c b/src/evalfunc.c index 5dc7f8273..8869810df 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -824,7 +824,7 @@ static struct fst {"tabpagenr", 0, 1, f_tabpagenr}, {"tabpagewinnr", 1, 2, f_tabpagewinnr}, {"tagfiles", 0, 0, f_tagfiles}, - {"taglist", 1, 1, f_taglist}, + {"taglist", 1, 2, f_taglist}, #ifdef FEAT_FLOAT {"tan", 1, 1, f_tan}, {"tanh", 1, 1, f_tanh}, @@ -3589,7 +3589,8 @@ f_foldtextresult(typval_T *argvars UNUSED, typval_T *rettv) fold_count = foldedCount(curwin, lnum, &foldinfo); 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) text = vim_strsave(text); rettv->vval.v_string = text; @@ -12267,6 +12268,7 @@ f_tagfiles(typval_T *argvars UNUSED, typval_T *rettv) static void f_taglist(typval_T *argvars, typval_T *rettv) { + char_u *fname = NULL; char_u *tag_pattern; tag_pattern = get_tv_string(&argvars[0]); @@ -12275,8 +12277,10 @@ f_taglist(typval_T *argvars, typval_T *rettv) if (*tag_pattern == NUL) return; + if (argvars[1].v_type != VAR_UNKNOWN) + fname = get_tv_string(&argvars[1]); 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); } /* diff --git a/src/proto/tag.pro b/src/proto/tag.pro index 55f579da6..497a76e38 100644 --- a/src/proto/tag.pro +++ b/src/proto/tag.pro @@ -8,5 +8,5 @@ int get_tagfname(tagname_T *tnp, int first, char_u *buf); void tagname_free(tagname_T *tnp); void simplify_filename(char_u *filename); 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 : */ @@ -3876,11 +3876,11 @@ add_tag_field( } /* - * Add the tags matching the specified pattern to the list "list" - * as a dictionary + * Add the tags matching the specified pattern "pat" to the list "list" + * as a dictionary. Use "buf_fname" for priority, unless NULL. */ 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; char_u **matches, *p; @@ -3890,7 +3890,7 @@ get_tags(list_T *list, char_u *pat) long is_static; 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) { for (i = 0; i < num_matches; ++i) diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim index 314a5b7f5..7b31575ae 100644 --- a/src/testdir/test_alot.vim +++ b/src/testdir/test_alot.vim @@ -47,6 +47,7 @@ source test_tabline.vim source test_tabpage.vim source test_tagcase.vim source test_tagjump.vim +source test_taglist.vim source test_timers.vim source test_true_false.vim source test_unlet.vim diff --git a/src/testdir/test_taglist.vim b/src/testdir/test_taglist.vim new file mode 100644 index 000000000..b89b25eae --- /dev/null +++ b/src/testdir/test_taglist.vim @@ -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 + diff --git a/src/version.c b/src/version.c index ba8ff84d1..3b651ccae 100644 --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 499, +/**/ 498, /**/ 497, |