To: vim_dev@googlegroups.com Subject: Patch 8.2.2426 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.2426 Problem: Allowing 'completefunc' to switch windows causes trouble. Solution: use "textwinlock" instead of "textlock". Files: src/insexpand.c, src/testdir/test_ins_complete.vim, src/testdir/test_popup.vim *** ../vim-8.2.2425/src/insexpand.c 2020-12-27 18:03:18.688859822 +0100 --- src/insexpand.c 2021-01-29 19:55:26.090343143 +0100 *************** *** 2218,2226 **** 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; // Call a function, which returns a list or dict. if (call_vim_function(funcname, 2, args, &rettv) == OK) --- 2218,2227 ---- pos = curwin->w_cursor; curwin_save = curwin; curbuf_save = curbuf; ! // 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,2249 **** break; } } ! --textlock; if (curwin_save != curwin || curbuf_save != curbuf) { --- 2244,2250 ---- break; } } ! --textwinlock; if (curwin_save != curwin || curbuf_save != curbuf) { *************** *** 3226,3232 **** return -1; if (compl_leader != NULL ! && (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. --- 3227,3233 ---- return -1; if (compl_leader != NULL ! && (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. *** ../vim-8.2.2425/src/testdir/test_ins_complete.vim 2021-01-28 18:34:27.783630494 +0100 --- src/testdir/test_ins_complete.vim 2021-01-29 19:58:29.401677250 +0100 *************** *** 562,592 **** 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) if a:findstart == 1 return col('.') - 1 endif wincmd p return ['a', 'b'] endfunc ! set completefunc=CompleteFunc new ! call assert_fails('exe "normal a\\"', 'E839:') close! set completefunc& delfunc CompleteFunc endfunc " Test for returning non-string values from 'completefunc' --- 562,585 ---- call setline(1, ['', 'abcd', '']) call assert_fails('exe "normal 2G$a\\"', 'E578:') " Jump to a different window from the complete function ! func CompleteFunc3(findstart, base) if a:findstart == 1 return col('.') - 1 endif wincmd p return ['a', 'b'] endfunc ! set completefunc=CompleteFunc3 new ! 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' *** ../vim-8.2.2425/src/testdir/test_popup.vim 2020-12-24 18:38:37.181858419 +0100 --- src/testdir/test_popup.vim 2021-01-29 21:03:16.416179578 +0100 *************** *** 342,348 **** setlocal completefunc=DummyCompleteOne call setline(1, 'one') /^one ! call assert_fails('call feedkeys("A\\\\", "x")', 'E578:') call assert_equal(winid, win_getid()) call assert_equal('onedef', getline(1)) q! --- 342,348 ---- setlocal completefunc=DummyCompleteOne call setline(1, 'one') /^one ! call assert_fails('call feedkeys("A\\\\", "x")', 'E565:') call assert_equal(winid, win_getid()) call assert_equal('onedef', getline(1)) q! *************** *** 642,649 **** set completefunc=MessComplete new call setline(1, 'Ju') ! call feedkeys("A\\/\", 'tx') ! call assert_equal('Oct/Oct', getline(1)) bwipe! set completefunc= endfunc --- 642,649 ---- set completefunc=MessComplete new call setline(1, 'Ju') ! call assert_fails('call feedkeys("A\\/\", "tx")', 'E578:') ! call assert_equal('Jan/', getline(1)) bwipe! set completefunc= endfunc *** ../vim-8.2.2425/src/version.c 2021-01-28 20:18:04.800631715 +0100 --- src/version.c 2021-01-29 19:56:42.314065568 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 2426, /**/ -- hundred-and-one symptoms of being an internet addict: 265. Your reason for not staying in touch with family is that they do not have e-mail addresses. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///