zsh-workers
 help / color / mirror / code / Atom feed
From: David Remahl <david@ittpoi.com>
To: Oliver Kiddle <okiddle@yahoo.co.uk>
Cc: zsh-workers@sunsite.dk
Subject: Re: Complicated Completions
Date: Thu, 28 Aug 2003 21:50:02 +0200	[thread overview]
Message-ID: <D0124136-D990-11D7-AC81-0003930A2D56@ittpoi.com> (raw)
In-Reply-To: <20424.1061889099@gmcs3.local>

Thanks for your help!

I've now gotten started on something that I hope will work out...But  
why doesn't this work? I have only written a small part of the  
completion, for just the attach subcommand (verb). Try this:

type: hdiutil attach abc.dmg <tab>

Why doesn't it show the three switches -quiet, -debug and -verbose?

/ rgds, David Remahl

#compdef hdiutil

local opts args hdiverbs

_hdiutil_verbs ()
{
   local -a commands
   verbs=(
     {attach,mount}':attach (mount) an image'
     {detach,eject}':detach (eject) an image'
     'create:create a new image'
     'verify:verify image integrity'
     'convert:convert an image from one format to another'
     'burn:burn an image to optical media'
     'help:get help help on usage'
     'info:get information about an driver or mounted image'
     'load:manually load the image driver'
     'checksum:calculate image checksum'
     'flatten:flatten dual-fork image to single-fork'
     'unflatten:unflatten single-fork image to dual fork'
     'imageinfo:print information about an image file'
     'mountvol:mount a /dev node using disk arbitration'
     'unmount:unmount a mounted volume'
     'plugins:print information about plugins'
     'internet-enable:enable postprocessing for an image'
     'resize:attempt to resize HFS+ filesystem on UDIF image'
     'segment:segment NDIF or UDIF image'
     'partition:unknown verb'
     'makehybrid:create a hybrid version of an image'
     'pmap:display partition map from image or device'
     'compact:compact is undocumented'
     'fsid:fsid is undocumented'
     'chpass:chpass is undocumented'
   )
   _describe -t commands 'hdiutil verb' verbs
}

if (( CURRENT == 2 )); then
     _hdiutil_verbs
else
     local -a commonargs
     alwaysargs=(
       '(-quiet -debug)-verbose'
       '(-verbose -debug)-quiet'
       '(-quiet -verbose)-debug'
     )
     cmd="$words[2]"
     curcontext="${curcontext%:*:*}:xauth-${cmd}:"
     case "$cmd" in
         # sub-commands with no args
         help)
             _message 'no more arguments'
             ;;
	# sub-commands with image argument
	attach)
             if (( CURRENT == 3 )); then
                 _arguments \
                     '2:disk image file:_files -g  
"*.(dmg|img|smi|dmgz)"' && ret=0
             else
                 case "$cmd" in
                     attach)
                          _arguments \
                              '(-quiet -debug)-verbose'
                              '(-verbose -debug)-quiet'
                              '(-quiet -verbose)-debug' && ret=0
                          ;;
                 esac
             fi
	    ;;
     esac
fi


On den 26 augusti 2003, at 11:11:39AM, Oliver Kiddle wrote:

> David Remahl wrote:
>
>> I have spent some time trying to get to know the completion system. My
>> aim is to create completion functions for some of the useful and
>> surprisingly well-documented command line tools specific to Mac OS X
>> (hdiutil, diskutil, defaults, SystemStarter, ditto to mention a few).
>
> Sounds good.
>
>> The thing is, some of them use rather peculiar and complex command  
>> line
>> syntaxes, so creating useful completions is quite a challenge.
>
> There's a few other commands that follow a similar scheme. _sccs might
> be a better example than _ifconfig. Also worth looking at are _xauth
> and _cdcd which are simpler and _cvs which is more complicated.
>
>> I will begin by describing the command line syntax of hdiutil, using
>> snippets from the man page.
>>
>> SYNOPSIS
>>       hdiutil verb [options]
>
> Can any options appear between hdiutil and the verb? If so, begin with
> an _arguments for those options finishing with a '*:: :->verbs' rule to
> complete the sub commands in a state.
>
>> Verb is one of the following:
>> 	attach, detach, verify, create, convert, burn, help, info, load,
>> checksum, eject (synonym for detach), flatten, unflatten, imageinfo,
>> mount (synonym for attach), mountvol, unmount, plugins,
>> internet-enable, resize, segment, partition, makehybrid, pmap
>
> Just completing those should be straight-forward. If you can use
> _describe to give descriptions for them, that is better. For the
> synonyms, give them the same description, e.g:
>   {eject,detach}':description'
> in zsh 4.1, they will then be grouped together.
>
> What does the help verb output? You might be able to parse this to get
> descriptions. If you get a recent _cvs from CVS, it does this.
>
> Then follow the pattern of one of the examples:
>   service="$words[1]"
>   curcontext="${curcontext%:*}-$service:"
>
> This puts the verb into $service and into the zstyle context (so you
> will have, e.g. hdiutil-attach in the command part of the zstyle
> context). Then, just have a case statement for each possible verb:
>   case $service in
>     attach)
>       ...
>
>> The set of allowed options depends on the sub command (verb). All  
>> verbs
>> accept the following optional options (duh), all mutually exclusive:
>> 	-verbose
>> 	-quiet
>> 	-debug
>
> Stick the _arguments specifcations for them in an array at the
> beginning and include the array in all later calls to _arguments. e.g:
>
>   args=(
>     '(-quiet -debug)-verbose'
>     '(-verbose -debug)-quiet'
>     '(-quiet -verbose)-debug'
>   )
>
> then later, _arguments "$args[@]" \
> The lists in parenthesis at the start of the specifications specifies
> that they are mutually exclusive.
>
>> Many verbs accept these options:
>> 	-plist
>> 	-srcimagekey <key>=<value>
>> 	-tgtimagekey <key>=<value>
>> 	-encryption [crypto method]
>> 	-stdinpass
>> 	-passphrase password
>> 	-shadow [shadow file]
>
> Again, put the specifications for those options in an array and use the
> array with those sub-commands that need them.
>
>> Many verbs take additional options that are specific to that verb. For
>> example, convert takes the following additional arguments / options:
>> Required:
>
> Specify these options in each branch of the case statement.
>
>> Several commands
>> (attach|verify|compact|convert|burn|checksum|chpass|*flatten|fsid|imag 
>> e-
>> info|internet-enable|resize|segment|partition|pmap) take exactly one
>> filename argument - of a .dmg file. That corresponds to imagefile in
>> teh above convert example.
>
> So they need an _arguments specification that looks like:
>   '1:file:_files -g "*.dmg"'
>
> Hope that helps
>
> Oliver
>


  reply	other threads:[~2003-08-28 19:50 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-08-26  0:18 David Remahl
2003-08-26  9:11 ` Oliver Kiddle
2003-08-28 19:50   ` David Remahl [this message]
2003-08-29  9:27     ` Oliver Kiddle

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=D0124136-D990-11D7-AC81-0003930A2D56@ittpoi.com \
    --to=david@ittpoi.com \
    --cc=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).