mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-11-04 07:21:06 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			82 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#autoload
 | 
						|
 | 
						|
local tags def expl descr action mesgs nm="$compstate[nmatches]" subopts
 | 
						|
local opt curcontext="$curcontext"
 | 
						|
 | 
						|
subopts=()
 | 
						|
while getopts 'O:C:' opt; do
 | 
						|
  case "$opt" in
 | 
						|
  O) subopts=( "${(@P)OPTARG}" ) ;;
 | 
						|
  C) curcontext="${curcontext%:*}:$OPTARG" ;;
 | 
						|
  esac
 | 
						|
done
 | 
						|
 | 
						|
shift OPTIND-1
 | 
						|
 | 
						|
[[ "$1" = -(|-) ]] && shift
 | 
						|
 | 
						|
mesgs=()
 | 
						|
 | 
						|
_tags "${(@)argv%%:*}"
 | 
						|
 | 
						|
while _tags; do
 | 
						|
  for def; do
 | 
						|
    if _requested "${def%%:*}"; then
 | 
						|
      descr="${${def#*:}%%:*}"
 | 
						|
      action="${def#*:*:}"
 | 
						|
 | 
						|
      _description "${def%%:*}" 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:|=*' "$subopts[@]"
 | 
						|
      elif [[ "$action" = \(*\) ]]; then
 | 
						|
 | 
						|
        # Anything inside `(...)' is added directly.
 | 
						|
 | 
						|
        _all_labels "${def%%:*}" expl "$descr" \
 | 
						|
            compadd "$subopts[@]" - ${=action[2,-2]}
 | 
						|
      elif [[ "$action" = \{*\} ]]; then
 | 
						|
 | 
						|
        # A string in braces is evaluated.
 | 
						|
 | 
						|
        while _next_label "${def%%:*}" expl "$descr"; do
 | 
						|
          eval "$action[2,-2]"
 | 
						|
        done
 | 
						|
      elif [[ "$action" = \ * ]]; then
 | 
						|
 | 
						|
        # If the action starts with a space, we just call it.
 | 
						|
 | 
						|
        eval "action=( $action )"
 | 
						|
        while _next_label "${def%%:*}" expl "$descr"; do
 | 
						|
          "$action[@]"
 | 
						|
        done
 | 
						|
      else
 | 
						|
 | 
						|
        # Otherwise we call it with the description-arguments built above.
 | 
						|
 | 
						|
        eval "action=( $action )"
 | 
						|
	while _next_label "${def%%:*}" expl "$descr"; do
 | 
						|
          "$action[1]" "$subopts[@]" "$expl[@]" "${(@)action[2,-1]}"
 | 
						|
        done
 | 
						|
      fi
 | 
						|
    fi
 | 
						|
  done
 | 
						|
  [[ nm -ne compstate[nmatches] ]] && return 0
 | 
						|
done
 | 
						|
 | 
						|
for descr in "$mesgs[@]"; do
 | 
						|
  _message "$descr"
 | 
						|
done
 | 
						|
 | 
						|
return 1
 |