views:

42

answers:

1

Zsh completion is a rather complex beast, and I find the man-page very difficult to read, especially it's missing (simple) examples of all the various optspec forms etc. I haven't managed to find anything online myself yet so help would be most appreciated.

As an example here's what I'm struggling with at the moment, and the zshcompsys man-page doesn't offer any clarifications. I have

#compdef mtt2

_arguments -s : \
    '-h' '--help' \
    '-V' '--version' \
    ':foobars:(foo bar baz)'

Now, when I type mtt2 <TAB> I'm only offered foo, bar and baz as completions, why not -h, --help, etc, as well? What magic do I need to pass to _arguments in order to be offered all possibilities?

+1  A: 

You need to start argument that you complete with dash (I mean that argument that you type to test, not _arguments argument). You should either look at zstyle, try to pass -h and others just like :foobars: or even directly use compadd. Examples:

  1. Directly using compadd:
    #compdef test
    A=( -h --help -V --version foo bar baz )
    compadd -a A
    
  2. Passing -h and others just like :foobars::
    #compdef test
    A=( -h --help -V --version )
    _arguments \
        - foobars \
        ':foobars:(foo bar baz)' \
        - options \
        ":arguments:($A)"
    
    or
    A=( -h --help -V --version foo bar baz )
    _arguments \
        ":::($A)"
    
  3. zstyle controls completion style. It is described in «COMPLETION SYSTEM CONFIGURATION» section in man zshcompsys and probably has an option that will enable completing of switches, but I do not know which option controls that.
ZyX
Do you have an example that I can take a look at, so I stand a chance of understanding what you are saying? ;-)
Magnus
I assume this means that adding descriptions to the different options (-h, -V, ...) becomes difficult, is that correct?
Magnus
@Magnus, Adding descriptions with `compadd` is probably simpler, but in this examples it is not too difficult. You will face problems when you will try to provide a way to specify more then one switch and an argument at one time.
ZyX