summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorglepnir <glephunter@gmail.com>2024-08-02 19:14:38 +0200
committerChristian Brabandt <cb@256bit.org>2024-08-02 19:14:38 +0200
commitb9de1a057f9a0b6de6f64a9c1b2078c7069cdd7d (patch)
tree52717c341ce327692e2b748e15c6a9380610cc0b
parenta0b5bc12850f1d87fa51fb7be42df0ea835ccf21 (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.c27
-rw-r--r--src/testdir/test_ins_complete.vim32
-rw-r--r--src/version.c2
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,