diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-12-10 23:44:48 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-12-10 23:44:48 +0100 |
commit | 99ebf22c523e3fdb491b2c92b6f3a7d42721361d (patch) | |
tree | adbbfce6afde2d201db98feb8413244d4a9d0272 /src/buffer.c | |
parent | 1e46705a83ef2bbabd4a53ec40108558b73ed54f (diff) |
patch 8.1.2418: bufnr('$') is wrong after recycling popup bufferv8.1.2418
Problem: bufnr('$') is wrong after recycling popup buffer.
Solution: Sort the buffer list by buffer number. (closes #5335)
Diffstat (limited to 'src/buffer.c')
-rw-r--r-- | src/buffer.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/buffer.c b/src/buffer.c index 4f38f918f0..b4992dda07 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -2093,6 +2093,25 @@ buflist_new( // buffer number grows rapidly. --buf_reuse.ga_len; buf->b_fnum = ((int *)buf_reuse.ga_data)[buf_reuse.ga_len]; + + // Move buffer to the right place in the buffer list. + while (buf->b_prev != NULL && buf->b_fnum < buf->b_prev->b_fnum) + { + buf_T *prev = buf->b_prev; + + prev->b_next = buf->b_next; + if (prev->b_next != NULL) + prev->b_next->b_prev = prev; + buf->b_next = prev; + buf->b_prev = prev->b_prev; + if (buf->b_prev != NULL) + buf->b_prev->b_next = buf; + prev->b_prev = buf; + if (lastbuf == buf) + lastbuf = prev; + if (firstbuf == prev) + firstbuf = buf; + } } else buf->b_fnum = top_file_num++; |