vim-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".
28976e2acc

Assert E565 instead of E578.

vim-patch:8.2.0670: cannot change window when evaluating 'completefunc'

Problem:    Cannot change window when evaluating 'completefunc'.
Solution:   Make a difference between not changing text or buffers and also
            not changing window.
6adb9ea0a6

vim-patch:8.2.5029: "textlock" is always zero

Problem:    "textlock" is always zero.
Solution:   Remove "textlock" and rename "textwinlock" to "textlock".
            (closes vim/vim#10489)
cfe456543e
This commit is contained in:
zeertzjq
2022-07-17 11:47:34 +08:00
parent b0bbcfa239
commit f72ec95958
6 changed files with 16 additions and 29 deletions

View File

@@ -3961,7 +3961,9 @@ static void expand_by_function(int type, char_u *base)
pos = curwin->w_cursor; pos = curwin->w_cursor;
curwin_save = curwin; curwin_save = curwin;
curbuf_save = curbuf; curbuf_save = curbuf;
// Lock the text to avoid weird things from happening. // 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.
textlock++; textlock++;
// Call a function, which returns a list or dict. // Call a function, which returns a list or dict.

View File

@@ -1062,11 +1062,6 @@ static void f_complete(typval_T *argvars, typval_T *rettv, FunPtr fptr)
return; return;
} }
const int save_textlock = textlock;
// "textlock" is set when evaluating 'completefunc' but we can change text
// here.
textlock = 0;
// Check for undo allowed here, because if something was already inserted // Check for undo allowed here, because if something was already inserted
// the line was already saved for undo and this check isn't done. // the line was already saved for undo and this check isn't done.
if (!undo_allowed(curbuf)) { if (!undo_allowed(curbuf)) {
@@ -1081,7 +1076,6 @@ static void f_complete(typval_T *argvars, typval_T *rettv, FunPtr fptr)
set_completion(startcol - 1, argvars[1].vval.v_list); set_completion(startcol - 1, argvars[1].vval.v_list);
} }
} }
textlock = save_textlock;
} }
/// "complete_add()" function /// "complete_add()" function

View File

@@ -2696,14 +2696,12 @@ char_u *get_cmdprompt(void)
return ccline.cmdprompt; return ccline.cmdprompt;
} }
/* /// Return true when the text must not be changed and we can't switch to
* Return TRUE when the text must not be changed and we can't switch to /// another window or buffer. True when editing the command line etc.
* another window or buffer. Used when editing the command line etc. bool text_locked(void)
*/
int text_locked(void)
{ {
if (cmdwin_type != 0) { if (cmdwin_type != 0) {
return TRUE; return true;
} }
return textlock != 0; return textlock != 0;
} }

View File

@@ -628,31 +628,24 @@ func Test_completefunc_error()
call setline(1, ['', 'abcd', '']) call setline(1, ['', 'abcd', ''])
call assert_fails('exe "normal 2G$a\<C-X>\<C-U>"', 'E565:') call assert_fails('exe "normal 2G$a\<C-X>\<C-U>"', 'E565:')
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 " Jump to a different window from the complete function
func! CompleteFunc(findstart, base) func CompleteFunc3(findstart, base)
if a:findstart == 1 if a:findstart == 1
return col('.') - 1 return col('.') - 1
endif endif
wincmd p wincmd p
return ['a', 'b'] return ['a', 'b']
endfunc endfunc
set completefunc=CompleteFunc set completefunc=CompleteFunc3
new new
call assert_fails('exe "normal a\<C-X>\<C-U>"', 'E839:') call assert_fails('exe "normal a\<C-X>\<C-U>"', 'E565:')
close! close!
set completefunc& set completefunc&
delfunc CompleteFunc delfunc CompleteFunc
delfunc CompleteFunc2
delfunc CompleteFunc3
close!
endfunc endfunc
" Test for returning non-string values from 'completefunc' " Test for returning non-string values from 'completefunc'

View File

@@ -655,8 +655,8 @@ func Test_complete_func_mess()
set completefunc=MessComplete set completefunc=MessComplete
new new
call setline(1, 'Ju') call setline(1, 'Ju')
call feedkeys("A\<c-x>\<c-u>/\<esc>", 'tx') call assert_fails('call feedkeys("A\<c-x>\<c-u>/\<esc>", "tx")', 'E565:')
call assert_equal('Oct/Oct', getline(1)) call assert_equal('Jan/', getline(1))
bwipe! bwipe!
set completefunc= set completefunc=
endfunc endfunc

View File

@@ -3143,7 +3143,7 @@ endfunc
func Test_vimgrep_with_textlock() func Test_vimgrep_with_textlock()
new new
" Simple way to execute something with "textwinlock" set. " Simple way to execute something with "textlock" set.
" Check that vimgrep without jumping can be executed. " Check that vimgrep without jumping can be executed.
au InsertCharPre * vimgrep /RunTheTest/j runtest.vim au InsertCharPre * vimgrep /RunTheTest/j runtest.vim
normal ax normal ax