Mercurial > vim
changeset 36151:610040fe16d0 v9.1.0733
patch 9.1.0733: keyword completion does not work with fuzzy
Commit: https://github.com/vim/vim/commit/7cfe693f9bfa74690867e4d96c25f2205d0d13e4
Author: glepnir <glephunter@gmail.com>
Date: Sun Sep 15 20:06:28 2024 +0200
patch 9.1.0733: keyword completion does not work with fuzzy
Problem: keyword completion does not work with fuzzy
(egesip)
Solution: handle ctrl_x_mode_normal() specifically
(glepnir)
fixes: #15412
closes: #15424
Signed-off-by: glepnir <glephunter@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sun, 15 Sep 2024 20:15:04 +0200 |
parents | e0d9e1d23e79 |
children | 87a25e4020d3 |
files | src/insexpand.c src/search.c src/testdir/test_ins_complete.vim src/version.c |
diffstat | 4 files changed, 68 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/insexpand.c +++ b/src/insexpand.c @@ -5198,6 +5198,7 @@ ins_compl_start(void) if (line_invalid) line = ml_get(curwin->w_cursor.lnum); + int in_fuzzy = get_cot_flags() & COT_FUZZY; if (compl_status_adding()) { edit_submode_pre = (char_u *)_(" Adding"); @@ -5214,6 +5215,11 @@ ins_compl_start(void) compl_length = 0; compl_col = curwin->w_cursor.col; } + else if (ctrl_x_mode_normal() && in_fuzzy) + { + compl_startpos = curwin->w_cursor; + compl_cont_status &= CONT_S_IPOS; + } } else {
--- a/src/search.c +++ b/src/search.c @@ -5219,6 +5219,8 @@ search_for_fuzzy_match( pos_T circly_end; int found_new_match = FALSE; int looped_around = FALSE; + char_u *next_word_end = NULL; + char_u *match_word = NULL; if (whole_line) current_pos.lnum += dir; @@ -5254,6 +5256,35 @@ search_for_fuzzy_match( found_new_match = fuzzy_match_str_in_line(ptr, pattern, len, ¤t_pos); if (found_new_match) { + if (ctrl_x_mode_normal()) + { + match_word = vim_strnsave(*ptr, *len); + if (STRCMP(match_word, pattern) == 0) + { + next_word_end = find_word_start(*ptr + *len); + if (*next_word_end != NUL && *next_word_end != NL) + { + // Find end of the word. + if (has_mbyte) + while (*next_word_end != NUL) + { + int l = (*mb_ptr2len)(next_word_end); + + if (l < 2 && !vim_iswordc(*next_word_end)) + break; + next_word_end += l; + } + else + next_word_end = find_word_end(next_word_end); + } + else if (looped_around) + found_new_match = FALSE; + + *len = next_word_end - *ptr; + current_pos.col = *len; + } + vim_free(match_word); + } *pos = current_pos; break; }
--- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -2654,10 +2654,38 @@ func Test_complete_fuzzy_match() call feedkeys("Su\<C-X>\<C-L>\<C-P>\<Esc>0", 'tx!') call assert_equal('no one can save me but you', getline('.')) + " issue #15412 + call setline(1, ['alpha bravio charlie']) + call feedkeys("Salpha\<C-X>\<C-N>\<Esc>0", 'tx!') + call assert_equal('alpha bravio', getline('.')) + call feedkeys("Salp\<C-X>\<C-N>\<Esc>0", 'tx!') + call assert_equal('alpha', getline('.')) + call feedkeys("A\<C-X>\<C-N>\<Esc>0", 'tx!') + call assert_equal('alpha bravio', getline('.')) + call feedkeys("A\<C-X>\<C-N>\<Esc>0", 'tx!') + call assert_equal('alpha bravio charlie', getline('.')) + + set complete-=i + call feedkeys("Salp\<C-X>\<C-N>\<Esc>0", 'tx!') + call assert_equal('alpha', getline('.')) + call feedkeys("A\<C-X>\<C-N>\<Esc>0", 'tx!') + call assert_equal('alpha bravio', getline('.')) + call feedkeys("A\<C-X>\<C-N>\<Esc>0", 'tx!') + call assert_equal('alpha bravio charlie', getline('.')) + + call setline(1, ['alpha bravio charlie', 'alpha another']) + call feedkeys("Salpha\<C-X>\<C-N>\<C-N>\<Esc>0", 'tx!') + call assert_equal('alpha another', getline('.')) + call setline(1, ['你好 我好', '你好 他好']) + call feedkeys("S你好\<C-X>\<C-N>\<Esc>0", 'tx!') + call assert_equal('你好 我好', getline('.')) + call feedkeys("S你好\<C-X>\<C-N>\<C-N>\<Esc>0", 'tx!') + call assert_equal('你好 他好', getline('.')) + " issue #15526 set completeopt=fuzzy,menuone,menu,noselect call setline(1, ['Text', 'ToText', '']) - call cursor(2, 1) + call cursor(3, 1) call feedkeys("STe\<C-X>\<C-N>x\<CR>\<Esc>0", 'tx!') call assert_equal('Tex', getline('.'))