From e7dd0fa2c61fe71f12c72b0dcb7bb6415eb048fb Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Tue, 22 Mar 2022 16:06:31 +0000 Subject: patch 8.2.4608: getcompletion() does not work when 'wildoptions' has "fuzzy" Problem: getcompletion() does not work properly when 'wildoptions contains "fuzzy". Solution: Do not use addstar(). (Yegappan Lakshmanan, closes #9992, closes #9986) --- runtime/doc/builtin.txt | 4 ++++ src/cmdexpand.c | 7 ++++++- src/testdir/test_cmdline.vim | 16 ++++++++++++++++ src/version.c | 2 ++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt index 062ccc345d..602d9098e6 100644 --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -3273,6 +3273,10 @@ getcompletion({pat}, {type} [, {filtered}]) *getcompletion()* is applied to filter the results. Otherwise all the matches are returned. The 'wildignorecase' option always applies. + If the 'wildoptions' option contains 'fuzzy', then fuzzy + matching is used to get the completion matches. Otherwise + regular expression matching is used. + If {type} is "cmdline", then the |cmdline-completion| result is returned. For example, to complete the possible values after a ":call" command: > diff --git a/src/cmdexpand.c b/src/cmdexpand.c index 5ba6b084d3..defc282dbb 100644 --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -3707,7 +3707,12 @@ f_getcompletion(typval_T *argvars, typval_T *rettv) # endif } - pat = addstar(xpc.xp_pattern, xpc.xp_pattern_len, xpc.xp_context); + if (cmdline_fuzzy_completion_supported(&xpc)) + // when fuzzy matching, don't modify the search string + pat = vim_strsave(xpc.xp_pattern); + else + pat = addstar(xpc.xp_pattern, xpc.xp_pattern_len, xpc.xp_context); + if ((rettv_list_alloc(rettv) != FAIL) && (pat != NULL)) { int i; diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index dc781f8e10..299210b878 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -552,6 +552,22 @@ func Test_getcompletion() call assert_fails('call getcompletion("abc", [])', 'E475:') endfunc +" Test for getcompletion() with "fuzzy" in 'wildoptions' +func Test_getcompletion_wildoptions() + let save_wildoptions = &wildoptions + set wildoptions& + let l = getcompletion('space', 'option') + call assert_equal([], l) + let l = getcompletion('ier', 'command') + call assert_equal([], l) + set wildoptions=fuzzy + let l = getcompletion('space', 'option') + call assert_true(index(l, 'backspace') >= 0) + let l = getcompletion('ier', 'command') + call assert_true(index(l, 'compiler') >= 0) + let &wildoptions = save_wildoptions +endfunc + func Test_complete_autoload_error() let save_rtp = &rtp let lines =<< trim END diff --git a/src/version.c b/src/version.c index 2c2ac28bf3..2180ebf264 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4608, /**/ 4607, /**/ -- cgit v1.2.3