aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval/buffer.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-11-29 16:54:18 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-11-29 17:04:15 +0800
commit1282d6d59f085ef4d5261b8d60f3ac38d9478962 (patch)
tree3e704542b57ef1ef5639b8c36f59aaf647a4bad2 /src/nvim/eval/buffer.c
parent0b79137c59fbe44bded76f123602e552dc6f7b03 (diff)
downloadrneovim-1282d6d59f085ef4d5261b8d60f3ac38d9478962.tar.gz
rneovim-1282d6d59f085ef4d5261b8d60f3ac38d9478962.tar.bz2
rneovim-1282d6d59f085ef4d5261b8d60f3ac38d9478962.zip
vim-patch:9.0.0910: setting lines in another buffer may not work well
Problem: Setting lines in another buffer may not work well. Solution: Make sure the buffer being changed has a window. (issue vim/vim#11558) https://github.com/vim/vim/commit/c934bfa1b765505e5fc491f2ee7cc106894cafc8 Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat (limited to 'src/nvim/eval/buffer.c')
-rw-r--r--src/nvim/eval/buffer.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/nvim/eval/buffer.c b/src/nvim/eval/buffer.c
index 41ba8d2e88..fbe8b23477 100644
--- a/src/nvim/eval/buffer.c
+++ b/src/nvim/eval/buffer.c
@@ -76,25 +76,35 @@ static void set_buffer_lines(buf_T *buf, linenr_T lnum_arg, bool append, typval_
{
linenr_T lnum = lnum_arg + (append ? 1 : 0);
long added = 0;
- buf_T *curbuf_save = NULL;
win_T *curwin_save = NULL;
- const bool is_curbuf = buf == curbuf;
+ aco_save_T aco;
+ int using_aco = false;
const bool save_VIsual_active = VIsual_active;
// When using the current buffer ml_mfp will be set if needed. Useful when
// setline() is used on startup. For other buffers the buffer must be
// loaded.
+ const bool is_curbuf = buf == curbuf;
if (buf == NULL || (!is_curbuf && buf->b_ml.ml_mfp == NULL) || lnum < 1) {
rettv->vval.v_number = 1; // FAIL
return;
}
if (!is_curbuf) {
+ // Set "curbuf" to the buffer being changed. Then make sure there is a
+ // window for it to handle any side effects.
VIsual_active = false;
- curbuf_save = curbuf;
curwin_save = curwin;
curbuf = buf;
- find_win_for_curbuf();
+ find_win_for_curbuf(); // simplest: find existing window for "buf"
+
+ if (curwin->w_buffer != buf) {
+ // No existing window for this buffer. It is dangerous to have
+ // curwin->w_buffer differ from "curbuf", use the autocmd window.
+ curbuf = curwin->w_buffer;
+ aucmd_prepbuf(&aco, buf);
+ using_aco = true;
+ }
}
linenr_T append_lnum;
@@ -193,8 +203,12 @@ static void set_buffer_lines(buf_T *buf, linenr_T lnum_arg, bool append, typval_
done:
if (!is_curbuf) {
- curbuf = curbuf_save;
- curwin = curwin_save;
+ if (using_aco) {
+ aucmd_restbuf(&aco);
+ } else {
+ curwin = curwin_save;
+ curbuf = curwin->w_buffer;
+ }
VIsual_active = save_VIsual_active;
}
}