diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-11-29 16:54:18 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-11-29 17:04:15 +0800 |
commit | 1282d6d59f085ef4d5261b8d60f3ac38d9478962 (patch) | |
tree | 3e704542b57ef1ef5639b8c36f59aaf647a4bad2 /src/nvim/eval/buffer.c | |
parent | 0b79137c59fbe44bded76f123602e552dc6f7b03 (diff) | |
download | rneovim-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.c | 26 |
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; } } |