]> granicus.if.org Git - vim/commitdiff
patch 8.0.1274: setbufline() fails when using folding v8.0.1274
authorBram Moolenaar <Bram@vim.org>
Mon, 6 Nov 2017 20:32:54 +0000 (21:32 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 6 Nov 2017 20:32:54 +0000 (21:32 +0100)
Problem:    setbufline() fails when using folding.
Solution:   Set "curwin" if needed. (Ozaki Kiichi, closes #2293)

src/evalfunc.c
src/testdir/test_bufline.vim
src/version.c

index 25536af2e0554d55a385d333789e7db61959d30b..5e22fe4bc3245bb1083be50d5b3c028153f5d28d 100644 (file)
@@ -9891,7 +9891,8 @@ set_buffer_lines(buf_T *buf, linenr_T lnum, typval_T *lines, typval_T *rettv)
     listitem_T *li = NULL;
     long       added = 0;
     linenr_T   lcount;
-    buf_T      *curbuf_save;
+    buf_T      *curbuf_save = NULL;
+    win_T      *curwin_save = NULL;
     int                is_curbuf = buf == curbuf;
 
     /* When using the current buffer ml_mfp will be set if needed.  Useful when
@@ -9903,8 +9904,22 @@ set_buffer_lines(buf_T *buf, linenr_T lnum, typval_T *lines, typval_T *rettv)
        return;
     }
 
-    curbuf_save = curbuf;
-    curbuf = buf;
+    if (!is_curbuf)
+    {
+       wininfo_T *wip;
+
+       curbuf_save = curbuf;
+       curwin_save = curwin;
+       curbuf = buf;
+       for (wip = buf->b_wininfo; wip != NULL; wip = wip->wi_next)
+       {
+           if (wip->wi_win != NULL)
+           {
+               curwin = wip->wi_win;
+               break;
+           }
+       }
+    }
 
     lcount = curbuf->b_ml.ml_line_count;
 
@@ -9967,7 +9982,11 @@ set_buffer_lines(buf_T *buf, linenr_T lnum, typval_T *lines, typval_T *rettv)
     if (added > 0)
        appended_lines_mark(lcount, added);
 
-    curbuf = curbuf_save;
+    if (!is_curbuf)
+    {
+       curbuf = curbuf_save;
+       curwin = curwin_save;
+    }
 }
 
 /*
index cc5c10e9858a6deb9264bb7e1f16636bb1621ac9..b886e995069d6fb849a5a99907267ff0aaf27e61 100644 (file)
@@ -27,6 +27,32 @@ func Test_setbufline_getbufline()
   exe "bwipe! " . b
 endfunc
 
+func Test_setbufline_getbufline_fold()
+  split Xtest
+  setlocal foldmethod=expr foldexpr=0
+  let b = bufnr('%')
+  new
+  call assert_equal(0, setbufline(b, 1, ['foo', 'bar']))
+  call assert_equal(['foo'], getbufline(b, 1))
+  call assert_equal(['bar'], getbufline(b, 2))
+  call assert_equal(['foo', 'bar'], getbufline(b, 1, 2))
+  exe "bwipe!" b
+  bwipe!
+endfunc
+
+func Test_setbufline_getbufline_fold_tab()
+  split Xtest
+  setlocal foldmethod=expr foldexpr=0
+  let b = bufnr('%')
+  tab new
+  call assert_equal(0, setbufline(b, 1, ['foo', 'bar']))
+  call assert_equal(['foo'], getbufline(b, 1))
+  call assert_equal(['bar'], getbufline(b, 2))
+  call assert_equal(['foo', 'bar'], getbufline(b, 1, 2))
+  exe "bwipe!" b
+  bwipe!
+endfunc
+
 func Test_setline_startup()
   let cmd = GetVimCommand('Xscript')
   if cmd == ''
index e47aad0dab95ecbde5b9f365940bf25e1e414fc3..7f519fbe8f188bf8519572f7c5a9286629adc381 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1274,
 /**/
     1273,
 /**/