diff options
Diffstat (limited to 'Completion/Base/Completer/_match')
-rw-r--r-- | Completion/Base/Completer/_match | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/Completion/Base/Completer/_match b/Completion/Base/Completer/_match new file mode 100644 index 000000000..ce2b8affe --- /dev/null +++ b/Completion/Base/Completer/_match @@ -0,0 +1,70 @@ +#autoload + +# This is intended to be used as a completer function after the normal +# completer as in: `zstyle ":completion:::::" completer _complete _match'. +# It temporarily switches on pattern matching, allowing you to try +# completion on patterns without having to setopt glob_complete. +# +# Note, however, that this is only really useful if you don't use the +# expand-or-complete function because otherwise the pattern will +# be expanded using globbing. + +### Shouldn't be needed any more: [[ _matcher_num -gt 1 ]] && return 1 + +local tmp opm="$compstate[pattern_match]" ret=1 orig ins +local oms="$_old_match_string" +local ocsi="$compstate[insert]" ocspi="$compstate[pattern_insert]" + +# Do nothing if we don't have a pattern. + +tmp="${${:-$PREFIX$SUFFIX}#[~=]}" +[[ "$tmp:q" = "$tmp" ]] && return 1 + +_old_match_string="$PREFIX$SUFFIX$HISTNO" + +zstyle -s ":completion:${curcontext}:" match-original orig +zstyle -s ":completion:${curcontext}:" insert-unambiguous ins + +# Try completion without inserting a `*'? + +if [[ -n "$orig" ]]; then + compstate[pattern_match]='-' + _complete && ret=0 + compstate[pattern_match]="$opm" + + # No completion with inserting `*'? + + [[ ret -eq 1 && "$orig" = only ]] && return 1 +fi + +if (( ret )); then + compstate[pattern_match]='*' + _complete && ret=0 + compstate[pattern_match]="$opm" +fi + +if (( ! ret )); then + + if [[ "$ins" = pattern && $compstate[nmatches] -gt 1 ]]; then + + [[ "$oms" = "$PREFIX$SUFFIX$HISTNO" && + "$compstate[insert]" = automenu-unambiguous ]] && + compstate[insert]=automenu + [[ "$compstate[insert]" != *menu ]] && + compstate[pattern_insert]= compstate[insert]= + +# We tried to be clever here, making completion insert unambiguous +# expansions as early as possible, but this is really hard to test +# and the code below probably does more harm than good. +# +# [[ $compstate[unambiguous_cursor] -gt $#compstate[unambiguous] ]] && +# ins=yes compstate[insert]="$ocsi" compstate[pattern_insert]="$ocspi" + fi + + [[ "$ins" = (true|yes|on|1) && + $#compstate[unambiguous] -ge ${#:-${PREFIX}${SUFFIX}} ]] && + compstate[pattern_insert]=unambiguous + +fi + +return ret |