Fix case-insensitive partial completion matching (fixes #13412)

- Add case-insensitive matching to partial-word matchers
- Fixes issue where 'search' doesn't match 'Anki-Search-Stats-Extended'
- Uses 'r:|=*' (substring) not 'r:|?=**' (overly permissive) to prevent over-matching
- Maintains 100% backward compatibility with existing completion behavior
- Works in both default and HYPHEN_INSENSITIVE modes

Tested with 35+ test cases covering:
- Original issue scenarios
- Backward compatibility (exact, prefix, suffix, substring matches)
- Edge cases and random scenarios
- Over-matching prevention
- HYPHEN_INSENSITIVE mode
This commit is contained in:
Paul Frederiksen 2025-11-24 10:09:44 -08:00
commit 7451631bce

View file

@ -18,9 +18,9 @@ if [[ "$CASE_SENSITIVE" = true ]]; then
zstyle ':completion:*' matcher-list 'r:|=*' 'l:|=* r:|=*'
else
if [[ "$HYPHEN_INSENSITIVE" = true ]]; then
zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]-_}={[:upper:][:lower:]_-}' 'r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]-_}={[:upper:][:lower:]_-}' 'r:|=* m:{[:lower:][:upper:]-_}={[:upper:][:lower:]_-}' 'l:|=* r:|=* m:{[:lower:][:upper:]-_}={[:upper:][:lower:]_-}'
else
zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|=*' 'l:|=* r:|=*'
zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|=* m:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'l:|=* r:|=* m:{[:lower:][:upper:]}={[:upper:][:lower:]}'
fi
fi
unset CASE_SENSITIVE HYPHEN_INSENSITIVE