mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 18:10:56 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			120 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #autoload
 | |
| 
 | |
| # This can be used to add options or values with descriptions as matches.
 | |
| 
 | |
| local _opt _expl _tmpm _tmpd _mlen
 | |
| local _type=values _descr _ret=1 _showd _nm _hide _args _grp _sep
 | |
| local csl="$compstate[list]" csl2
 | |
| local _oargv _argv _new _strs _mats _opts _i _try=0
 | |
| 
 | |
| # Get the option.
 | |
| 
 | |
| if [[ "$1" = -o ]]; then
 | |
|   _type=options
 | |
|   shift
 | |
| elif [[ "$1" = -t ]]; then
 | |
|   _type="$2"
 | |
|   shift 2
 | |
| elif [[ "$1" = -t* ]]; then
 | |
|   _type="${1[3,-1]}"
 | |
|   shift
 | |
| fi
 | |
| 
 | |
| # Do the tests. `showd' is set if the descriptions should be shown.
 | |
| 
 | |
| zstyle -T ":completion:${curcontext}:$_type" verbose && _showd=yes
 | |
| 
 | |
| zstyle -s ":completion:${curcontext}:$_type" list-separator _sep || _sep=--
 | |
| zstyle -s ":completion:${curcontext}:$_type" max-matches-width _mlen ||
 | |
|     _mlen=$((COLUMNS/2))
 | |
| 
 | |
| _descr="$1"
 | |
| shift
 | |
| 
 | |
| if [[ -n "$_showd" ]] &&
 | |
|    zstyle -T ":completion:${curcontext}:$_type" list-grouped; then
 | |
|   _oargv=( "$@" )
 | |
|   _grp=(-g)
 | |
| else
 | |
|   _grp=()
 | |
| fi
 | |
| 
 | |
| [[ "$_type" = options ]] &&
 | |
|     zstyle -t ":completion:${curcontext}:options" prefix-hidden &&
 | |
|         _hide="${(M)PREFIX##(--|[-+])}"
 | |
| 
 | |
| _tags "$_type"
 | |
| while _tags; do
 | |
|   while _next_label "$_type" _expl "$_descr"; do
 | |
| 
 | |
|     if (( $#_grp )); then
 | |
|   
 | |
|       set -- "$_oargv[@]"
 | |
|       _argv=( "$_oargv[@]" )
 | |
|       _i=1
 | |
|       (( _try++ ))
 | |
|       while (( $# )); do
 | |
|     
 | |
|         _strs="_a_$_try$_i"
 | |
|         if [[ "$1" = \(*\) ]]; then
 | |
|           eval local "_a_$_try$_i;_a_$_try$_i"'='$1
 | |
|         else
 | |
|           eval local "_a_$_try$_i;_a_$_try$_i"'=( "${'$1'[@]}" )'
 | |
|         fi
 | |
|         _argv[_i]="_a_$_try$_i"
 | |
|         shift
 | |
|         (( _i++ ))
 | |
|     
 | |
|         if [[ "$1" = (|-*) ]]; then
 | |
|           _mats=
 | |
|         else
 | |
|           _mats="_a_$_try$_i"
 | |
|           if [[ "$1" = \(*\) ]]; then
 | |
|             eval local "_a_$_try$_i;_a_$_try$_i"'='$1
 | |
|           else
 | |
|             eval local "_a_$_try$_i;_a_$_try$_i"'=( "${'$1'[@]}" )'
 | |
|           fi
 | |
|           _argv[_i]="_a_$_try$_i"
 | |
|           shift
 | |
|           (( _i++ ))
 | |
|         fi
 | |
|     
 | |
|         _opts=( "${(@)argv[1,(i)--]:#--}" )
 | |
|         shift "$#_opts"
 | |
|         (( _i += $#_opts ))
 | |
|         if [[ $1 == -- ]]; then
 | |
|           shift
 | |
|           (( _i++ ))
 | |
|         fi
 | |
|     
 | |
|         if [[ -n $_mats ]]; then
 | |
|           compadd "$_opts[@]" "${(@)_expl:/-J/-2V}" -D $_strs - \
 | |
|                   "${(@M)${(@P)_mats}##([^:\\]|\\?)##}"
 | |
|         else
 | |
|           compadd "$_opts[@]" "${(@)_expl:/-J/-2V}" -D $_strs - \
 | |
|                   "${(@M)${(@P)_strs}##([^:\\]|\\?)##}"
 | |
|         fi
 | |
|       done
 | |
|       set - "$_argv[@]"
 | |
|     fi
 | |
| 
 | |
|     if [[ -n "$_showd" ]]; then
 | |
|       compdescribe -I "$_hide" "$_mlen" "$_sep " _expl "$_grp[@]" "$@"
 | |
|     else
 | |
|       compdescribe -i "$_hide" "$_mlen" "$@"
 | |
|     fi
 | |
| 
 | |
|     compstate[list]="$csl"
 | |
| 
 | |
|     while compdescribe -g csl2 _args _tmpm _tmpd; do
 | |
| 
 | |
|       compstate[list]="$csl $csl2"
 | |
|       [[ -n "$csl2" ]] && compstate[list]="${compstate[list]:s/rows//}"
 | |
| 
 | |
|       compadd "$_args[@]" -d _tmpd -a _tmpm && _ret=0
 | |
|     done
 | |
|   done
 | |
|   (( _ret )) || return 0
 | |
| done
 | |
| 
 | |
| return 1
 |