diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-07-17 11:47:34 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-07-17 13:51:46 +0800 |
commit | f72ec959580e44d84d944f1c50852e56eb7fc1ad (patch) | |
tree | 9dae85fd9d89ddc276c03371b9f03f8865492e75 /src | |
parent | b0bbcfa2392a0b6c58274baf5facadda6cdff10a (diff) | |
download | rneovim-f72ec959580e44d84d944f1c50852e56eb7fc1ad.tar.gz rneovim-f72ec959580e44d84d944f1c50852e56eb7fc1ad.tar.bz2 rneovim-f72ec959580e44d84d944f1c50852e56eb7fc1ad.zip |
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".
https://github.com/vim/vim/commit/28976e2accf11591c60e8a658a9e03544f0408b2
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.
https://github.com/vim/vim/commit/6adb9ea0a6ca01414f4b591f379b0f829a8273c0
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)
https://github.com/vim/vim/commit/cfe456543e840d133399551f8626d985e1fb1958
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/edit.c | 4 | ||||
-rw-r--r-- | src/nvim/eval/funcs.c | 6 | ||||
-rw-r--r-- | src/nvim/ex_getln.c | 10 | ||||
-rw-r--r-- | src/nvim/testdir/test_ins_complete.vim | 19 | ||||
-rw-r--r-- | src/nvim/testdir/test_popup.vim | 4 | ||||
-rw-r--r-- | src/nvim/testdir/test_quickfix.vim | 2 |
6 files changed, 16 insertions, 29 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 2abe9068eb..c6773b3395 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -3961,7 +3961,9 @@ static void expand_by_function(int type, char_u *base) pos = curwin->w_cursor; curwin_save = curwin; 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++; // Call a function, which returns a list or dict. diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index f231146d7c..80586caf8e 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -1062,11 +1062,6 @@ static void f_complete(typval_T *argvars, typval_T *rettv, FunPtr fptr) 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 // the line was already saved for undo and this check isn't done. 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); } } - textlock = save_textlock; } /// "complete_add()" function diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 92c9d83045..4c26cfe500 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -2696,14 +2696,12 @@ char_u *get_cmdprompt(void) return ccline.cmdprompt; } -/* - * Return TRUE when the text must not be changed and we can't switch to - * another window or buffer. Used when editing the command line etc. - */ -int text_locked(void) +/// 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. +bool text_locked(void) { if (cmdwin_type != 0) { - return TRUE; + return true; } return textlock != 0; } diff --git a/src/nvim/testdir/test_ins_complete.vim b/src/nvim/testdir/test_ins_complete.vim index 532685b9de..563d8812f7 100644 --- a/src/nvim/testdir/test_ins_complete.vim +++ b/src/nvim/testdir/test_ins_complete.vim @@ -628,31 +628,24 @@ func Test_completefunc_error() call setline(1, ['', 'abcd', '']) 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 - 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/nvim/testdir/test_popup.vim b/src/nvim/testdir/test_popup.vim index 7afa31a6d1..aef32fc504 100644 --- a/src/nvim/testdir/test_popup.vim +++ b/src/nvim/testdir/test_popup.vim @@ -655,8 +655,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")', 'E565:') + call assert_equal('Jan/', getline(1)) bwipe! set completefunc= endfunc diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim index 290fc488f1..ddd4229f17 100644 --- a/src/nvim/testdir/test_quickfix.vim +++ b/src/nvim/testdir/test_quickfix.vim @@ -3143,7 +3143,7 @@ endfunc func Test_vimgrep_with_textlock() 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. au InsertCharPre * vimgrep /RunTheTest/j runtest.vim normal ax |