[libvirt] [PATCHv3 2/6] virsh: Add vshCmdCompleter and vshOptCompleter
Tomas Meszaros
exo at tty.sk
Wed Aug 28 11:42:51 UTC 2013
On 26/08/13 at 11:47am, Eric Blake wrote:
> On 08/26/2013 06:36 AM, Tomas Meszaros wrote:
> > completer and completer_flags added to the _vshCmdDef and _vshCmdOptDef
> > structures so it will be possible for completion generators to
> > conveniently call completer functions with desired flags.
> > ---
> > tools/virsh.h | 7 +++++++
> > 1 file changed, 7 insertions(+)
>
> In isolation, this patch looks reasonable, but I want to see how it gets
> used before acking it.
>
> >
> > diff --git a/tools/virsh.h b/tools/virsh.h
> > index 466ca2d..064acde 100644
> > --- a/tools/virsh.h
> > +++ b/tools/virsh.h
> > @@ -147,6 +147,9 @@ typedef struct _vshCmdOptDef vshCmdOptDef;
> > typedef struct _vshControl vshControl;
> > typedef struct _vshCtrlData vshCtrlData;
> >
> > +typedef char **(*vshCmdCompleter)(unsigned int flags);
> > +typedef char **(*vshOptCompleter)(unsigned int flags);
>
> Do we need two typedefs, or is (*vshCompleter) a sufficient reusable name?
You are right, we don't need two typedefs. I will merge them into
(*vshCompleter) as you are suggesting.
> > +
> > /*
> > * vshCmdInfo -- name/value pair for information about command
> > *
> > @@ -168,6 +171,8 @@ struct _vshCmdOptDef {
> > unsigned int flags; /* flags */
> > const char *help; /* non-NULL help string; or for VSH_OT_ALIAS
> > * the name of a later public option */
> > + vshOptCompleter completer; /* option completer */
> > + unsigned int completer_flags; /* option completer flags */
>
> Per-option completions make sense. For example, 'virsh vol-key --pool
> <TAB>' wants to use a pool completer, while 'virsh vol-key --vol <TAB>'
> wants to use a volume completer; furthermore, 'virsh vol-key <TAB>'
> should be the combination of the option completer (showing --vol and
> --pool) AND the volume completer filtered to names not starting with '-'
> (since virsh has the semantics that arguments are positional, where the
> option '--vol' is implied if the argument that appears in that position
> does not resemble an option).
So If I get it right, you are suggesting that it should work like this:
virsh # vol-key <TAB>
vol1 vol2 pool1 pool2
as you said, combination of --vol and --pool completers.
I was initially thinking that completion should work like this:
virsh # vol-key <TAB>
vol1 vol2
It is completing <vol> first becasue <vol> is only mandatory argument
for this command.
Only if someone type:
virsh # vol-key --pool <TAB>
pool1 pool2
then call --pool completer.
> > };
> >
> > /*
> > @@ -199,6 +204,8 @@ struct _vshCmdDef {
> > const vshCmdOptDef *opts; /* definition of command options */
> > const vshCmdInfo *info; /* details about command */
> > unsigned int flags; /* bitwise OR of VSH_CMD_FLAG */
> > + vshCmdCompleter completer; /* command completer */
> > + unsigned int completer_flags; /* command completer flags */
> > };
>
> I'm not so sure about per-command completers, though. What can a
> command complete differently than per-option completers would already
> provide? Maybe this argues that you need more rationale in the commit
> message about how this will be used. Or maybe I'll figure it out by the
> time I get to the end of your series.
>
> --
> Eric Blake eblake redhat com +1-919-301-3266
> Libvirt virtualization library http://libvirt.org
>
--
Tomas Meszaros
More information about the libvir-list
mailing list