From 07785ea9c5595f379f2cac2ce8ffa95244e3d8e3 Mon Sep 17 00:00:00 2001 From: glepnir Date: Wed, 19 Feb 2025 13:40:46 +0800 Subject: vim-patch:9.1.1121: Enter does not insert newline with "noselect" Problem: Enter does not insert newline with "noselect" when the pum is visible (lifepillar) Solution: When Enter is pressed and no complete-item is selected, ins_compl_prep returns false, and the edit function continues processing Enter to insert a new line. (glepnir) fixes: vim/vim#1653 closes: vim/vim#16653 https://github.com/vim/vim/commit/07f0dbe3aa326fdf4d0f1b1cf7d79df89e91fc6e Co-authored-by: glepnir --- src/nvim/insexpand.c | 8 ++++++++ test/functional/editor/completion_spec.lua | 10 ++++++---- test/functional/legacy/edit_spec.lua | 24 ++++++++++++++++++++++++ test/old/testdir/test_edit.vim | 17 ++++++++++++++--- test/old/testdir/test_ins_complete.vim | 2 +- test/old/testdir/test_popup.vim | 4 ++-- 6 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/nvim/insexpand.c b/src/nvim/insexpand.c index e88f5dbe70..c33c4a1ad9 100644 --- a/src/nvim/insexpand.c +++ b/src/nvim/insexpand.c @@ -1744,6 +1744,7 @@ void ins_compl_clear(void) compl_cont_status = 0; compl_started = false; compl_matches = 0; + compl_selected_item = -1; compl_ins_end_col = 0; API_CLEAR_STRING(compl_pattern); API_CLEAR_STRING(compl_leader); @@ -2300,6 +2301,7 @@ bool ins_compl_prep(int c) { bool retval = false; const int prev_mode = ctrl_x_mode; + bool handle_enter = ((c == CAR || c == NL || c == K_KENTER) && compl_selected_item == -1); // Forget any previous 'special' messages if this is actually // a ^X mode key - bar ^R, in which case we wait to see what it gives us. @@ -2366,6 +2368,12 @@ bool ins_compl_prep(int c) && !ins_compl_pum_key(c)) || ctrl_x_mode == CTRL_X_FINISHED) { retval = ins_compl_stop(c, prev_mode, retval); + // When it is the Enter key and no selected item, return false, and + // continue processing the Enter key to insert a new line in the + // edit function. + if (retval && handle_enter) { + retval = false; + } } } else if (ctrl_x_mode == CTRL_X_LOCAL_MSG) { // Trigger the CompleteDone event to give scripts a chance to act diff --git a/test/functional/editor/completion_spec.lua b/test/functional/editor/completion_spec.lua index 7c68de272b..fdf6917b53 100644 --- a/test/functional/editor/completion_spec.lua +++ b/test/functional/editor/completion_spec.lua @@ -506,19 +506,21 @@ describe('completion', function() ]]) end) - it('Enter selects original text after adding leader', function() + it('Enter selects original text after adding leader and insert newline', function() feed('iJ') poke_eventloop() feed('u') poke_eventloop() feed('') - expect('Ju') + expect([[Ju +]]) feed('') poke_eventloop() -- The behavior should be the same when completion has been interrupted, -- which can happen interactively if the completion function is slow. - feed('SJu') - expect('Ju') + feed('ggVGSJu') + expect([[Ju +]]) end) end) diff --git a/test/functional/legacy/edit_spec.lua b/test/functional/legacy/edit_spec.lua index d2ce80efda..eee232f2c8 100644 --- a/test/functional/legacy/edit_spec.lua +++ b/test/functional/legacy/edit_spec.lua @@ -92,4 +92,28 @@ describe('edit', function() | ]]) end) + + -- oldtest: Test_edit_CAR() + it('insert a newline when pressing Enter, even if the pum is visible', function() + local screen = Screen.new(10, 6) + command('set cot=menu,menuone,noselect') + feed('Shello herohe') + screen:expect([[ + hello hero | + he^ | + {4:hello }| + {4:hero }| + {1:~ }| + {5:--} | + ]]) + + feed('') + screen:expect([[ + hello hero | + he | + ^ | + {1:~ }|*2 + {5:-- INSERT --}| + ]]) + end) end) diff --git a/test/old/testdir/test_edit.vim b/test/old/testdir/test_edit.vim index f9458d69a3..5f1a12e33d 100644 --- a/test/old/testdir/test_edit.vim +++ b/test/old/testdir/test_edit.vim @@ -200,7 +200,7 @@ func Test_edit_07() endif endfu au InsertCharPre :call DoIt() - call feedkeys("A\\u\\\", 'tx') + call feedkeys("A\\u\\\", 'tx') call assert_equal(["Jan\",''], 1->getline('$')) %d call setline(1, 'J') @@ -601,7 +601,7 @@ func Test_edit_CTRL_I() call assert_equal([include, 'two', ''], getline(1, '$')) call feedkeys("2ggC\\\\\\", 'tnix') call assert_equal([include, 'three', ''], getline(1, '$')) - call feedkeys("2ggC\\\\\\\", 'tnix') + call feedkeys("2ggC\\\\\\\", 'tnix') call assert_equal([include, '', ''], getline(1, '$')) bw! endfunc @@ -629,7 +629,7 @@ func Test_edit_CTRL_K() %d call setline(1, 'A') call cursor(1, 1) - call feedkeys("A\\\\\\\", 'tnix') + call feedkeys("A\\\\\\\", 'tnix') call assert_equal(['A'], getline(1, '$')) %d call setline(1, 'A') @@ -2309,4 +2309,15 @@ func Test_edit_backspace_smarttab_virtual_text() set smarttab& endfunc +func Test_edit_CAR() + set cot=menu,menuone,noselect + new + + call feedkeys("Shello hero\h\\e\", 'tx') + call assert_equal(['hello hero', 'he', ''], getline(1, '$')) + + bw! + set cot& +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/test/old/testdir/test_ins_complete.vim b/test/old/testdir/test_ins_complete.vim index f4dd2fbd10..7fcc4bae36 100644 --- a/test/old/testdir/test_ins_complete.vim +++ b/test/old/testdir/test_ins_complete.vim @@ -2837,7 +2837,7 @@ func Test_complete_fuzzy_match() call setline(1, ['Text', 'ToText', '']) call cursor(2, 1) call feedkeys("STe\\x\\0", 'tx!') - call assert_equal('Tex', getline('.')) + call assert_equal('Tex', getline(line('.') - 1)) " test case for nosort option set cot=menuone,menu,noinsert,fuzzy,nosort diff --git a/test/old/testdir/test_popup.vim b/test/old/testdir/test_popup.vim index 7f80c60118..41b694860c 100644 --- a/test/old/testdir/test_popup.vim +++ b/test/old/testdir/test_popup.vim @@ -988,7 +988,7 @@ func Test_popup_complete_backwards() call setline(1, ['Post', 'Port', 'Po']) let expected=['Post', 'Port', 'Port'] call cursor(3,2) - call feedkeys("A\". repeat("\", 3). "rt\", 'tx') + call feedkeys("A\". repeat("\", 3). "rt\", 'tx') call assert_equal(expected, getline(1,'$')) bwipe! endfunc @@ -998,7 +998,7 @@ func Test_popup_complete_backwards_ctrl_p() call setline(1, ['Post', 'Port', 'Po']) let expected=['Post', 'Port', 'Port'] call cursor(3,2) - call feedkeys("A\\rt\", 'tx') + call feedkeys("A\\rt\", 'tx') call assert_equal(expected, getline(1,'$')) bwipe! endfunc -- cgit