mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-11-02 18:50:56 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#autoload
 | 
						|
 | 
						|
local tags def expl descr action mesgs nm="$compstack[nmatches]"
 | 
						|
local context
 | 
						|
 | 
						|
if [[ "$1" = -C?* ]]; then
 | 
						|
  context="${1[3,-1]}"
 | 
						|
  shift
 | 
						|
elif [[ "$1" = -C ]]; then
 | 
						|
  context="$2"
 | 
						|
  shift 2
 | 
						|
fi
 | 
						|
 | 
						|
mesgs=()
 | 
						|
 | 
						|
_tags -C "$context" "${(@)argv%%:*}"
 | 
						|
 | 
						|
while _tags; do
 | 
						|
  for def; do
 | 
						|
    if _requested "${def%%:*}"; then
 | 
						|
      descr="${${def#*:}%%:*}"
 | 
						|
      action="${def#*:*:}"
 | 
						|
 | 
						|
      _description expl "$descr"
 | 
						|
 | 
						|
      if [[ "$action" = \ # ]]; then
 | 
						|
 | 
						|
        # An empty action means that we should just display a message.
 | 
						|
 | 
						|
        mesgs=( "$mesgs[@]" "$descr")
 | 
						|
      elif [[ "$action" = \(\(*\)\) ]]; then
 | 
						|
        local ws
 | 
						|
 | 
						|
        # ((...)) contains literal strings with descriptions.
 | 
						|
 | 
						|
        eval ws\=\( "${action[3,-3]}" \)
 | 
						|
 | 
						|
        _describe "$descr" ws -M 'r:|[_-]=* r:|=*'
 | 
						|
      elif [[ "$action" = \(*\) ]]; then
 | 
						|
 | 
						|
        # Anything inside `(...)' is added directly.
 | 
						|
 | 
						|
        compadd "$expl[@]" - ${=action[2,-2]}
 | 
						|
      elif [[ "$action" = \{*\} ]]; then
 | 
						|
 | 
						|
        # A string in braces is evaluated.
 | 
						|
 | 
						|
        eval "$action[2,-2]"
 | 
						|
      elif [[ "$action" = \ * ]]; then
 | 
						|
 | 
						|
        # If the action starts with a space, we just call it.
 | 
						|
 | 
						|
        ${(e)=~action}
 | 
						|
      else
 | 
						|
 | 
						|
        # Otherwise we call it with the description-arguments built above.
 | 
						|
 | 
						|
        action=( $=action )
 | 
						|
        ${(e)action[1]} "$expl[@]" ${(e)~action[2,-1]}
 | 
						|
      fi
 | 
						|
    fi
 | 
						|
  done
 | 
						|
  [[ nm -ne compstate[nmatches] ]] && return 0
 | 
						|
done
 | 
						|
 | 
						|
for descr in "$mesgs[@]"; do
 | 
						|
  _message "$descr"
 | 
						|
done
 | 
						|
 | 
						|
return 1
 |