]> granicus.if.org Git - vim/commitdiff
patch 9.0.0910: setting lines in another buffer may not work well v9.0.0910
authorBram Moolenaar <Bram@vim.org>
Sat, 19 Nov 2022 13:59:43 +0000 (13:59 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 19 Nov 2022 13:59:43 +0000 (13:59 +0000)
Problem:    Setting lines in another buffer may not work well.
Solution:   Make sure the buffer being changed has a window. (issue #11558)

src/evalbuffer.c
src/version.c

index 4a9d5989ebb88f9a6ecda0777ee073f04edc0b53..625ab8fb252cf8001ca793d2deba8116ff4ccb36 100644 (file)
@@ -137,14 +137,15 @@ set_buffer_lines(
     listitem_T *li = NULL;
     long       added = 0;
     linenr_T   append_lnum;
-    buf_T      *curbuf_save = NULL;
     win_T      *curwin_save = NULL;
-    int                is_curbuf = buf == curbuf;
+    aco_save_T aco;
+    int                using_aco = FALSE;
     int                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.
+    int is_curbuf = buf == curbuf;
     if (buf == NULL || (!is_curbuf && buf->b_ml.ml_mfp == NULL) || lnum < 1)
     {
        rettv->vval.v_number = 1;       // FAIL
@@ -155,11 +156,21 @@ set_buffer_lines(
 
     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;
+       }
     }
 
     if (append)
@@ -262,8 +273,15 @@ set_buffer_lines(
 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;
     }
 }
index b642be97e5ac0e9421a8b50ba24b10dfa609ff30..e9b0431458b09f02beacdf7f6a8637527f7c769c 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    910,
 /**/
     909,
 /**/