1
0
forked from aniani/vim

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.
This commit is contained in:
Bram Moolenaar
2021-01-29 21:47:24 +01:00
parent 28976e2acc
commit 3eb6bd9c2b
4 changed files with 7 additions and 24 deletions

View File

@@ -121,7 +121,6 @@ struct compl_S
static char e_hitend[] = N_("Hit end of paragraph"); static char e_hitend[] = N_("Hit end of paragraph");
# ifdef FEAT_COMPL_FUNC # ifdef FEAT_COMPL_FUNC
static char e_complwin[] = N_("E839: Completion function changed window");
static char e_compldel[] = N_("E840: Completion function deleted text"); static char e_compldel[] = N_("E840: Completion function deleted text");
# endif # endif
@@ -2199,8 +2198,6 @@ expand_by_function(
typval_T args[3]; typval_T args[3];
char_u *funcname; char_u *funcname;
pos_T pos; pos_T pos;
win_T *curwin_save;
buf_T *curbuf_save;
typval_T rettv; typval_T rettv;
int save_State = State; int save_State = State;
@@ -2216,8 +2213,6 @@ expand_by_function(
args[2].v_type = VAR_UNKNOWN; args[2].v_type = VAR_UNKNOWN;
pos = curwin->w_cursor; pos = curwin->w_cursor;
curwin_save = curwin;
curbuf_save = curbuf;
// Lock the text to avoid weird things from happening. Also disallow // 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 // switching to another window, it should not be needed and may end up in
// Insert mode in another buffer. // Insert mode in another buffer.
@@ -2246,11 +2241,6 @@ expand_by_function(
} }
--textwinlock; --textwinlock;
if (curwin_save != curwin || curbuf_save != curbuf)
{
emsg(_(e_complwin));
goto theend;
}
curwin->w_cursor = pos; // restore the cursor position curwin->w_cursor = pos; // restore the cursor position
validate_cursor(); validate_cursor();
if (!EQUAL_POS(curwin->w_cursor, pos)) if (!EQUAL_POS(curwin->w_cursor, pos))
@@ -3843,8 +3833,6 @@ ins_complete(int c, int enable_pum)
int col; int col;
char_u *funcname; char_u *funcname;
pos_T pos; pos_T pos;
win_T *curwin_save;
buf_T *curbuf_save;
int save_State = State; int save_State = State;
// Call 'completefunc' or 'omnifunc' and get pattern length as a // 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[1].vval.v_string = (char_u *)"";
args[2].v_type = VAR_UNKNOWN; args[2].v_type = VAR_UNKNOWN;
pos = curwin->w_cursor; pos = curwin->w_cursor;
curwin_save = curwin; ++textwinlock;
curbuf_save = curbuf;
col = call_func_retnr(funcname, 2, args); col = call_func_retnr(funcname, 2, args);
--textwinlock;
State = save_State; State = save_State;
if (curwin_save != curwin || curbuf_save != curbuf)
{
emsg(_(e_complwin));
return FAIL;
}
curwin->w_cursor = pos; // restore the cursor position curwin->w_cursor = pos; // restore the cursor position
validate_cursor(); validate_cursor();
if (!EQUAL_POS(curwin->w_cursor, pos)) if (!EQUAL_POS(curwin->w_cursor, pos))

View File

@@ -548,7 +548,7 @@ func Test_completefunc_error()
endfunc endfunc
set completefunc=CompleteFunc set completefunc=CompleteFunc
call setline(1, ['', 'abcd', '']) 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 " delete text when called for the second time
func CompleteFunc2(findstart, base) func CompleteFunc2(findstart, base)

View File

@@ -367,11 +367,9 @@ func Test_completefunc_opens_new_window_two()
setlocal completefunc=DummyCompleteTwo setlocal completefunc=DummyCompleteTwo
call setline(1, 'two') call setline(1, 'two')
/^two /^two
call assert_fails('call feedkeys("A\<C-X>\<C-U>\<C-N>\<Esc>", "x")', 'E839:') call assert_fails('call feedkeys("A\<C-X>\<C-U>\<C-N>\<Esc>", "x")', 'E565:')
call assert_notequal(winid, win_getid())
q!
call assert_equal(winid, win_getid()) call assert_equal(winid, win_getid())
call assert_equal('two', getline(1)) call assert_equal('twodef', getline(1))
q! q!
endfunc endfunc

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2427,
/**/ /**/
2426, 2426,
/**/ /**/