summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-01-29 21:07:07 +0100
committerBram Moolenaar <Bram@vim.org>2021-01-29 21:07:07 +0100
commit28976e2accf11591c60e8a658a9e03544f0408b2 (patch)
tree5e0ad5064936b05fd30e1eb7c946d8afeaf848b3 /src
parentdf2c2988bbaecd28b0fbec8d64327b1bbb005e19 (diff)
patch 8.2.2426: allowing 'completefunc' to switch windows causes troublev8.2.2426
Problem: Allowing 'completefunc' to switch windows causes trouble. Solution: use "textwinlock" instead of "textlock".
Diffstat (limited to 'src')
-rw-r--r--src/insexpand.c11
-rw-r--r--src/testdir/test_ins_complete.vim19
-rw-r--r--src/testdir/test_popup.vim6
-rw-r--r--src/version.c2
4 files changed, 17 insertions, 21 deletions
diff --git a/src/insexpand.c b/src/insexpand.c
index 02f593d7c8..66507f0436 100644
--- 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
index 5aa26645bf..489c1d9d94 100644
--- 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\<C-X>\<C-U>"', '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\<C-X>\<C-U>"', 'E839:')
+ call assert_fails('exe "normal a\<C-X>\<C-U>"', '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
index 9175ff1f26..2d0625bc09 100644
--- a/src/testdir/test_popup.vim
+++ b/src/testdir/test_popup.vim
@@ -342,7 +342,7 @@ func Test_completefunc_opens_new_window_one()
setlocal completefunc=DummyCompleteOne
call setline(1, 'one')
/^one
- call assert_fails('call feedkeys("A\<C-X>\<C-U>\<C-N>\<Esc>", "x")', 'E578:')
+ call assert_fails('call feedkeys("A\<C-X>\<C-U>\<C-N>\<Esc>", "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\<c-x>\<c-u>/\<esc>", 'tx')
- call assert_equal('Oct/Oct', getline(1))
+ call assert_fails('call feedkeys("A\<c-x>\<c-u>/\<esc>", "tx")', 'E578:')
+ call assert_equal('Jan/', getline(1))
bwipe!
set completefunc=
endfunc
diff --git a/src/version.c b/src/version.c
index 2e0da2b3a7..ed17716a7e 100644
--- 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,