Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

zsh support, including option descriptions #10

Closed
nickl- opened this issue Dec 25, 2012 · 24 comments
Closed

zsh support, including option descriptions #10

nickl- opened this issue Dec 25, 2012 · 24 comments

Comments

@nickl-
Copy link
Contributor

nickl- commented Dec 25, 2012

Let me start by saying well done with all the improvements since v2.9 the README looks awesome I must make a point to look at the docs... but who reads manuals anyway? =)

Being the devils advocate again, even though I am well aware that the project clearly states BASH completion I know there are many who use zsh for whatever reasons unbeknown to myself, your friendly devil and scope-boundary-shifter extraordinaire.

From what I can source the differences are not that huge but I am not well versed on things that make you go Oh My at all, maybe someone with such astonishment afflictions would care to step up and explain yourselves or just enlighten us on the peculiarities of zsh completion as both would be fascinating to hear.

What I can add: There is something called bashcompinit as explained in man zshcompsys and reads as follows:

The function bashcompinit compatibility with bash's programmable completion system. When run it will define the functions, compgen and complete which correspond to the bash builtins with the same names. It will then be possible to use completion specifications and functions written for bash.

Would that suggest our work is done here or do we need something other (zstyle, compctl, worshiping of false devils perhaps)? None of which would make me jump with joy, being a jealous devil and all, just thought I'd stir the pot and see what's cooking.

nJoy!

@kislyuk
Copy link
Owner

kislyuk commented Dec 25, 2012

I don't really care about zsh, but it is within the scope of this package and it's certainly #2 on the list of shells to support.

Does bashcompinit support complete -D?

@nickl-
Copy link
Contributor Author

nickl- commented Dec 26, 2012

I do not have the foggiest - merely mentioned what I found on google as a starting point but I won't be much more use I am afraid. Had zsh support in aero before I yanked the custom implementation in favour of supporting argcomplete instead, for the greater good and all that. Would be nice to get it back but I won't be loosing any sleep over it just yet.

Anyone we can pass this ball to?

@myint
Copy link
Contributor

myint commented Jun 13, 2013

I tested bashcompinit out of curiousity. It works.

$ autoload bashcompinit
$ bashcompinit
$ autoload compinit
$ compinit
$ eval "$(register-python-argcomplete docformatter)"
$ docformatter -<tab>
--help                 --recursive            -h
--in-place             --version              -i
--no-blank             --wrap-descriptions    -r
--pre-summary-newline  --wrap-summaries

@kislyuk
Copy link
Owner

kislyuk commented Jun 13, 2013

Glad to hear that! If you want, you can write a test suite and add it to tests (please configure it to only run if zsh and bashcompinit are found).

@redstreet
Copy link
Contributor

While argcomplete does indeed run fine on zsh, zsh's auto-complete is far more advanced. argcomplete doesn't take advantage of any of this. Here are two example features that I'd love to see argcomplete handle:

  1. mini-documentation: zsh is capable of listing each possible argument with a mini documentation about it. When I type "git /tab/", I get:
add                 -- add paths to the index
am                  -- apply patches from a mailbox (cooler than applymbox)
annotate            -- annotate file lines with commit info
  1. aliases: zsh is aware of aliases. For example, it can be told that '-h' is the same as '--help', and will display both of them on the same line, and won't show the --help if -h is already typed (and vice versa). In addition, for the mini-doc display, it will display them on the same line. For example, if I type "p4 /tab/", I get:
changelist    change   -- Create or edit a changelist description                                                                                                                                                        

They're shown together because "change" is an alias of the "changelist" subcommand.

Since argcomplete has all the necessary info to implement both these features, I'd strongly vote for doing this as a feature request. If I get around to doing it, I'll submit a patch. Meanwhile, thanks for argcomplete, it's awesome!

@kislyuk
Copy link
Owner

kislyuk commented Aug 22, 2013

Sounds great, I'm not a big zsh user and don't have a lot of time for this, but I'd love to see this.

@nickl-
Copy link
Contributor Author

nickl- commented Sep 18, 2013

I found the commit that yanked out the custom autocomplete which worked for zsh as well, and got replaced by argcomplete. Aeronautics/aero@06de51e6c5d and this was the eval code Aeronautics/aero@5ec10de5057 which did the magic.

Along the lines of:

function _aero_completion {
  local words cword
  read -Ac words
  read -cn cword
  reply=( $( COMP_WORDS="$words[*]" \\
             COMP_CWORD=$(( cword-1 )) \\
             AERO_AUTO_COMPLETE=1 $words[1] ) )
}
compctl -K _aero_completion aero

Does that shed any lights in the otherwise dark tunnel?

@redstreet
Copy link
Contributor

The current bash autocomplete works fine in zsh, since zsh can accept bash autocomplete scripts. However, this doesn't use the much more advanced features for autocomplete that zsh has. Taking advantage of these features would likely require a bunch of new code (i.e., it's not a simple fix, it requires some design and development).

