aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/buffer.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-07-10 10:35:12 +0800
committerGitHub <noreply@github.com>2024-07-10 10:35:12 +0800
commit158ffd646d18eb26ca7e04e9cb9110305577b9c8 (patch)
tree927bad31846421670891666a6829c53a41b9830e /src/nvim/buffer.c
parent545aafbeb80eb52c182ce139800489b392a12d0d (diff)
downloadrneovim-158ffd646d18eb26ca7e04e9cb9110305577b9c8.tar.gz
rneovim-158ffd646d18eb26ca7e04e9cb9110305577b9c8.tar.bz2
rneovim-158ffd646d18eb26ca7e04e9cb9110305577b9c8.zip
vim-patch:9.1.0554: :bw leaves jumplist and tagstack data around (#29639)
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: vim/vim#8201 closes: vim/vim#15185 https://github.com/vim/vim/commit/4ff3a9b1e3ba45f9dbd0ea8c721f27d9315c4d93 Co-authored-by: LemonBoy <thatlemon@gmail.com>
Diffstat (limited to 'src/nvim/buffer.c')
-rw-r--r--src/nvim/buffer.c37
1 files changed, 8 insertions, 29 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index 3812ff6b44..6878b02a6e 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -699,6 +699,9 @@ bool close_buffer(win_T *win, buf_T *buf, int action, bool abort_if_last, bool i
if (buf->b_nwindows > 0) {
return false;
}
+ FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
+ mark_forget_file(wp, buf->b_fnum);
+ }
if (buf->b_sfname != buf->b_ffname) {
XFREE_CLEAR(buf->b_sfname);
} else {
@@ -1184,32 +1187,6 @@ static int empty_curbuf(bool close_others, int forceit, int action)
return retval;
}
-/// Remove every jump list entry referring to a given buffer.
-/// This function will also adjust the current jump list index.
-void buf_remove_from_jumplist(buf_T *deleted_buf)
-{
- // Remove all jump list entries that match the deleted buffer.
- for (int i = curwin->w_jumplistlen - 1; i >= 0; i--) {
- buf_T *buf = buflist_findnr(curwin->w_jumplist[i].fmark.fnum);
-
- if (buf == deleted_buf) {
- // Found an entry that we want to delete.
- curwin->w_jumplistlen -= 1;
-
- // If the current jump list index behind the entry we want to
- // delete, move it back by one.
- if (curwin->w_jumplistidx > i && curwin->w_jumplistidx > 0) {
- curwin->w_jumplistidx -= 1;
- }
-
- // Actually remove the entry from the jump list.
- for (int d = i; d < curwin->w_jumplistlen; d++) {
- curwin->w_jumplist[d] = curwin->w_jumplist[d + 1];
- }
- }
- }
-}
-
/// Implementation of the commands for the buffer list.
///
/// action == DOBUF_GOTO go to specified buffer
@@ -1364,6 +1341,8 @@ int do_buffer(int action, int start, int dir, int count, int forceit)
}
}
+ int buf_fnum = buf->b_fnum;
+
// When closing the current buffer stop Visual mode.
if (buf == curbuf && VIsual_active) {
end_visual_mode();
@@ -1398,7 +1377,7 @@ int do_buffer(int action, int start, int dir, int count, int forceit)
if (buf != curbuf) {
if (jop_flags & JOP_UNLOAD) {
// Remove the buffer to be deleted from the jump list.
- buf_remove_from_jumplist(buf);
+ mark_jumplist_forget_file(curwin, buf_fnum);
}
close_windows(buf, false);
@@ -1423,8 +1402,8 @@ int do_buffer(int action, int start, int dir, int count, int forceit)
buf = au_new_curbuf.br_buf;
} else if (curwin->w_jumplistlen > 0) {
if (jop_flags & JOP_UNLOAD) {
- // Remove the current buffer from the jump list.
- buf_remove_from_jumplist(curbuf);
+ // Remove the buffer from the jump list.
+ mark_jumplist_forget_file(curwin, buf_fnum);
}
// It's possible that we removed all jump list entries, in that case we need to try another