From d9fa4956084efeb73e7bddacd6073357475e8286 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 26 Sep 2025 07:37:02 +0800 Subject: [PATCH] vim-patch:9.1.1790: completion: Enter does not insert match with "noinsert" (#35917) Problem: completion: Enter does not insert match with "noinsert". (Sergey Vlasov) Solution: Check for compl_shown_match instead of compl_selected_item (zeertzjq). fixes: vim/vim#18386 related: vim/vim#1653 closes: vim/vim#18395 https://github.com/vim/vim/commit/ef818ae4448726b91c31e24406a554686dea19f5 --- src/nvim/insexpand.c | 2 +- test/old/testdir/test_edit.vim | 58 +++++++++++++++++++++++++++++++--- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/nvim/insexpand.c b/src/nvim/insexpand.c index 799c11afd3..8de83f69d4 100644 --- a/src/nvim/insexpand.c +++ b/src/nvim/insexpand.c @@ -5451,7 +5451,7 @@ static int ins_compl_next(bool allow_get_expansion, int count, bool insert_match // Enter will select a match when the match wasn't inserted and the popup // menu is visible. - if (compl_no_insert && !started && compl_selected_item != -1) { + if (compl_no_insert && !started && !match_at_original_text(compl_shown_match)) { compl_enter_selects = true; } else { compl_enter_selects = !insert_match && compl_match_array != NULL; diff --git a/test/old/testdir/test_edit.vim b/test/old/testdir/test_edit.vim index 13eb424c83..4cc529702b 100644 --- a/test/old/testdir/test_edit.vim +++ b/test/old/testdir/test_edit.vim @@ -2364,15 +2364,63 @@ func Test_edit_backspace_smarttab_virtual_text() set smarttab& endfunc -func Test_edit_CAR() - set cot=menu,menuone,noselect +func Test_edit_CAR_with_completion() new - call feedkeys("Shello hero\h\\e\", 'tx') - call assert_equal(['hello hero', 'he', ''], getline(1, '$')) + " With "noselect", behavior is the same with and without "noinsert": + " Enter inserts a new line when no selection is done or after selecting with + " Ctrl-N/P, but does not insert a new line when selecting with cursor keys. + for cot in ['menu,menuone,noselect', 'menu,menuone,noselect,noinsert'] + let &cot = cot + %delete + call feedkeys("Shello hero\h\\e\", 'tx') + call assert_equal(['hello hero', 'he', ''], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\", 'tx') + call assert_equal(['hello hero', 'h', ''], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\\", 'tx') + call assert_equal(['hello hero', 'hello', ''], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\\\", 'tx') + call assert_equal(['hello hero', 'hero', ''], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\\\", 'tx') + call assert_equal(['hello hero', 'h', ''], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\\", 'tx') + call assert_equal(['hello hero', 'hello'], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\\\", 'tx') + call assert_equal(['hello hero', 'hero'], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\\\", 'tx') + call assert_equal(['hello hero', 'h'], getline(1, '$')) + endfor + + " With "noinsert" but not "noselect": like pressing after "noselect". + set cot=menu,menuone,noinsert + %delete + call feedkeys("Shello hero\h\\e\", 'tx') + call assert_equal(['hello hero', 'hello'], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\", 'tx') + call assert_equal(['hello hero', 'hello'], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\\", 'tx') + call assert_equal(['hello hero', 'hero'], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\\", 'tx') + call assert_equal(['hello hero', 'h'], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\\", 'tx') + call assert_equal(['hello hero', 'hero', ''], getline(1, '$')) + %delete + call feedkeys("Shello hero\h\\\\", 'tx') + call assert_equal(['hello hero', 'h', ''], getline(1, '$')) - bw! set cot& + bw! endfunc " vim: shiftwidth=2 sts=2 expandtab