neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 1460f01faf7e0db979ccb606b158f4e2e5e5d579
parent 4f9d47bd9085228510afe9d8fc844f33a70abf0c
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Tue, 16 Sep 2025 22:58:25 +0800

Merge pull request #35799 from zeertzjq/vim-9.1.1762

vim-patch:9.1.1762,10d1ec6
Diffstat:
Mruntime/doc/insert.txt | 4++++
Msrc/nvim/insexpand.c | 5+++++
Mtest/old/testdir/test_ins_complete.vim | 15+++++++++++++++
3 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt @@ -1368,6 +1368,8 @@ In the first state these keys have a special meaning: <BS> and CTRL-H Delete one character, find the matches for the word before the cursor. This reduces the list of matches, often to one entry, and switches to the second state. + When 'autocomplete' is active, clears the selected item in + the menu. Any non-special character: Stop completion without changing the match and insert the typed character. @@ -1375,6 +1377,8 @@ Any non-special character: In the second and third state these keys have a special meaning: <BS> and CTRL-H Delete one character, find the matches for the shorter word before the cursor. This may find more matches. + When 'autocomplete' is active, clears the selected item in + the menu. CTRL-L Add one character from the current match, may reduce the number of matches. any printable, non-white character: diff --git a/src/nvim/insexpand.c b/src/nvim/insexpand.c @@ -2197,6 +2197,11 @@ int ins_compl_bs(void) compl_leader = cbuf_to_string(line + compl_col, (size_t)(p_off - (ptrdiff_t)compl_col)); + // Clear selection if a menu item is currently selected in autocompletion + if (compl_autocomplete && compl_first_match) { + compl_shown_match = compl_first_match; + } + ins_compl_new_leader(); if (compl_shown_match != NULL) { // Make sure current match is not a hidden item. diff --git a/test/old/testdir/test_ins_complete.vim b/test/old/testdir/test_ins_complete.vim @@ -5359,6 +5359,21 @@ func Test_autocomplete_trigger() call feedkeys("Sazx\<Left>\<BS>\<F2>\<Esc>0", 'tx!') call assert_equal(['and', 'afoo'], b:matches->mapnew('v:val.word')) + " Test 6: <BS> should clear the selected item + %d + call setline(1, ["foobarfoo", "foobar", "foobarbaz"]) + call feedkeys("Gofo\<C-N>\<C-N>\<F2>\<F3>\<Esc>0", 'tx!') + call assert_equal(['foobarbaz', 'foobar', 'foobarfoo'], b:matches->mapnew('v:val.word')) + call assert_equal(1, b:selected) + call feedkeys("Sfo\<C-N>\<C-N>\<BS>\<F2>\<F3>\<Esc>0", 'tx!') + call assert_equal(['foobarbaz', 'foobar', 'foobarfoo'], b:matches->mapnew('v:val.word')) + call assert_equal(-1, b:selected) + call assert_equal('fooba', getline(4)) + call feedkeys("Sfo\<C-N>\<C-N>\<BS>\<C-N>\<F2>\<F3>\<Esc>0", 'tx!') + call assert_equal(['foobarbaz', 'foobar', 'foobarfoo'], b:matches->mapnew('v:val.word')) + call assert_equal(0, b:selected) + call assert_equal('foobarbaz', getline(4)) + bw! call Ntest_override("char_avail", 0) delfunc NonKeywordComplete