patch 9.1.1618: completion: incorrect selected index returned from complete_info()

Problem:  completion: incorrect selected index returned from
          complete_info()
Solution: Return the index into "items" and restore the previous
          behaviour (Robert Muir).

complete_info() returned an incorrect selected index after
0ac1eb3555 (Patch v9.1.1311). Effectively
it became an index into "matches" instead of "items". Return the index
into "items" by default to restore the previous behavior, unless
"matches" was requested.

closes: #17952

Co-authored-by: Hirohito Higashi <h.east.727@gmail.com>
Signed-off-by: Robert Muir <rmuir@apache.org>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Robert Muir
2025-08-10 09:19:36 +02:00
committed by Christian Brabandt
parent 1434ea03b1
commit 8e2a229189
3 changed files with 28 additions and 5 deletions

View File

@ -4184,8 +4184,8 @@ get_complete_info(list_T *what_list, dict_T *retdict)
if (compl_curr_match != NULL if (compl_curr_match != NULL
&& compl_curr_match->cp_number == match->cp_number) && compl_curr_match->cp_number == match->cp_number)
selected_idx = list_idx; selected_idx = list_idx;
if (match->cp_in_match_array) if (!has_matches || match->cp_in_match_array)
list_idx += 1; list_idx++;
} }
match = match->cp_next; match = match->cp_next;
} }

View File

@ -3520,7 +3520,7 @@ func Test_complete_opt_fuzzy()
set cot+=noinsert set cot+=noinsert
call feedkeys("i\<C-R>=CompAnother()\<CR>f", 'tx') call feedkeys("i\<C-R>=CompAnother()\<CR>f", 'tx')
call assert_equal("for", g:abbr) call assert_equal("for", g:abbr)
call assert_equal(0, g:selected) call assert_equal(2, g:selected)
set cot=menu,menuone,noselect,fuzzy set cot=menu,menuone,noselect,fuzzy
call feedkeys("i\<C-R>=CompAnother()\<CR>\<C-N>\<C-N>\<C-N>\<C-N>", 'tx') call feedkeys("i\<C-R>=CompAnother()\<CR>\<C-N>\<C-N>\<C-N>\<C-N>", 'tx')
@ -3904,6 +3904,27 @@ func Test_complete_info_completed()
set cot& set cot&
endfunc endfunc
func Test_complete_info_selected()
set completeopt=menuone,noselect
new
call setline(1, ["ward", "werd", "wurd", "wxrd"])
exe "normal! Gow\<c-n>u\<c-n>\<c-r>=complete_info().selected\<cr>"
call assert_equal('wurd2', getline(5))
exe "normal! Sw\<c-n>u\<c-n>\<c-r>=complete_info(['selected']).selected\<cr>"
call assert_equal('wurd2', getline(5))
exe "normal! Sw\<c-n>u\<c-n>\<c-r>=complete_info(['items', 'selected']).selected\<cr>"
call assert_equal('wurd2', getline(5))
exe "normal! Sw\<c-n>u\<c-n>\<c-r>=complete_info(['matches', 'selected']).selected\<cr>"
call assert_equal('wurd0', getline(5))
bw!
set cot&
endfunc
func Test_completeopt_preinsert() func Test_completeopt_preinsert()
func Omni_test(findstart, base) func Omni_test(findstart, base)
if a:findstart if a:findstart
@ -3924,7 +3945,7 @@ func Test_completeopt_preinsert()
call assert_equal("fobar", g:line) call assert_equal("fobar", g:line)
call assert_equal(2, g:col) call assert_equal(2, g:col)
call feedkeys("S\<C-X>\<C-O>foo\<F5><ESC>", 'tx') call feedkeys("S\<C-X>\<C-O>foo\<F5>\<ESC>", 'tx')
call assert_equal("foobar", g:line) call assert_equal("foobar", g:line)
call feedkeys("S\<C-X>\<C-O>foo\<BS>\<BS>\<BS>", 'tx') call feedkeys("S\<C-X>\<C-O>foo\<BS>\<BS>\<BS>", 'tx')
@ -5067,7 +5088,7 @@ func Test_autocomplete_trigger()
new new
inoremap <buffer> <F2> <Cmd>let b:matches = complete_info(["matches"]).matches<CR> inoremap <buffer> <F2> <Cmd>let b:matches = complete_info(["matches"]).matches<CR>
inoremap <buffer> <F3> <Cmd>let b:selected = complete_info(["selected"]).selected<CR> inoremap <buffer> <F3> <Cmd>let b:selected = complete_info(["matches", "selected"]).selected<CR>
call setline(1, ['abc', 'abcd', 'fo', 'b', '']) call setline(1, ['abc', 'abcd', 'fo', 'b', ''])
set autocomplete set autocomplete

View File

@ -719,6 +719,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1618,
/**/ /**/
1617, 1617,
/**/ /**/