You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Better completions for repos, issues, PRs, etc. in commands #360
Editing to clarify for people who come upon this issue that:
Shell completion of commands is already supported in gh
This issue is about shell completion for particular GitHub objects (for example, easily cycling through possible PRs to checkout or view)
Original issue content:
It would be great to have completions for different shell environments. Not only for commands, but, for example, cycling through open pull request when checking out a PR branch or something like that.
This is standard behaviour when using (recent) spf13/cobra! (This may not actually be true. gh seems to follow the standard form that cobra itself uses, but appears to have been implemented specifically.)
Reacted by Dominic Davis-Foster
Reacted by Kevin Anantha, Jamie Rolfs, Florian Imdahl, Benjamin Wuethrich, Ilya Suzdalnitskiy and Brian Thompson
This should already work with Homebrew. When installing I get the following notification:
==> Caveats
Bash completion has been installed to:
/usr/local/etc/bash_completion.d
zsh completions have been installed to:
/usr/local/share/zsh/site-functions
This is standard behaviour when using (recent) spf13/cobra
I know about them, but those completions work only for subcommands and flags names. What I want is something like git completions, where you can, for example, select files to add to commit from completions. Or select the branch to checkout in the same way. Something more intelligent overall.
Reacted by Brian Thompson, Dominic Davis-Foster, Bartek Pacia and Johan Walles
I know about them, but those completions work only for subcommands and flags names.
Sure, I misunderstood what you meant by 'Not only for commands' at first: that you were unaware that command completion already existed. I've tried to edit my reply to acknowledge that. Hopefully the discussion helps people when looking for 'standard' completion, and that I haven't diluted the discussion about the other context-aware completions - I agree, git style completions for PRs / branches etc would be really useful!
Would it be possible to show the availability of the gh completion subcommand in gh help? I tend to forget the specific syntax and have to search for this issue again then.
So anyone following this: i moved the completion to carapace-bin.
Not much difference other than that the completion is provided by a separate binary.
This simply means that whenever you invoke completion for gh with <TAB> it is executed with the current command line instead of gh (you can try this out by calling it directly carapace gh elvish _ gh issue view '').
Cache is written to {os.TempDir()}/carapace (e.g. /tmp/carapace).
Did a couple of tests and so far seems to work alright, but there might be some minor issues with different environments.
So if you want to try it out either grab the release and source the completion for gh:
just a note @rsteube; I couldn't get the above to work with fish autocompletions using the method of registering suggested:
# fish (~/.config/fish/config.fish)
gh_completer _carapace |source
instead, I had to put the output in a completion's config file:
# fish
gh_completer _carapace >~/.config/fish/completions/gh.fish
Hope that might help others if they hit the same problem!
Working fantastically once I got over that hiccup though! 👍🏼👍🏼 Thanks so much for putting all the work into this and it's a shame it won't be part of core! (Although I understand the reluctance from the maintainers!).
Oh yes @JonParton , that might be because of fish-shell/fish-shell#6716 as system completions (so the one installed by the package) are still being autoloaded even if one is already registered (so it overwrites it at first <TAB>).
An empty user completion would prevent it as well but your solution is better anyway as it omits the delay of invoking gh_completer at shell startup:
However, we are going light on this approach because we don't want too many API-powered completions before we build a good foundation for performing those with proper caching in place. Otherwise the experience of using them is going to be slow and potentially frustrating.
@mislav just been working on completer reusage and the same thing should work for you to provide completions for the extensions (at least the go based ones).
Basically you just have to add a subcommand for each extension with flag parsing disabled (probably already being done) like here.
Then in the ValidArgsFunction invoke the __complete subcommand of the extension with args and toComplete as arguments similar to this (you can ignore the directive handling as this is not needed for you).
It outputs:
value
value\twithDescription
:4
# empty line
So just return lines[:len(lines)-2] and :4 parsed as integer (ShellCompDirecive) and it might already work.
Here is a POC using Cobra builtin ValidArgs on zsh (should work as well on bash and any shells cobra completions support) :
recording-20221122-15.23.06.mov
implementation is not ideal (it use gh binary to generate the pr list and title when it could just use graphql directly) but good enough for what we want to do..
let me know what do you think and i can clean this up and submit it...
I thought it would be neat to wrap around the gh binary for generating the completion cobra expect....
here is a shell script adding completion (only for pr and issue the rest is an exercise for the rider) to gh by wrapping around it.
Just save this script in your $PATH before the path of where the real gh binary is and just tab on the issue and pr to get the a completion of the pr and title (as per my video in the above comment) :
#!/usr/bin/env bash# Copyright 2022 Chmouel Boudjnah <[email protected]># will look better on zsh if you set : # zstyle ':completion:*:*:gh:*' menu yes select# to have a nice interactive menu to select the prnumberset -eufo pipefail
shopt -s extglob
[[ -n${BASH_COMP_DEBUG_FILE:-""} ]] &&echo"$@">>$BASH_COMP_DEBUG_FILE
ghbins=($(command which -a gh))
ghbin=${ghbins[1]}
[[ -z${ghbin} ]] && { echo"cannot find real gh bin in path";exit 1 ;}
get_obj_title() {
local obj=$1exec${ghbin}$obj list -q '.[] | ((.number|tostring)+"\t"+.title)' --json "number,title"
}
case$@in*__complete\ pr\ +(checks|close|comment|ready|review|status|view|diff|edit|merge|view|checkout)*) get_obj_title pr;;
*__complete\ issue\ +(comment|view|delete|develop|edit|list|pin|status)*) get_obj_title issue;;
*) exec${ghbin}"$@";;
esac
Activity
whi-tw commentedon Feb 12, 2020
You can generate command completion as-is:
This is standard behaviour when using (recent) spf13/cobra! (This may not actually be true.
ghseems to follow the standard form that cobra itself uses, but appears to have been implemented specifically.)nesl247 commentedon Feb 12, 2020
It would be much better if these were installed as part of the homebrew installation, same for other systems.
Also, I did try it with fish and it did not work. Apparently the version of gh available in the tap is not updated as I'm only on
0.5.2.Update: Now that 0.5.4 is available in homebrew it worked.
cbrnr commentedon Feb 13, 2020
This should already work with Homebrew. When installing I get the following notification:
eugene-babichenko commentedon Feb 13, 2020
@whi-tw
I know about them, but those completions work only for subcommands and flags names. What I want is something like
gitcompletions, where you can, for example, select files to add to commit from completions. Or select the branch to checkout in the same way. Something more intelligent overall.whi-tw commentedon Feb 13, 2020
@eugene-babichenko
Sure, I misunderstood what you meant by 'Not only for commands' at first: that you were unaware that command completion already existed. I've tried to edit my reply to acknowledge that. Hopefully the discussion helps people when looking for 'standard' completion, and that I haven't diluted the discussion about the other context-aware completions - I agree,
gitstyle completions for PRs / branches etc would be really useful![-]Completions for bash, zsh, etc[/-][+]Better completions for bash, zsh, etc[/+]cmur2 commentedon Feb 28, 2020
Would it be possible to show the availability of the
gh completionsubcommand ingh help? I tend to forget the specific syntax and have to search for this issue again then.AjayKMehta commentedon Mar 3, 2020
Is there any plan to add support for Powershell to
gh completion?mislav commentedon Mar 5, 2020
@AjayKMehta #591
[-]Better completions for bash, zsh, etc[/-][+]Better completions for repos, issues, PRs, etc. in commands[/+]rsteube commentedon Sep 9, 2020
https://github.com/rsteube/gh
mislav commentedon Sep 14, 2020
@rsteube That is pretty cool!
rsteube commentedon Oct 29, 2020
added completions for the new commands - still some minor issues but otherwise works pretty well so far
6 remaining items
joelostblom commentedon Jan 16, 2021
Just watched the videos. AMAZING! 🤯 Thank you so much for developing this functionality for the gh cli @rsteube !
rsteube commentedon May 9, 2021
rsteube commentedon May 27, 2021
So anyone following this: i moved the completion to carapace-bin.
Not much difference other than that the completion is provided by a separate binary.
This simply means that whenever you invoke completion for
ghwith<TAB>it is executed with the current command line instead ofgh(you can try this out by calling it directlycarapace gh elvish _ gh issue view '').Cache is written to
{os.TempDir()}/carapace(e.g./tmp/carapace).Did a couple of tests and so far seems to work alright, but there might be some minor issues with different environments.
So if you want to try it out either grab the release and source the completion for gh:
Or build just the completer for gh:
JonParton commentedon Aug 13, 2021
just a note @rsteube; I couldn't get the above to work with
fishautocompletions using the method of registering suggested:instead, I had to put the output in a completion's config file:
Hope that might help others if they hit the same problem!
Working fantastically once I got over that hiccup though! 👍🏼👍🏼 Thanks so much for putting all the work into this and it's a shame it won't be part of core! (Although I understand the reluctance from the maintainers!).
rsteube commentedon Aug 13, 2021
Oh yes @JonParton , that might be because of fish-shell/fish-shell#6716 as system completions (so the one installed by the package) are still being autoloaded even if one is already registered (so it overwrites it at first
<TAB>).An empty user completion would prevent it as well but your solution is better anyway as it omits the delay of invoking
gh_completerat shell startup:touch ~/.config/fish/completions/gh.fishcmoog commentedon Aug 24, 2021
So isn't this achievable by adding the following to each appropriate command spec
For example, the valid args function for
gh issue closewould return each open issue number.cli/pkg/cmd/issue/close/close.go
Line 35 in 6b49e21
rsteube commentedon Aug 24, 2021
@cmoog yes?
mislav commentedon Aug 24, 2021
@cmoog This is achievable using Cobra like you've outlined, yes. We've started to add some completions to core gh already, e.g.
cli/cmd/gh/main.go
Lines 168 to 169 in e297345
cli/pkg/cmd/repo/create/create.go
Line 139 in e297345
However, we are going light on this approach because we don't want too many API-powered completions before we build a good foundation for performing those with proper caching in place. Otherwise the experience of using them is going to be slow and potentially frustrating.
rsteube commentedon Oct 27, 2021
Anyone here already got access to codespaces and can check if this works?
It should output files/folder from the codespace vm (replace
[name]).rsteube commentedon Feb 14, 2022
@mislav just been working on completer reusage and the same thing should work for you to provide completions for the extensions (at least the go based ones).
Basically you just have to add a subcommand for each extension with flag parsing disabled (probably already being done) like here.
Then in the
ValidArgsFunctioninvoke the__completesubcommand of the extension withargsandtoCompleteas arguments similar to this (you can ignore the directive handling as this is not needed for you).It outputs:
So just return
lines[:len(lines)-2]and:4parsed as integer (ShellCompDirecive) and it might already work.chmouel commentedon Nov 22, 2022
Here is a POC using Cobra builtin ValidArgs on zsh (should work as well on bash and any shells cobra completions support) :
recording-20221122-15.23.06.mov
implementation is not ideal (it use gh binary to generate the pr list and title when it could just use graphql directly) but good enough for what we want to do..
let me know what do you think and i can clean this up and submit it...
chmouel commentedon Nov 22, 2022
I thought it would be neat to wrap around the gh binary for generating the completion cobra expect....
here is a shell script adding completion (only for pr and issue the rest is an exercise for the rider) to gh by wrapping around it.
Just save this script in your $PATH before the path of where the real gh binary is and just tab on the issue and pr to get the a completion of the pr and title (as per my video in the above comment) :
feat(zsh): complete PR numbers for `gh pr view`/`update-branch` (#367)