]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0654: completion does not respect completeslash with fuzzy v9.1.0654
authorglepnir <glephunter@gmail.com>
Fri, 2 Aug 2024 17:14:38 +0000 (19:14 +0200)
committerChristian Brabandt <cb@256bit.org>
Fri, 2 Aug 2024 17:14:38 +0000 (19:14 +0200)
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>
src/insexpand.c
src/testdir/test_ins_complete.vim
src/version.c

index 3a168848fed4efd77ba68182b8bd1bdd0e50714b..9a8d0faac7c26d8848e92b34287fea56fba767f0 100644 (file)
@@ -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,
index cf688ac6a6d635ce3ee4a1233d9b2a0946685580..becd0d8d059e90eab7cf341aeff17c186e19ed07 100644 (file)
@@ -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()
index b9fdfcd23302ae0038b449487c60f58d77217698..1ff7fdc6285af3da8c76774ac3934ae0b058e3f5 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    654,
 /**/
     653,
 /**/