To: vim_dev@googlegroups.com Subject: Patch 8.0.0499 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.0499 Problem: taglist() does not prioritize tags for a buffer. Solution: Add an optional buffer argument. (Duncan McDougall, closes #1194) Files: runtime/doc/eval.txt, src/evalfunc.c, src/proto/tag.pro, src/Makefile, src/tag.c, src/testdir/test_alot.vim, src/testdir/test_taglist.vim *** ../vim-8.0.0498/runtime/doc/eval.txt 2017-03-19 21:20:45.893034321 +0100 --- runtime/doc/eval.txt 2017-03-21 16:57:32.247841355 +0100 *************** *** 2360,2366 **** 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} tagfiles() List tags files used tan({expr}) Float tangent of {expr} tanh({expr}) Float hyperbolic tangent of {expr} --- 2364,2370 ---- 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}[, {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} *************** *** 7722,7729 **** for the current buffer. This is the 'tags' option expanded. ! taglist({expr}) *taglist()* Returns a list of tags matching the regular expression {expr}. Each list item is a dictionary with at least the following entries: name Name of the tag. --- 7742,7754 ---- for the current buffer. This is the 'tags' option expanded. ! 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. *** ../vim-8.0.0498/src/evalfunc.c 2017-03-19 21:47:46.897119250 +0100 --- src/evalfunc.c 2017-03-21 16:56:27.592313015 +0100 *************** *** 824,830 **** {"tabpagenr", 0, 1, f_tabpagenr}, {"tabpagewinnr", 1, 2, f_tabpagewinnr}, {"tagfiles", 0, 0, f_tagfiles}, ! {"taglist", 1, 1, f_taglist}, #ifdef FEAT_FLOAT {"tan", 1, 1, f_tan}, {"tanh", 1, 1, f_tanh}, --- 824,830 ---- {"tabpagenr", 0, 1, f_tabpagenr}, {"tabpagewinnr", 1, 2, f_tabpagewinnr}, {"tagfiles", 0, 0, f_tagfiles}, ! {"taglist", 1, 2, f_taglist}, #ifdef FEAT_FLOAT {"tan", 1, 1, f_tan}, {"tanh", 1, 1, f_tanh}, *************** *** 3589,3595 **** fold_count = foldedCount(curwin, lnum, &foldinfo); if (fold_count > 0) { ! text = get_foldtext(curwin, lnum, lnum + fold_count - 1, &foldinfo, buf); if (text == buf) text = vim_strsave(text); rettv->vval.v_string = text; --- 3589,3596 ---- fold_count = foldedCount(curwin, lnum, &foldinfo); if (fold_count > 0) { ! text = get_foldtext(curwin, lnum, lnum + fold_count - 1, ! &foldinfo, buf); if (text == buf) text = vim_strsave(text); rettv->vval.v_string = text; *************** *** 12267,12272 **** --- 12268,12274 ---- 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,12282 **** if (*tag_pattern == NUL) return; if (rettv_list_alloc(rettv) == OK) ! (void)get_tags(rettv->vval.v_list, tag_pattern); } /* --- 12277,12286 ---- 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, fname); } /* *** ../vim-8.0.0498/src/proto/tag.pro 2016-09-12 13:04:20.000000000 +0200 --- src/proto/tag.pro 2017-03-21 16:59:54.218805832 +0100 *************** *** 8,12 **** 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); /* vim: set ft=c : */ --- 8,12 ---- 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, char_u *buf_fname); /* vim: set ft=c : */ *** ../vim-8.0.0498/src/Makefile 2017-03-19 21:36:52.825933116 +0100 --- src/Makefile 2017-03-21 17:02:01.857875019 +0100 *************** *** 2213,2218 **** --- 2212,2218 ---- test_tabpage \ test_tagcase \ test_tagjump \ + test_taglist \ test_tcl \ test_textobjects \ test_timers \ *** ../vim-8.0.0498/src/tag.c 2017-03-16 17:23:26.835815782 +0100 --- src/tag.c 2017-03-21 17:00:47.610416452 +0100 *************** *** 3876,3886 **** } /* ! * Add the tags matching the specified pattern to the list "list" ! * as a dictionary */ int ! get_tags(list_T *list, char_u *pat) { int num_matches, i, ret; char_u **matches, *p; --- 3876,3886 ---- } /* ! * 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, char_u *buf_fname) { int num_matches, i, ret; char_u **matches, *p; *************** *** 3890,3896 **** long is_static; ret = find_tags(pat, &num_matches, &matches, ! TAG_REGEXP | TAG_NOIC, (int)MAXCOL, NULL); if (ret == OK && num_matches > 0) { for (i = 0; i < num_matches; ++i) --- 3890,3896 ---- long is_static; ret = find_tags(pat, &num_matches, &matches, ! TAG_REGEXP | TAG_NOIC, (int)MAXCOL, buf_fname); if (ret == OK && num_matches > 0) { for (i = 0; i < num_matches; ++i) *** ../vim-8.0.0498/src/testdir/test_alot.vim 2017-03-19 21:36:52.821933145 +0100 --- src/testdir/test_alot.vim 2017-03-21 17:01:20.210178718 +0100 *************** *** 47,52 **** --- 47,53 ---- 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 *** ../vim-8.0.0498/src/testdir/test_taglist.vim 2017-03-21 17:07:32.199466722 +0100 --- src/testdir/test_taglist.vim 2017-03-21 17:03:54.725052065 +0100 *************** *** 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 + *** ../vim-8.0.0498/src/version.c 2017-03-21 15:50:03.713154799 +0100 --- src/version.c 2017-03-21 16:47:49.012075577 +0100 *************** *** 766,767 **** --- 766,769 ---- { /* Add new patch number below this line */ + /**/ + 499, /**/ -- hundred-and-one symptoms of being an internet addict: 178. You look for an icon to double-click to open your bedroom window. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///