changeset 18746:64eea864dff6 v8.1.2363

patch 8.1.2363: ml_get error when accessing Visual area in 'statusline' Commit: https://github.com/vim/vim/commit/dee50a518007b3a59f54b8ad018b6a83993593e7 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Nov 30 15:05:22 2019 +0100 patch 8.1.2363: ml_get error when accessing Visual area in 'statusline' Problem: ml_get error when accessing Visual area in 'statusline'. Solution: Disable Visual mode when using another window. (closes https://github.com/vim/vim/issues/5278)
author Bram Moolenaar <Bram@vim.org>
date Sat, 30 Nov 2019 15:15:04 +0100
parents 9752ce174299
children 642302ee4955
files src/buffer.c src/testdir/test_statusline.vim src/version.c
diffstat 3 files changed, 30 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3979,6 +3979,7 @@ build_stl_str_hl(
 #ifdef FEAT_EVAL
     win_T	*save_curwin;
     buf_T	*save_curbuf;
+    int		save_VIsual_active;
 #endif
     int		empty_line;
     colnr_T	virtcol;
@@ -4368,13 +4369,18 @@ build_stl_str_hl(
 
 	    save_curbuf = curbuf;
 	    save_curwin = curwin;
+	    save_VIsual_active = VIsual_active;
 	    curwin = wp;
 	    curbuf = wp->w_buffer;
+	    // Visual mode is only valid in the current window.
+	    if (curwin != save_curwin)
+		VIsual_active = FALSE;
 
 	    str = eval_to_string_safe(p, &t, use_sandbox);
 
 	    curwin = save_curwin;
 	    curbuf = save_curbuf;
+	    VIsual_active = save_VIsual_active;
 	    do_unlet((char_u *)"g:actual_curbuf", TRUE);
 	    do_unlet((char_u *)"g:actual_curwin", TRUE);
 
--- a/src/testdir/test_statusline.vim
+++ b/src/testdir/test_statusline.vim
@@ -368,3 +368,25 @@ func Test_statusline()
   set laststatus&
   set splitbelow&
 endfunc
+
+func Test_statusline_visual()
+  func CallWordcount()
+    call wordcount()
+  endfunc
+  new x1
+  setl statusline=count=%{CallWordcount()}
+  " buffer must not be empty
+  call setline(1, 'hello')
+
+  " window with more lines than x1
+  new x2
+  call setline(1, range(10))
+  $
+  " Visual mode in line below liast line in x1 should not give ml_get error
+  call feedkeys("\<C-V>", "xt")
+  redraw
+
+  delfunc CallWordcount
+  bwipe! x1
+  bwipe! x2
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -738,6 +738,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2363,
+/**/
     2362,
 /**/
     2361,