Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Having a tough time setting up completion.

On 15 December 2011 23:06, Larry Schrof <larrys@xxxxxx> wrote:
> I've spent a lot to time studying the zshcompsys man page (the docs for _arguments specifically), but I"m still having a tough time specifying the syntax to do the following completion.
> I have a command called foo. This command takes exactly one of three forms:
> foo  -x  <exactly-one-of-fifty-strings>
> foo --longword <exactly-one-of-fifty-strings>
> foo <exactly-one-of-fifty-strings>
> -x is a single-letter option, --longword is a double-dashed GNU-style long option. (These two options are synonymous.) Of these two options, either zero or exactly one of them should appear. IF one of them appears, it must appear immediately after foo (separated from foo, of course, by whitespace).
> In all cases, <exactly-one-of-fifty-strings> is a single (non-leading-dash) word. As soon as this word is entered or completed, no other word from the (really large) set should appear on the command line.
> If anyone can offer a general outline as to how I can use _arguments to implement this, that would be great. I need to manually enter in all fifty words at some point, and make them mutually exclusive. Will be interesting to see how to do that. Thanks!

I'm not sure if I should be happy or sad I got this on the first try
without even using backspace, without looking anything up, and it
worked (all on one line if gmail breaks it):

compdef '_arguments ''(-x --longword)''{-x,--longword}''[something]''
''1:fiftystrings:(one two three and so forth fifty)''' foo

(i use rcquotes so you want '\'' instead of '', or more likely,
putting the whole quoted string in a regular completer.)
If you want to give a description for each words, use double parens
instead and separate desc with :, as
...:fiftystrings:((one:a\ description\ of\ one two:...

Mikael Magnusson

Messages sorted by: Reverse Date, Date, Thread, Author