That is, if you have command-based custom generators, then each command
has to repeat parsing functionality, then call back to common list
generators; whereas if you have option-based custom generators, then you
have fewer callbacks because all the smarts are tied to well-typed
options, and after all, it is the type of each option that determines
which list to generate, more than the type of the command that includes
the option.

I was thinking about same feature and started to work on it during this
weekend. But I ran into a problem. Basically, what I intended to
implement, is:
1.) expand struct vshCmdDef for a char *(*callback) (const char *text,
int state). But for real benefit, we need connection object, so we could
e.g. list only inactive networks for 'net-start' command. And this is
the problem, because we would have to make this object global (since
readline functions does not allow passing any opaque value).

As gross as it is, a global object isn't entirely bad - virsh is
single-threaded. And even if we want to make virsh threaded at some
point, I still think we can get away with adding a thread-local access
scheme.

2.) expand each command definition with its own completer. So e.g. for
start commands we could only list inactive domains, networks, pools,
whatever. For destroy only active objects. And so on.

So maybe we want both - an option-based completer that generates the
initial list, and a command-based completer that can then prune out
irrelevant options?

Well, I would say that is the highest goal to be achieved. Although that
implies parsing during options generation.
But I don't think I get it. Option-based completer generates list for
given option, command-based completer generates list for given command
(entries from this list are options). Take detach-interface for
instance. This have some options:
--mac: here we want option-based completer to list mac addresses of a
NICs of a domain specified by
--domain: since this could be left out we want here command-base
completer to either list all domains, or list only those domains which
have a NIC.
So then we get:
# detach-interface<TAB><TAB>
--mac --persistent domain1 domain2
# detach-interface domain1 --mac<TAB><TAB>
00:11:22:33:44:55 01:23:45:67:89
My point is - I can't see any pruning here. But maybe I've chosen wrong
example. However, this example shows we need both types of completer.
Michal

Hi, All
Are their any progress now?
Thanks,
Lai

Unfortunately no. I've got distracted by other stuff (like QoS). But I
agree it is feature which will increase user friendliness of virsh. No
doubt about it. That's why I started to work on it. I hate typing whole
names, if it is obvious which one I mean.