forked from aniani/vim
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 #5417)
This commit is contained in:
33
src/tag.c
33
src/tag.c
@@ -4224,13 +4224,16 @@ tagstack_set_curidx(win_T *wp, int curidx)
|
||||
|
||||
/*
|
||||
* 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 action)
|
||||
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
|
||||
|
Reference in New Issue
Block a user