diff options
author | glepnir <glephunter@gmail.com> | 2024-08-02 19:14:38 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2024-08-02 19:14:38 +0200 |
commit | b9de1a057f9a0b6de6f64a9c1b2078c7069cdd7d (patch) | |
tree | 52717c341ce327692e2b748e15c6a9380610cc0b | |
parent | a0b5bc12850f1d87fa51fb7be42df0ea835ccf21 (diff) |
patch 9.1.0654: completion does not respect completeslash with fuzzyv9.1.0654
Problem: completion does not respect completeslash with fuzzy
(egesip)
Solution: Change path separator on Windows, depending on 'completeslash'
option value (glepnir)
fixes: #15392
closes: #15418
Signed-off-by: glepnir <glephunter@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r-- | src/insexpand.c | 27 | ||||
-rw-r--r-- | src/testdir/test_ins_complete.vim | 32 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 60 insertions, 1 deletions
diff --git a/src/insexpand.c b/src/insexpand.c index 3a168848fe..9a8d0faac7 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -3552,9 +3552,34 @@ get_next_filename_completion(void) size_t path_with_wildcard_len; char_u *path_with_wildcard; +#ifdef BACKSLASH_IN_FILENAME + char pathsep = (curbuf->b_p_csl[0] == 's') ? + '/' : (curbuf->b_p_csl[0] == 'b') ? '\\' : PATHSEP; +#else + char pathsep = PATHSEP; +#endif + if (in_fuzzy) { - last_sep = vim_strrchr(leader, PATHSEP); +#ifdef BACKSLASH_IN_FILENAME + if (curbuf->b_p_csl[0] == 's') + { + for (i = 0; i < leader_len; i++) + { + if (leader[i] == '\\') + leader[i] = '/'; + } + } + else if (curbuf->b_p_csl[0] == 'b') + { + for (i = 0; i < leader_len; i++) + { + if (leader[i] == '/') + leader[i] = '\\'; + } + } +#endif + last_sep = vim_strrchr(leader, pathsep); if (last_sep == NULL) { // No path separator or separator is the last character, diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index cf688ac6a6..becd0d8d05 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -2668,6 +2668,38 @@ func Test_complete_fuzzy_match() unlet g:word endfunc +func Test_complete_fuzzy_with_completeslash() + CheckMSWindows + + call writefile([''], 'fobar', 'D') + let orig_shellslash = &shellslash + set cpt& + new + set completeopt+=fuzzy + set noshellslash + + " Test with completeslash unset + set completeslash= + call setline(1, ['.\fob']) + call feedkeys("A\<C-X>\<C-F>\<Esc>0", 'tx!') + call assert_equal('.\fobar', getline('.')) + + " Test with completeslash=backslash + set completeslash=backslash + call feedkeys("S.\\fob\<C-X>\<C-F>\<Esc>0", 'tx!') + call assert_equal('.\fobar', getline('.')) + + " Test with completeslash=slash + set completeslash=slash + call feedkeys("S.\\fob\<C-X>\<C-F>\<Esc>0", 'tx!') + call assert_equal('./fobar', getline('.')) + + " Reset and clean up + let &shellslash = orig_shellslash + set completeslash= + %bw! +endfunc + " Check that tie breaking is stable for completeopt+=fuzzy (which should " behave the same on different platforms). func Test_complete_fuzzy_match_tie() diff --git a/src/version.c b/src/version.c index b9fdfcd233..1ff7fdc628 100644 --- 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 */ /**/ + 654, +/**/ 653, /**/ 652, |