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