From: Oliver Kiddle <okiddle@yahoo.co.uk>
To: Zsh workers <zsh-workers@sunsite.dk>
Subject: PATCH: new dcop completion
Date: Tue, 15 Apr 2003 19:02:37 +0200 [thread overview]
Message-ID: <11923.1050426157@gmcs3.logica.co.uk> (raw)
I think the latest version adds a dcopquit and options to dcop so I'll
add those at a later point. I'm not too sure about the latter arguments
to dcopstart. The documentation is quite lacking and to even get this far,
I had to look at the source.
Oliver
#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
reply other threads:[~2003-04-15 17:03 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=11923.1050426157@gmcs3.logica.co.uk \
--to=okiddle@yahoo.co.uk \
--cc=zsh-workers@sunsite.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).