changeset 34527:c770ad7ac4ab v9.1.0166

patch 9.1.0166: Internal error with blockwise getregion() in another buffer Commit: https://github.com/vim/vim/commit/5406eb8722bddb6a04876956f9a53c1752994851 Author: zeertzjq <zeertzjq@outlook.com> Date: Mon Mar 11 21:36:42 2024 +0100 patch 9.1.0166: Internal error with blockwise getregion() in another buffer Problem: Internal error with blockwise getregion() in another buffer Solution: Also change curwin->w_buffer when changing curbuf (zeertzjq) closes: #14179 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Mon, 11 Mar 2024 21:45:03 +0100
parents 98de080760c6
children d9b1fde16a62
files src/evalfunc.c src/testdir/test_visual.vim src/version.c
diffstat 3 files changed, 18 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -5494,10 +5494,10 @@ f_getregion(typval_T *argvars, typval_T 
     int			fnum1 = -1, fnum2 = -1;
     pos_T		p1, p2;
     char_u		*type;
-    buf_T		*save_curbuf = curbuf;
-    buf_T		*findbuf = curbuf;
+    buf_T		*save_curbuf;
+    buf_T		*findbuf;
     char_u		default_type[] = "v";
-    int			save_virtual = -1;
+    int			save_virtual;
     int			l;
     int			region_type = -1;
     int			is_select_exclusive;
@@ -5542,15 +5542,11 @@ f_getregion(typval_T *argvars, typval_T 
 	return;
     }
 
-    if (fnum1 != 0)
-    {
-	findbuf = buflist_findnr(fnum1);
-	// buffer not loaded
-	if (findbuf == NULL || findbuf->b_ml.ml_mfp == NULL)
-	{
-	    emsg(_(e_buffer_is_not_loaded));
-	    return;
-	}
+    findbuf = fnum1 != 0 ? buflist_findnr(fnum1) : curbuf;
+    if (findbuf == NULL || findbuf->b_ml.ml_mfp == NULL)
+    {
+	emsg(_(e_buffer_is_not_loaded));
+	return;
     }
 
     if (p1.lnum < 1 || p1.lnum > findbuf->b_ml.ml_line_count)
@@ -5574,7 +5570,9 @@ f_getregion(typval_T *argvars, typval_T 
 	return;
     }
 
+    save_curbuf = curbuf;
     curbuf = findbuf;
+    curwin->w_buffer = curbuf;
     save_virtual = virtual_op;
     virtual_op = virtual_active();
 
@@ -5677,9 +5675,8 @@ f_getregion(typval_T *argvars, typval_T 
 	}
     }
 
-    if (curbuf != save_curbuf)
-        curbuf = save_curbuf;
-
+    curbuf = save_curbuf;
+    curwin->w_buffer = curbuf;
     virtual_op = save_virtual;
 }
 
--- a/src/testdir/test_visual.vim
+++ b/src/testdir/test_visual.vim
@@ -1768,11 +1768,11 @@ func Test_visual_getregion()
     for type in ['v', 'V', "\<C-V>"]
       for exclusive in [v:false, v:true]
         call assert_equal(range(10)->mapnew('string(v:val)'),
-              \ getregion([g:buf, 1, 1, 0], [g:buf, 10, 2, 0]),
-              \ {'type': type, 'exclusive': exclusive })
+              \ getregion([g:buf, 1, 1, 0], [g:buf, 10, 2, 0],
+              \ {'type': type, 'exclusive': exclusive }))
         call assert_equal(range(10)->mapnew('string(v:val)'),
-              \ getregion([g:buf, 10, 2, 0], [g:buf, 1, 1, 0]),
-              \ {'type': type, 'exclusive': exclusive })
+              \ getregion([g:buf, 10, 2, 0], [g:buf, 1, 1, 0],
+              \ {'type': type, 'exclusive': exclusive }))
       endfor
     endfor
 
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    166,
+/**/
     165,
 /**/
     164,