aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorglepnir <glephunter@gmail.com>2025-02-19 13:40:46 +0800
committerzeertzjq <zeertzjq@outlook.com>2025-02-21 07:45:30 +0800
commit07785ea9c5595f379f2cac2ce8ffa95244e3d8e3 (patch)
treec3b1f2224d694097642c40b324934f512a448019
parent99a6cbe5409dc296d6a5597733d92f63d8bca27e (diff)
downloadrneovim-07785ea9c5595f379f2cac2ce8ffa95244e3d8e3.tar.gz
rneovim-07785ea9c5595f379f2cac2ce8ffa95244e3d8e3.tar.bz2
rneovim-07785ea9c5595f379f2cac2ce8ffa95244e3d8e3.zip
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 <glephunter@gmail.com>
-rw-r--r--src/nvim/insexpand.c8
-rw-r--r--test/functional/editor/completion_spec.lua10
-rw-r--r--test/functional/legacy/edit_spec.lua24
-rw-r--r--test/old/testdir/test_edit.vim17
-rw-r--r--test/old/testdir/test_ins_complete.vim2
-rw-r--r--test/old/testdir/test_popup.vim4
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<C-x><C-u>')
poke_eventloop()
feed('u')
poke_eventloop()
feed('<CR>')
- expect('Ju')
+ expect([[Ju
+]])
feed('<Esc>')
poke_eventloop()
-- The behavior should be the same when completion has been interrupted,
-- which can happen interactively if the completion function is slow.
- feed('SJ<C-x><C-u>u<CR>')
- expect('Ju')
+ feed('ggVGSJ<C-x><C-u>u<CR>')
+ 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 hero<CR>h<C-X><C-N>e')
+ screen:expect([[
+ hello hero |
+ he^ |
+ {4:hello }|
+ {4:hero }|
+ {1:~ }|
+ {5:--} |
+ ]])
+
+ feed('<CR>')
+ 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 <buffer> :call DoIt()
- call feedkeys("A\<f5>\<c-p>u\<cr>\<c-l>\<cr>", 'tx')
+ call feedkeys("A\<f5>\<c-p>u\<C-Y>\<c-l>\<cr>", 'tx')
call assert_equal(["Jan\<c-l>",''], 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\<c-x>\<tab>\<down>\<down>\<cr>\<esc>", 'tnix')
call assert_equal([include, 'three', ''], getline(1, '$'))
- call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
+ call feedkeys("2ggC\<c-x>\<tab>\<down>\<down>\<down>\<C-y>\<esc>", '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\<c-x>\<c-k>\<down>\<down>\<down>\<cr>\<esc>", 'tnix')
+ call feedkeys("A\<c-x>\<c-k>\<down>\<down>\<down>\<C-Y>\<esc>", '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\<CR>h\<C-x>\<C-N>e\<CR>", '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\<C-X>\<C-N>x\<CR>\<Esc>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\<C-X>". repeat("\<C-P>", 3). "rt\<cr>", 'tx')
+ call feedkeys("A\<C-X>". repeat("\<C-P>", 3). "rt\<C-Y>", '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\<C-P>\<C-N>rt\<cr>", 'tx')
+ call feedkeys("A\<C-P>\<C-N>rt\<C-Y>", 'tx')
call assert_equal(expected, getline(1,'$'))
bwipe!
endfunc