1
0
mirror of git://git.code.sf.net/p/zsh/code synced 2024-09-29 07:21:58 +02:00
zsh/Completion/X/Command/_dcop
2003-04-15 17:06:45 +00:00

120 lines
2.9 KiB
Plaintext

#compdef dcop dcopstart dcopfind dcopref dcopclient dcopobject
local curcontext="$curcontext" desc vals arg base max=0 ret=1
local app obj fun
local -a state line expl
case $service in
dcop(client|object))
state=( dcopref )
max=2
;;
dcopref) max=3 ;;
dcopstart)
if (( CURRENT > 2 )); then
_urls && return
fi
;;
dcopfind)
local cmd=$words[1]
_arguments -C \
'-a[print application id instead of DCOPRef]' \
'-l[if object not found, run dcopstart and retry]' \
'*::args:->args' && ret=0
unset state
words=( $cmd $words )
(( CURRENT++ ))
;;
esac
if (( max && CURRENT > max )); then
_message 'no more arguments'
return 1
fi
if [[ -z "$state" ]]; then
state=(application object function)
[[ $words[2] = DCOPRef* && CURRENT -ne 2 ]]
base=$?
state=( ${state[CURRENT-base]:-arg} )
[[ $state[1] = application && $service = dcop(|find) ]] && state+=( dcopref )
fi
while (( $#state )); do
unset app obj fun
if [[ $words[2] = (#b)DCOPRef*\(([^,]#)((#e)|,)([^\\\)]#)(*) ]]; then
if [[ -n $match[2] ]]; then
app=$match[1]
if [[ -n $match[4] ]]; then
obj=$match[3]
[[ -n $words[3] && CURRENT -gt 3 ]] && fun=$words[3]
fi
fi
else
case $CURRENT in
<5->) fun="$words[4]" ;&
4) obj="$words[3]" ;&
3) app="$words[2]" ;;
esac
fi
vals=( ${(f)"$(_call_program dcop-$state[1]s ${(M)words[1]##*/}dcop $app $obj 2>/dev/null)"} )
case "$state[1]" in
application|object)
[[ -n ${(M)vals:#*\(default\)} ]] && vals+=( default )
_wanted dcop-$state[1]s expl $state[1] compadd "$@" - ${vals% \(default\)} && ret=0
;;
function)
[[ $service = dcopfind ]] && vals=( ${(M)vals:#bool *} )
_wanted dcop-$state[1]s expl $state[1] compadd "$@" - ${${vals#* }%\(*} && ret=0
;;
arg)
arg=${${${(M)vals:#*$fun\(*}#*\(}%\)*},
arg=${${(s.,.)arg}[CURRENT-base-3]}
if [[ -n $arg ]]; then
if [[ $arg = (Q(|C)String|*int )* || $arg != *\ * ]]; then
# don't mention the argument's type
desc="${arg##* }"
else
desc="${arg##* } (${arg% *})"
fi
case $arg in
bool*) _wanted argument expl "$desc" compadd true false && return ;;
(#i)*(file|path|dir)*) _wanted argument expl "$desc" _files && return ;;
(#i)*url*) _wanted argument expl "$desc" _urls && return ;;
*) _message -e argument "$desc" ;;
esac
else
_message 'no more arguments'
fi
;;
dcopref)
if ! compset -P '*\('; then
_wanted dcoprefs expl 'dcop ref' compadd -S '' 'DCOPRef(' && ret=0
elif compset -P '*,'; then
if compset -S '(|\\)\)*'; then
set -- -S '' "$@"
else
set -- "$@" -S"${${QIPREFIX:+)}:-\)}$compstate[quote] "
fi
state+=( object )
else
if compset -S ',*'; then
set -- "$@" -S ''
else
set -- "$@" -S ,
fi
state+=( application )
fi
;;
esac
shift state
done
return ret