changeset 12794:d4fc8a7dc7d9 v8.0.1274

patch 8.0.1274: setbufline() fails when using folding commit https://github.com/vim/vim/commit/0c4dc88a637a5027209aa00226996af84e248636 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Nov 6 21:32:54 2017 +0100 patch 8.0.1274: setbufline() fails when using folding Problem: setbufline() fails when using folding. Solution: Set "curwin" if needed. (Ozaki Kiichi, closes https://github.com/vim/vim/issues/2293)
author Christian Brabandt <cb@256bit.org>
date Mon, 06 Nov 2017 21:45:04 +0100
parents 782ecfa50400
children ab981881d72b
files src/evalfunc.c src/testdir/test_bufline.vim src/version.c
diffstat 3 files changed, 51 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -9891,7 +9891,8 @@ set_buffer_lines(buf_T *buf, linenr_T ln
     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 ln
 	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 ln
     if (added > 0)
 	appended_lines_mark(lcount, added);
 
-    curbuf = curbuf_save;
+    if (!is_curbuf)
+    {
+	curbuf = curbuf_save;
+	curwin = curwin_save;
+    }
 }
 
 /*
--- a/src/testdir/test_bufline.vim
+++ b/src/testdir/test_bufline.vim
@@ -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 == ''
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1274,
+/**/
     1273,
 /**/
     1272,