# HG changeset patch # User Bram Moolenaar # Date 1611951304 -3600 # Node ID 385d33dfb7dfe463ece044bc8d8509368f35d74c # Parent 3dd5ed7011378056739ecd70af3ca9dd29f68fd3 patch 8.2.2426: allowing 'completefunc' to switch windows causes trouble Commit: https://github.com/vim/vim/commit/28976e2accf11591c60e8a658a9e03544f0408b2 Author: Bram Moolenaar Date: Fri Jan 29 21:07:07 2021 +0100 patch 8.2.2426: allowing 'completefunc' to switch windows causes trouble Problem: Allowing 'completefunc' to switch windows causes trouble. Solution: use "textwinlock" instead of "textlock". diff --git a/src/insexpand.c b/src/insexpand.c --- a/src/insexpand.c +++ b/src/insexpand.c @@ -2218,9 +2218,10 @@ expand_by_function( pos = curwin->w_cursor; curwin_save = curwin; curbuf_save = curbuf; - // Lock the text to avoid weird things from happening. Do allow switching - // to another window temporarily. - ++textlock; + // 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. + ++textwinlock; // Call a function, which returns a list or dict. if (call_vim_function(funcname, 2, args, &rettv) == OK) @@ -2243,7 +2244,7 @@ expand_by_function( break; } } - --textlock; + --textwinlock; if (curwin_save != curwin || curbuf_save != curbuf) { @@ -3226,7 +3227,7 @@ ins_compl_next( return -1; if (compl_leader != NULL - && (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT) == 0) + && (compl_shown_match->cp_flags & CP_ORIGINAL_TEXT) == 0) { // Set "compl_shown_match" to the actually shown match, it may differ // when "compl_leader" is used to omit some of the matches. diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -562,31 +562,24 @@ func Test_completefunc_error() call setline(1, ['', 'abcd', '']) call assert_fails('exe "normal 2G$a\\"', 'E578:') - set completefunc& - delfunc CompleteFunc - delfunc CompleteFunc2 - close! -endfunc - -func Test_completefunc_error_not_asan() - " The following test causes an ASAN failure. - CheckNotAsan - " Jump to a different window from the complete function - func! CompleteFunc(findstart, base) + func CompleteFunc3(findstart, base) if a:findstart == 1 return col('.') - 1 endif wincmd p return ['a', 'b'] endfunc - set completefunc=CompleteFunc + set completefunc=CompleteFunc3 new - call assert_fails('exe "normal a\\"', 'E839:') + call assert_fails('exe "normal a\\"', 'E565:') close! set completefunc& delfunc CompleteFunc + delfunc CompleteFunc2 + delfunc CompleteFunc3 + close! endfunc " Test for returning non-string values from 'completefunc' diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim --- a/src/testdir/test_popup.vim +++ b/src/testdir/test_popup.vim @@ -342,7 +342,7 @@ func Test_completefunc_opens_new_window_ setlocal completefunc=DummyCompleteOne call setline(1, 'one') /^one - call assert_fails('call feedkeys("A\\\\", "x")', 'E578:') + call assert_fails('call feedkeys("A\\\\", "x")', 'E565:') call assert_equal(winid, win_getid()) call assert_equal('onedef', getline(1)) q! @@ -642,8 +642,8 @@ func Test_complete_func_mess() set completefunc=MessComplete new call setline(1, 'Ju') - call feedkeys("A\\/\", 'tx') - call assert_equal('Oct/Oct', getline(1)) + call assert_fails('call feedkeys("A\\/\", "tx")', 'E578:') + call assert_equal('Jan/', getline(1)) bwipe! set completefunc= endfunc diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 2426, +/**/ 2425, /**/ 2424,