From f4ddbaeb9e3dd68f8d6b90e805246a24b7960019 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 30 Aug 2024 16:43:31 +0800 Subject: 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 --- src/nvim/insexpand.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/nvim/insexpand.c b/src/nvim/insexpand.c index 15ece1cab8..af26e882dc 100644 --- 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 -- cgit