mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-11-03 19:11:34 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			97 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#autoload
 | 
						|
 | 
						|
# This code will try to correct the string on the line based on the
 | 
						|
# strings generated for the context. These corrected strings will be
 | 
						|
# shown in a list and one can cycle through them as in a menucompletion
 | 
						|
# or get the corrected prefix.
 | 
						|
 | 
						|
# We don't try correction if the string is too short or we have tried it
 | 
						|
# already.
 | 
						|
 | 
						|
[[ _matcher_num -gt 1 || "${#:-$PREFIX$SUFFIX}" -le 1 ]] && return 1
 | 
						|
 | 
						|
local _comp_correct _correct_expl comax cfgacc
 | 
						|
local oldcontext="${curcontext}" opm="$compstate[pattern_match]"
 | 
						|
 | 
						|
zstyle -s ":completion:${curcontext}:" max-errors cfgacc || cfgacc='2 numeric'
 | 
						|
 | 
						|
# Get the number of errors to accept.
 | 
						|
 | 
						|
if [[ "$cfgacc" = *numeric* && ${NUMERIC:-1} -ne 1 ]]; then
 | 
						|
  # A numeric argument may mean that we should not try correction.
 | 
						|
 | 
						|
  [[ "$cfgacc" = *not-numeric* ]] && return 1
 | 
						|
 | 
						|
  # Prefer the numeric argument if that has a sensible value.
 | 
						|
 | 
						|
  comax="${NUMERIC:-1}"
 | 
						|
else
 | 
						|
  comax="${cfgacc//[^0-9]}"
 | 
						|
fi
 | 
						|
 | 
						|
# If the number of errors to accept is too small, give up.
 | 
						|
 | 
						|
[[ "$comax" -lt 1 ]] && return 1
 | 
						|
 | 
						|
_tags corrections original
 | 
						|
 | 
						|
# Otherwise temporarily define a function to use instead of
 | 
						|
# the builtin that adds matches. This is used to be able
 | 
						|
# to stick the `(#a...)' in the right place (after an
 | 
						|
# ignored prefix).
 | 
						|
 | 
						|
compadd() {
 | 
						|
  [[ ${argv[(I)-[a-zA-Z]#U[a-zA-Z]#]} -eq 0 &&
 | 
						|
     "${#:-$PREFIX$SUFFIX}" -le _comp_correct ]] && return
 | 
						|
 | 
						|
  if [[ "$PREFIX" = \~*/* ]]; then
 | 
						|
    PREFIX="${PREFIX%%/*}/(#a${_comp_correct})${PREFIX#*/}"
 | 
						|
  else
 | 
						|
    PREFIX="(#a${_comp_correct})$PREFIX"
 | 
						|
  fi
 | 
						|
  builtin compadd "$_correct_expl[@]" "$@"
 | 
						|
}
 | 
						|
 | 
						|
_comp_correct=1
 | 
						|
 | 
						|
[[ -z "$compstate[pattern_match]" ]] && compstate[pattern_match]='*'
 | 
						|
 | 
						|
while [[ _comp_correct -le comax ]]; do
 | 
						|
  curcontext="${oldcontext/(#b)([^:]#:[^:]#:)/${match[1][1,-2]}-${_comp_correct}:}"
 | 
						|
 | 
						|
  _description corrections _correct_expl corrections \
 | 
						|
               "e:$_comp_correct" "o:$PREFIX$SUFFIX"
 | 
						|
 | 
						|
  if _complete; then
 | 
						|
    if zstyle -t ":completion:${curcontext}:" insert-unambiguous &&
 | 
						|
       [[ "${#compstate[unambiguous]}" -ge "${#:-$PREFIX$SUFFIX}" ]]; then
 | 
						|
      compstate[pattern_insert]=unambiguous
 | 
						|
    elif _requested original &&
 | 
						|
         { [[ compstate[nmatches] -gt 1 ]] ||
 | 
						|
           zstyle -t ":completion:${curcontext}:" original }; then
 | 
						|
      local expl
 | 
						|
 | 
						|
      _description -V original expl original
 | 
						|
 | 
						|
      builtin compadd "$expl[@]" -U -Q - "$PREFIX$SUFFIX"
 | 
						|
 | 
						|
      # If you always want to see the list of possible corrections,
 | 
						|
      # set `compstate[list]=list force' here.
 | 
						|
 | 
						|
      [[ "$compstate[list]" != list* ]] &&
 | 
						|
          compstate[list]="$compstate[list] force"
 | 
						|
    fi
 | 
						|
    unfunction compadd
 | 
						|
    compstate[pattern_match]="$opm"
 | 
						|
 | 
						|
    return 0
 | 
						|
  fi
 | 
						|
 | 
						|
  [[ "${#:-$PREFIX$SUFFIX}" -le _comp_correct+1 ]] && break
 | 
						|
  (( _comp_correct++ ))
 | 
						|
done
 | 
						|
 | 
						|
unfunction compadd
 | 
						|
compstate[pattern_match]="$opm"
 | 
						|
 | 
						|
return 1
 |