auto completion in zsh on 3rd parameter

autocomplete, zsh

Solution

Things to read.

Here is a blog post discussing the Z-Shell Completion System.

For a slightly more in-depth discussion, read this unix.stackexchange answer.

And, as always, read the man pages!.

Edit: Forgot to add: `echo $fpath` will show you the function path that `zsh` uses. On OSX, I have: `/usr/local/share/zsh/4.3.17/functions`, (location may vary for you), which contains all the ZSH completion functions. Have a look at `_ssh`, `_ls`, `_tar` etc - they're all there, and they all have lots of nifty features you can learn from.

Addressing the question: the direction you should go.

What you're asking is achievable, though. There are several steps.

You need to write a z-shell completion function. It needs to be located on the `fpath`; the function-path that `zsh` uses for it's completion system functions. (If it's a small function, putting it into `~/.zshrc` will also work, but isn't recommended).

You want completion on the 3rd parameter. To do that, your function would look something like the following:

_arguments "3:<MENU>:<COMPLETION>"

`<MENU>` is the menu description, which you'll see if you've enabled the menu descriptions. (That's done using `zstyle`; read the man pages, or the linked pages, for more information). `<COMPLETION>` is the things that you can complete with. For example, if you used:

_arguments "3::(Foo Bar)"

when you ran your script and pressed `<TAB>`, you'd have the option of either `Foo` or `Bar`. [NOTE: There is no `<MENU>` in that example. If you don't want a menu descriptor, you can omit it as shown].

You want completion on `*.tar` files. You can call `_files` to do that:

_files -g \*.tar

Show usage on first parameter: that'd be a completion with no arguments (ie, argument 1). I'm not sure why you'd want completion on only the third option but not the first two (typical usage descriptions), so I don't know how to answer this. If your script is supposed to be used like this: `script foo bar FILE.tar`, wouldn't you want to complete the `foo` and `bar` arguments as well? Perhaps a better solution would be displaying the usage when the script is run without parameters.

Full script would look something like the following:

#compdef myscript

_arguments "3:tar files:_files -g \*.tar"

Problem

I have a shell script it's usage is: ``` foo.sh <name> <type> <*.tar.gz> ``` I want to setup a complete on 3rd parameter only. If I press on 1st parameter, just show the usage. Could I use zsh's zshcomp to do this job? for example: ``` foo.sh <tab> # display usage foo.sh a b <tab> # show files match with *.tar.gz ``` Is there similar script which I could follow?

Original source