summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-01-02 14:02:16 +0100
committerBram Moolenaar <Bram@vim.org>2020-01-02 14:02:16 +0100
commit271fa08a35b8d320d3a40db4ddae83b698fdd4fb (patch)
tree4c20c4317f691299e8364f415204e00a85e710c4 /src
parent955f4e6f36ea009b90803d12a62108c94f446778 (diff)
patch 8.2.0077: settagstack() cannot truncate at current indexv8.2.0077
Problem: settagstack() cannot truncate at current index. Solution: Add the "t" action. (Yegappan Lakshmanan, closes #5417)
Diffstat (limited to 'src')
-rw-r--r--src/evalfunc.c3
-rw-r--r--src/tag.c31
-rw-r--r--src/testdir/test_tagjump.vim22
-rw-r--r--src/version.c2
4 files changed, 51 insertions, 7 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 489ab424a9..af43fb96ec 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -6776,7 +6776,8 @@ f_settagstack(typval_T *argvars, typval_T *rettv)
actstr = tv_get_string_chk(&argvars[2]);
if (actstr == NULL)
return;
- if ((*actstr == 'r' || *actstr == 'a') && actstr[1] == NUL)
+ if ((*actstr == 'r' || *actstr == 'a' || *actstr == 't')
+ && actstr[1] == NUL)
action = *actstr;
else
{
diff --git a/src/tag.c b/src/tag.c
index c00f5fb723..4f897fa607 100644
--- a/src/tag.c
+++ b/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')
+ 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;
}
- if ((di = dict_find(d, (char_u *)"curidx", -1)) != NULL)
- tagstack_set_curidx(wp, (int)tv_get_number(&di->di_tv) - 1);
-
return OK;
}
#endif
diff --git a/src/testdir/test_tagjump.vim b/src/testdir/test_tagjump.vim
index 14ba1f78dd..8d32883da2 100644
--- a/src/testdir/test_tagjump.vim
+++ b/src/testdir/test_tagjump.vim
@@ -348,6 +348,28 @@ func Test_getsettagstack()
\ {'items' : [{'tagname' : 'abc', 'from' : [1, 10, 1, 0]}]}, 'a')
call assert_equal('abc', gettagstack().items[19].tagname)
+ " truncate the tag stack
+ call settagstack(1,
+ \ {'curidx' : 9,
+ \ 'items' : [{'tagname' : 'abc', 'from' : [1, 10, 1, 0]}]}, 't')
+ let t = gettagstack()
+ call assert_equal(9, t.length)
+ call assert_equal(10, t.curidx)
+
+ " truncate the tag stack without pushing any new items
+ call settagstack(1, {'curidx' : 5}, 't')
+ let t = gettagstack()
+ call assert_equal(4, t.length)
+ call assert_equal(5, t.curidx)
+
+ " truncate an empty tag stack and push new items
+ call settagstack(1, {'items' : []})
+ call settagstack(1,
+ \ {'items' : [{'tagname' : 'abc', 'from' : [1, 10, 1, 0]}]}, 't')
+ let t = gettagstack()
+ call assert_equal(1, t.length)
+ call assert_equal(2, t.curidx)
+
" Tag with multiple matches
call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//",
\ "two\tXfile1\t1",
diff --git a/src/version.c b/src/version.c
index 263ffb0125..118dad505b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -743,6 +743,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 77,
+/**/
76,
/**/
75,