patch 9.1.1374: completion: 'smartcase' not respected when filtering matches
Problem: Currently, 'smartcase' is respected when completing keywords
using <C-N>, <C-P>, <C-X><C-N>, and <C-X><C-P>. However, when
a user continues typing and the completion menu is filtered
using cached matches, 'smartcase' is not applied. This leads
to poor-quality or irrelevant completion suggestions, as shown
in the example below.
Solution: When filtering cached completion items after typing additional
characters, apply case-sensitive comparison if 'smartcase' is
enabled and the typed pattern includes uppercase characters.
This ensures consistent and expected completion behavior.
(Girish Palya)
closes: #17271
Signed-off-by: Girish Palya <girishji@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/insexpand.c b/src/insexpand.c
index 3839586..7bbff4e 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -1507,7 +1507,7 @@
match_count = 1;
max_matches_found = FALSE;
}
- else if (cpt_sources_array && !max_matches_found)
+ else if (cpt_sources_array != NULL && !max_matches_found)
{
int max_matches = cpt_sources_array[cur_source].max_matches;
if (max_matches > 0 && match_count > max_matches)
@@ -1515,10 +1515,16 @@
}
}
+ // Apply 'smartcase' behavior during normal mode
+ if (ctrl_x_mode_normal() && !p_inf && compl_leader.string
+ && !ignorecase(compl_leader.string) && !fuzzy_filter)
+ compl->cp_flags &= ~CP_ICASE;
+
if (!match_at_original_text(compl)
&& !max_matches_found
&& (compl_leader.string == NULL
- || ins_compl_equal(compl, compl_leader.string, (int)compl_leader.length)
+ || ins_compl_equal(compl, compl_leader.string,
+ (int)compl_leader.length)
|| (fuzzy_filter && compl->cp_score > 0)))
{
++compl_match_arraysize;