mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-16 14:41:02 +02:00
67 lines
2.2 KiB
Text
67 lines
2.2 KiB
Text
#autoload
|
|
|
|
# This is intended to be used as a completer function after the normal
|
|
# completer as in: `compconf 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.
|
|
#
|
|
# Configuration keys used:
|
|
#
|
|
# match_original
|
|
# If this is set to a `only', pattern matching will only be tried
|
|
# with the string from the line. If it is set to any other non-empty
|
|
# string, the original pattern will be tried first and if that yields
|
|
# no completions, matching will be tried again with a `*' inserted
|
|
# at the cursor position. If this key is not set or set to an empty
|
|
# string, matching will only be attempted with the `*' inserted.
|
|
#
|
|
# match_insert
|
|
# If this is set to a string starting with `unambig', menucompletion
|
|
# will only be turned on if no unambiguous string could be built
|
|
# that is at least as long as the original string.
|
|
|
|
local tmp opm="$compstate[pattern_match]" ret=0
|
|
|
|
# Do nothing if we don't have a pattern or there are still global
|
|
# match specifications to try.
|
|
|
|
tmp="${${:-$PREFIX$SUFFIX}#[~=]}"
|
|
[[ "$tmp:q" = "$tmp" ||
|
|
compstate[matcher] -ne compstate[total_matchers] ]] && return 1
|
|
|
|
# Try completion without inserting a `*'?
|
|
|
|
if [[ -n "$compconfig[match_original]" ]]; then
|
|
compstate[matcher]=-1
|
|
compstate[pattern_match]='-'
|
|
_complete && ret=1
|
|
compstate[pattern_match]="$opm"
|
|
compstate[matcher]="$compstate[total_matchers]"
|
|
|
|
if (( ret )); then
|
|
[[ "$compconfig[match_insert]" = unambig* &&
|
|
$#compstate[unambiguous] -ge ${#:-${PREFIX}${SUFFIX}} ]] &&
|
|
compstate[pattern_insert]=unambiguous
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
# No completion with inserting `*'?
|
|
|
|
[[ "$compconfig[match_original]" = only ]] && return 1
|
|
|
|
compstate[matcher]=-1
|
|
compstate[pattern_match]='*'
|
|
_complete && ret=1
|
|
compstate[pattern_match]="$opm"
|
|
compstate[matcher]="$compstate[total_matchers]"
|
|
|
|
[[ ret -eq 1 && "$compconfig[match_insert]" = unambig* &&
|
|
$#compstate[unambiguous] -ge ${#:-${PREFIX}${SUFFIX}} ]] &&
|
|
compstate[pattern_insert]=unambiguous
|
|
|
|
return 1-ret
|