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, &current_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('.'))
 
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    733,
+/**/
     732,
 /**/
     731,