Commit: patch 9.1.1790: completion: Enter does not insert match with "noinsert"

1 view
Skip to first unread message

Christian Brabandt

unread,
Sep 25, 2025, 3:00:20 PMSep 25
to vim...@googlegroups.com
patch 9.1.1790: completion: Enter does not insert match with "noinsert"

Commit: https://github.com/vim/vim/commit/ef818ae4448726b91c31e24406a554686dea19f5
Author: zeertzjq <zeer...@outlook.com>
Date: Thu Sep 25 06:08:04 2025 +0000

patch 9.1.1790: completion: Enter does not insert match with "noinsert"

Problem: completion: Enter does not insert match with "noinsert".
(Sergey Vlasov)
Solution: Check for compl_shown_match instead of compl_selected_item
(zeertzjq).

fixes: #18386
related: #1653
closes: #18395

Signed-off-by: zeertzjq <zeer...@outlook.com>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/insexpand.c b/src/insexpand.c
index 65e7a95eb..db6efdcf9 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -6315,7 +6315,8 @@ ins_compl_next(

// 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/src/testdir/test_edit.vim b/src/testdir/test_edit.vim
index 4a2d93fd5..7af4cdca6 100644
--- a/src/testdir/test_edit.vim
+++ b/src/testdir/test_edit.vim
@@ -2348,15 +2348,63 @@ func Test_edit_backspace_smarttab_virtual_text()
set smarttab&
endfunc

-func Test_edit_CAR()
- set cot=menu,menuone,noselect
- new
+func Test_edit_CAR_with_completion()
+ new
+
+ " 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\<CR>h\<C-X>\<C-N>e\<CR>", 'tx')
+ call assert_equal(['hello hero', 'he', ''], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'h', ''], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<C-N>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'hello', ''], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<C-N>\<C-N>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'hero', ''], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<C-N>\<C-P>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'h', ''], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<Down>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'hello'], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<Down>\<Down>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'hero'], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<Down>\<Up>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'h'], getline(1, '$'))
+ endfor

- call feedkeys("Shello hero\<CR>h\<C-x>\<C-N>e\<CR>", 'tx')
- call assert_equal(['hello hero', 'he', ''], getline(1, '$'))
+ " With "noinsert" but not "noselect": like pressing <Down> after "noselect".
+ set cot=menu,menuone,noinsert
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>e\<CR>", 'tx')
+ call assert_equal(['hello hero', 'hello'], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'hello'], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<Down>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'hero'], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<Up>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'h'], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<C-N>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'hero', ''], getline(1, '$'))
+ %delete
+ call feedkeys("Shello hero\<CR>h\<C-X>\<C-N>\<C-P>\<CR>", 'tx')
+ call assert_equal(['hello hero', 'h', ''], getline(1, '$'))

- bw!
set cot&
+ bw!
endfunc

" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 9531ed0d2..daf0d5f97 100644
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1790,
/**/
1789,
/**/
Reply all
Reply to author
Forward
0 new messages