commit f4ddbaeb9e3dd68f8d6b90e805246a24b7960019
parent d9f4c1db23bff997ec2f568b378c2666fa580ad7
Author: zeertzjq <zeertzjq@outlook.com>
Date: Fri, 30 Aug 2024 16:43:31 +0800
vim-patch:9.1.0654: completion does not respect completeslash with fuzzy
Problem: completion does not respect completeslash with fuzzy
(egesip)
Solution: Change path separator on Windows, depending on 'completeslash'
option value (glepnir)
fixes: vim/vim#15392
closes: vim/vim#15418
https://github.com/vim/vim/commit/b9de1a057f9a0b6de6f64a9c1b2078c7069cdd7d
Co-authored-by: glepnir <glephunter@gmail.com>
Diffstat:
2 files changed, 55 insertions(+), 1 deletion(-)
diff --git a/src/nvim/insexpand.c b/src/nvim/insexpand.c
@@ -3318,8 +3318,30 @@ static void get_next_filename_completion(void)
size_t leader_len = ins_compl_leader_len();
bool in_fuzzy = ((get_cot_flags() & kOptCotFlagFuzzy) != 0 && leader_len > 0);
+#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) {
- char *last_sep = strrchr(leader, PATHSEP);
+#ifdef BACKSLASH_IN_FILENAME
+ if (curbuf->b_p_csl[0] == 's') {
+ for (size_t i = 0; i < leader_len; i++) {
+ if (leader[i] == '\\') {
+ leader[i] = '/';
+ }
+ }
+ } else if (curbuf->b_p_csl[0] == 'b') {
+ for (size_t i = 0; i < leader_len; i++) {
+ if (leader[i] == '/') {
+ leader[i] = '\\';
+ }
+ }
+ }
+#endif
+ char *last_sep = strrchr(leader, pathsep);
if (last_sep == NULL) {
// No path separator or separator is the last character,
// fuzzy match the whole leader
diff --git a/test/old/testdir/test_ins_complete.vim b/test/old/testdir/test_ins_complete.vim
@@ -2966,6 +2966,38 @@ func Test_complete_fuzzy_match()
unlet g:abbr
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()