Mercurial > vim
diff src/tag.c @ 19033:f0312cf3c792 v8.2.0077
patch 8.2.0077: settagstack() cannot truncate at current index
Commit: https://github.com/vim/vim/commit/271fa08a35b8d320d3a40db4ddae83b698fdd4fb
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Jan 2 14:02:16 2020 +0100
patch 8.2.0077: settagstack() cannot truncate at current index
Problem: settagstack() cannot truncate at current index.
Solution: Add the "t" action. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/5417)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 02 Jan 2020 14:15:05 +0100 |
parents | 7e7ec935e7c8 |
children | 8645b73b3645 |
line wrap: on
line diff
--- a/src/tag.c +++ b/src/tag.c @@ -4224,13 +4224,16 @@ tagstack_set_curidx(win_T *wp, int curid /* * Set the tag stack entries of the specified window. - * 'action' is set to either 'a' for append or 'r' for replace. + * 'action' is set to one of: + * 'a' for append + * 'r' for replace + * 't' for truncate */ int set_tagstack(win_T *wp, dict_T *d, int action) { dictitem_T *di; - list_T *l; + list_T *l = NULL; #ifdef FEAT_EVAL // not allowed to alter the tag stack entries from inside tagfunc @@ -4249,16 +4252,32 @@ set_tagstack(win_T *wp, dict_T *d, int a return FAIL; } l = di->di_tv.vval.v_list; - - if (action == 'r') - tagstack_clear(wp); - - tagstack_push_items(wp, l); } if ((di = dict_find(d, (char_u *)"curidx", -1)) != NULL) tagstack_set_curidx(wp, (int)tv_get_number(&di->di_tv) - 1); + if (action == 't') // truncate the stack + { + taggy_T *tagstack = wp->w_tagstack; + int tagstackidx = wp->w_tagstackidx; + int tagstacklen = wp->w_tagstacklen; + // delete all the tag stack entries above the current entry + while (tagstackidx < tagstacklen) + tagstack_clear_entry(&tagstack[--tagstacklen]); + wp->w_tagstacklen = tagstacklen; + } + + if (l != NULL) + { + if (action == 'r') // replace the stack + tagstack_clear(wp); + + tagstack_push_items(wp, l); + // set the current index after the last entry + wp->w_tagstackidx = wp->w_tagstacklen; + } + return OK; } #endif