@tony
Copy link
Contributor

tony commented Oct 26, 2013

@redstreet @nickl- @kislyuk

Another example from aws-cli, which uses a wrapper similar to the one mentioned by @nickl- in Aero.

aws-cli approach to wrapping zsh: https://github.com/aws/aws-cli/blob/develop/bin/aws_zsh_completer.sh

$ source bin/aws_zsh_completer.sh

Related: tcsh on #49

@kislyuk
Copy link
Owner

kislyuk commented Oct 27, 2013

@tony, thanks for the pointer to https://github.com/aws/aws-cli/blob/develop/bin/aws_zsh_completer.sh, there's some interesting/crazy code in there.

Does zsh have a convention for installing completion hooks globally or per user? And is anyone interested in finding out what should be done to make use of the advanced features that @redstreet is referring to?

@redstreet
Copy link
Contributor

As I mentioned earlier, the current bash autocomplete that argcomplete does works fine in zsh, since zsh can accept bash autocomplete scripts. The code at https://github.com/aws/aws-cli/blob/develop/bin/aws_zsh_completer.sh seems to help with getting this to work better, but doesn't use the advanced zsh autocompletion features themselves.

Here's an example of one of the features: showing brief descriptions next to parameters or subcommands:
http://joshparnham.com/2012/10/nanoc-plus-zsh-equals-awesomeness/

I've written small zsh autcomplete scripts, and I'd be happy to work on this, but won't have the time in the near future. If anyone is interested, here's a very basic tutorial to get you started:
http://askql.wordpress.com/2011/01/11/zsh-writing-own-completion/

@kislyuk kislyuk changed the title Devils advocate: "So what about... zsh completion?" zsh support, including option descriptions Apr 19, 2014
@anntzer
Copy link

anntzer commented May 28, 2014

Does argcomplete currently support global installation with zsh? I haven't managed to get it to work (while it works fine with zsh), and I don't think this is clearly specified in the docs.

@kislyuk
Copy link
Owner

kislyuk commented May 30, 2014

I don't use zsh, so I don't have a clear idea of what level of compatibility its bash completion compatibility layer provides. From the zsh documentation, it seems like this should work:

autoload bashcompinit
bashcompinit
source argcomplete/bash_completion.d/python-argcomplete.sh

But cursory testing shows that it's not working.

@anntzer
Copy link

anntzer commented May 31, 2014

Yes, that is what I tried. I understand fixing this is not a priority for you but can you please document this limitation?

@kislyuk
Copy link
Owner

kislyuk commented Jun 7, 2014

In b38c1aa.

@sotte
Copy link

sotte commented Nov 10, 2014

👍 for zsh support.

@kislyuk
Copy link
Owner

kislyuk commented Nov 10, 2014

Pull requests are welcome. I would love to add it, but I don't use zsh on a daily basis and don't currently have the time to write this. Need a zsh expert to take a look.

@yac
Copy link

yac commented May 13, 2015

FYI: I tested with zsh's bashcompinit and it indeed seems to work fine.

As already stated, bash completion is overly simple (read: crap) and using zsh native completion would yield much better results... However, supporting multiple output formats in a code that was written with only one in mind sounds like more work than I'm willing to do. But a man can dream, right? :)

@segevfiner
Copy link
Contributor

segevfiner commented Jan 17, 2018

If completion doesn't work for you using bashcompinit, note zsh-users/zsh@e2f793e which I had to apply to my system's bashcompinit to get this to work.

@atyshka
Copy link

atyshka commented Dec 23, 2019

Will global support work in zsh the same way it does in bash? I.e. not having to individually register files? The portion of the README addressing zsh only describes the individual file method.

@dan1994
Copy link

dan1994 commented May 20, 2020

When switching to zsh and finding out that argcomplete is not fully compatible (via this issue), I decided to try my hand at writing my own solution to this problem.
I have just released my first version of it, and thought to share for all of the people who'll reach this thread like I did.
The project is called pyzshcomplete and can be found here.
Any feedback would be highly appreciated.

@kislyuk
Copy link
Owner

kislyuk commented Mar 19, 2023

argcomplete now supports zsh directly (without the bashcompinit compatibility layer) in the develop branch.

The practical impact of this support is currently limited to emitting description strings in zsh, but by directly emitting completions to zsh instead of using the bash compatibility layer, we have unlocked the potential for using other, fancier zsh features as well.

Global completion is not supported yet (I am still looking into how to support it in zsh), so commands have to be individually registered with register-python-argcomplete.

I will be releasing this functionality in a new release shortly.

@kislyuk
Copy link
Owner

kislyuk commented Mar 19, 2023

OK, I was able to activate global completion for zsh using compdef _python_argcomplete_global -P '*', so zsh is now fully and officially supported by argcomplete.

@kislyuk
Copy link
Owner

kislyuk commented Mar 19, 2023

Released in v3.0.0.

@kislyuk kislyuk closed this as completed Mar 19, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests