On 07/04/2011 02:41 AM, Michal Privoznik wrote: > This commit introduces command-based completer. Any command can now have > a completer, which will generate additional command arguments. Completer > is called repeatedly until it returns NULL. On the first call, @state is > non-zero. Don't you mean that on the first call, state is 0, and on subsequent calls, it is 1? > --- > tools/virsh.c | 364 ++++++++++++++++++++++++++++++--------------------------- > 1 files changed, 193 insertions(+), 171 deletions(-) > > diff --git a/tools/virsh.c b/tools/virsh.c > index eeacec3..3dabb10 100644 > --- a/tools/virsh.c > +++ b/tools/virsh.c > @@ -202,6 +202,7 @@ typedef struct { > const vshCmdOptDef *opts; /* definition of command options */ > const vshCmdInfo *info; /* details about command */ > int flags; /* bitwise OR of VSH_CMD_FLAG */ > + char * (*completer) (const char *, int); /* command completer */ > } vshCmdDef; I'm still not convinced that this is the best approach. Let's look at patch 3/4, where one of the commands you changed was virsh attach-device, to use the listAllDomains completer: > {"attach-device", cmdAttachDevice, opts_attach_device, > - info_attach_device, 0, NULL}, > + info_attach_device, 0, complt_listAllDomains}, But attach-device has this synopsis: attach-device <domain> <file> [--persistent] That means, if I type: attach-device d<TAB> I get a list of all domains starting with d. But if I type: attach-device domain f<TAB> I would _still_ get a list of all domains starting with f, when what I _really_ want at that point is a list of a files in the current directory starting with f. Furthermore, if I type: attach-device -<TAB> I do _not_ get any indication that --domain, --file, or --persistent are also valid things to type at that point in the command, rather, it tries to give me a list of all domains starting with '-', even though to actually use such a domain, I would have to type an extra '--': attach-device -- -odd-domain Whereas if you go with my suggestion of having typed parameters, then attach-device does _not_ need a custom completer. Rather, it marks that the 'domain' option is a VSH_OT_DOMAIN_ALL, and the 'file' option is a VSH_OT_FILE. Then, attach-device d<TAB> says that since the argument does not start with '-', it must be the first data argument - and that data argument is typed VSH_OT_DOMAIN_ALL, so call complt_listDomainsFlags to get that list. Likewise, attach-device domain f<TAB> says that since we have already parsed an argument, the next argument must belong to the 'file' option, and we can use the normal readline file completion hook. Meanwhile, attach-device -<TAB> can see that the only valid thing here is an option name, and can thus cycle through the valid remaining options, to return the list '--domain', '--file', '--persistent'. And putting it all together, attach-device <TAB> can output the merged list of '--domain', '--file', '--persistent', as well as all domain names except for those that begin with '-'. At this point, I'm not seeing any utility in a per-function completer, when compared to a more generic utility in a per-option completer. -- Eric Blake eblake@xxxxxxxxxx +1-801-349-2682 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list