Mercurial > vim
diff src/mark.c @ 35622:814fcbca4d8d v9.1.0554
patch 9.1.0554: :bw leaves jumplist and tagstack data around
Commit: https://github.com/vim/vim/commit/4ff3a9b1e3ba45f9dbd0ea8c721f27d9315c4d93
Author: LemonBoy <thatlemon@gmail.com>
Date: Tue Jul 9 20:03:24 2024 +0200
patch 9.1.0554: :bw leaves jumplist and tagstack data around
Problem: :bw leaves jumplist and tagstack data around
(Paul "Joey" Clark)
Solution: Wipe jumplist and tagstack references to the wiped buffer
(LemonBoy)
As documented the :bwipeout command brutally deletes all the references
to the buffer, so let's make it delete all the entries in the jump list
and tag stack referring to the wiped-out buffer.
fixes: #8201
closes: #15185
Signed-off-by: LemonBoy <thatlemon@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 09 Jul 2024 20:15:03 +0200 |
parents | 1f3bcb7f3bd0 |
children | 256723b12b48 |
line wrap: on
line diff
--- a/src/mark.c +++ b/src/mark.c @@ -130,6 +130,40 @@ setmark_pos(int c, pos_T *pos, int fnum) } /* + * Delete every entry referring to file 'fnum' from both the jumplist and the + * tag stack. + */ + void +mark_forget_file(win_T *wp, int fnum) +{ + int i; + + for (i = 0; i < wp->w_jumplistlen; ++i) + if (wp->w_jumplist[i].fmark.fnum == fnum) + { + vim_free(wp->w_jumplist[i].fname); + mch_memmove(&wp->w_jumplist[i], &wp->w_jumplist[i + 1], + (wp->w_jumplistlen - i - 1) * sizeof(xfmark_T)); + if (wp->w_jumplistidx > i) + --wp->w_jumplistidx; + --wp->w_jumplistlen; + --i; + } + + for (i = 0; i < wp->w_tagstacklen; i++) + if (wp->w_tagstack[i].fmark.fnum == fnum) + { + tagstack_clear_entry(&wp->w_tagstack[i]); + mch_memmove(&wp->w_tagstack[i], &wp->w_tagstack[i + 1], + (wp->w_tagstacklen - i - 1) * sizeof(taggy_T)); + if (wp->w_tagstackidx > i) + --wp->w_tagstackidx; + --wp->w_tagstacklen; + --i; + } +} + +/* * Set the previous context mark to the current position and add it to the * jump list. */