changeset 23772:f5225486d3de v8.2.2427

patch 8.2.2427: can still switch windows for 'completefunc' Commit: https://github.com/vim/vim/commit/3eb6bd9c2b36dcce471bfb543c8d5488f1dc17a4 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Jan 29 21:47:24 2021 +0100 patch 8.2.2427: can still switch windows for 'completefunc' Problem: Can still switch windows for 'completefunc'. Solution: Also disallow switching windows for other completions.
author Bram Moolenaar <Bram@vim.org>
date Fri, 29 Jan 2021 22:00:04 +0100
parents a61f1193e85c
children 6421ad10789a
files src/insexpand.c src/testdir/test_ins_complete.vim src/testdir/test_popup.vim src/version.c
diffstat 4 files changed, 7 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -121,7 +121,6 @@ struct compl_S
 
 static char e_hitend[] = N_("Hit end of paragraph");
 # ifdef FEAT_COMPL_FUNC
-static char e_complwin[] = N_("E839: Completion function changed window");
 static char e_compldel[] = N_("E840: Completion function deleted text");
 # endif
 
@@ -2199,8 +2198,6 @@ expand_by_function(
     typval_T	args[3];
     char_u	*funcname;
     pos_T	pos;
-    win_T	*curwin_save;
-    buf_T	*curbuf_save;
     typval_T	rettv;
     int		save_State = State;
 
@@ -2216,8 +2213,6 @@ expand_by_function(
     args[2].v_type = VAR_UNKNOWN;
 
     pos = curwin->w_cursor;
-    curwin_save = curwin;
-    curbuf_save = curbuf;
     // Lock the text to avoid weird things from happening.  Also disallow
     // switching to another window, it should not be needed and may end up in
     // Insert mode in another buffer.
@@ -2246,11 +2241,6 @@ expand_by_function(
     }
     --textwinlock;
 
-    if (curwin_save != curwin || curbuf_save != curbuf)
-    {
-	emsg(_(e_complwin));
-	goto theend;
-    }
     curwin->w_cursor = pos;	// restore the cursor position
     validate_cursor();
     if (!EQUAL_POS(curwin->w_cursor, pos))
@@ -3843,8 +3833,6 @@ ins_complete(int c, int enable_pum)
 	    int		col;
 	    char_u	*funcname;
 	    pos_T	pos;
-	    win_T	*curwin_save;
-	    buf_T	*curbuf_save;
 	    int		save_State = State;
 
 	    // Call 'completefunc' or 'omnifunc' and get pattern length as a
@@ -3866,16 +3854,11 @@ ins_complete(int c, int enable_pum)
 	    args[1].vval.v_string = (char_u *)"";
 	    args[2].v_type = VAR_UNKNOWN;
 	    pos = curwin->w_cursor;
-	    curwin_save = curwin;
-	    curbuf_save = curbuf;
+	    ++textwinlock;
 	    col = call_func_retnr(funcname, 2, args);
+	    --textwinlock;
 
 	    State = save_State;
-	    if (curwin_save != curwin || curbuf_save != curbuf)
-	    {
-		emsg(_(e_complwin));
-		return FAIL;
-	    }
 	    curwin->w_cursor = pos;	// restore the cursor position
 	    validate_cursor();
 	    if (!EQUAL_POS(curwin->w_cursor, pos))
--- a/src/testdir/test_ins_complete.vim
+++ b/src/testdir/test_ins_complete.vim
@@ -548,7 +548,7 @@ func Test_completefunc_error()
   endfunc
   set completefunc=CompleteFunc
   call setline(1, ['', 'abcd', ''])
-  call assert_fails('exe "normal 2G$a\<C-X>\<C-U>"', 'E840:')
+  call assert_fails('exe "normal 2G$a\<C-X>\<C-U>"', 'E578:')
 
   " delete text when called for the second time
   func CompleteFunc2(findstart, base)
--- a/src/testdir/test_popup.vim
+++ b/src/testdir/test_popup.vim
@@ -367,11 +367,9 @@ func Test_completefunc_opens_new_window_
   setlocal completefunc=DummyCompleteTwo
   call setline(1, 'two')
   /^two
-  call assert_fails('call feedkeys("A\<C-X>\<C-U>\<C-N>\<Esc>", "x")', 'E839:')
-  call assert_notequal(winid, win_getid())
-  q!
+  call assert_fails('call feedkeys("A\<C-X>\<C-U>\<C-N>\<Esc>", "x")', 'E565:')
   call assert_equal(winid, win_getid())
-  call assert_equal('two', getline(1))
+  call assert_equal('twodef', getline(1))
   q!
 endfunc
 
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2427,
+/**/
     2426,
 /**/
     2425,