diff --git a/PENDING.md b/PENDING.md index 5b9941d8efba..5bc110003410 100644 --- a/PENDING.md +++ b/PENDING.md @@ -64,6 +64,7 @@ FEATURES * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) New `multisign` command to generate multisig signatures. * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) New `sign --multisig` flag to enable multisig mode. * [\#2715](https://github.com/cosmos/cosmos-sdk/issues/2715) Reintroduce gaia server's insecure mode. + * [\#3334](https://github.com/cosmos/cosmos-sdk/pull/3334) New `gaiad completion` and `gaiacli completion` to generate Bash/Zsh completion scripts. * Gaia * [\#2182] [x/staking] Added querier for querying a single redelegation diff --git a/client/flags.go b/client/flags.go index 50890635c4ef..76ebb9e87425 100644 --- a/client/flags.go +++ b/client/flags.go @@ -2,6 +2,7 @@ package client import ( "fmt" + "os" "strconv" "github.com/spf13/cobra" @@ -162,3 +163,35 @@ func ParseGas(gasStr string) (simulateAndExecute bool, gas uint64, err error) { } return } + +// NewCompletionCmd builds a cobra.Command that generate bash completion +// scripts for the given root command. If hidden is true, the command +// will not show up in the root command's list of available commands. +func NewCompletionCmd(rootCmd *cobra.Command, hidden bool) *cobra.Command { + flagZsh := "zsh" + cmd := &cobra.Command{ + Use: "completion", + Short: "Generate Bash/Zsh completion script to STDOUT", + Long: `To load completion script run + +. <(completion_script) + +To configure your bash shell to load completions for each session add to your bashrc + +# ~/.bashrc or ~/.profile +. <(completion_script) +`, + RunE: func(_ *cobra.Command, _ []string) error { + if viper.GetBool(flagZsh) { + return rootCmd.GenZshCompletion(os.Stdout) + } + return rootCmd.GenBashCompletion(os.Stdout) + }, + Hidden: hidden, + Args: cobra.NoArgs, + } + + cmd.Flags().Bool(flagZsh, false, "Generate Zsh completion script") + + return cmd +} diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index 52514d411664..f390324aa383 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -93,6 +93,7 @@ func main() { keys.Commands(), client.LineBreak, version.VersionCmd, + client.NewCompletionCmd(rootCmd, true), ) // Add flags and prefix all env exposed with GA diff --git a/cmd/gaia/cmd/gaiad/main.go b/cmd/gaia/cmd/gaiad/main.go index 1cb65b3c75ca..4014bef7330e 100644 --- a/cmd/gaia/cmd/gaiad/main.go +++ b/cmd/gaia/cmd/gaiad/main.go @@ -14,6 +14,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/cmd/gaia/app" gaiaInit "github.com/cosmos/cosmos-sdk/cmd/gaia/init" "github.com/cosmos/cosmos-sdk/server" @@ -42,6 +43,7 @@ func main() { rootCmd.AddCommand(gaiaInit.TestnetFilesCmd(ctx, cdc)) rootCmd.AddCommand(gaiaInit.GenTxCmd(ctx, cdc)) rootCmd.AddCommand(gaiaInit.AddGenesisAccountCmd(ctx, cdc)) + rootCmd.AddCommand(client.NewCompletionCmd(rootCmd, true)) server.AddCommands(ctx, cdc, rootCmd, newApp, exportAppStateAndTMValidators) diff --git a/docs/gaia/gaiacli.md b/docs/gaia/gaiacli.md index bdc0af58ccf6..37d239d85391 100644 --- a/docs/gaia/gaiacli.md +++ b/docs/gaia/gaiacli.md @@ -761,3 +761,36 @@ The transaction can now be sent to the node: ```bash gaiacli tx broadcast signedTx.json ``` + +## Shells completion scripts + +Completion scripts for popular UNIX shell interpreters such as `Bash` and `Zsh` +can be generated through the `completion` command, which is available for both +`gaiad` and `gaiacli`. + +If you want to generate `Bash` completion scripts run the following command: + +```bash +gaiad completion > gaiad_completion +gaiacli completion > gaiacli_completion +``` + +If you want to generate `Zsh` completion scripts run the following command: + +```bash +gaiad completion --zsh > gaiad_completion +gaiacli completion --zsh > gaiacli_completion +``` + +::: tip Note +On most UNIX systems, such scripts may be loaded in `.bashrc` or +`.bash_profile` to enable Bash autocompletion: + +```bash +echo '. gaiad_completion' >> ~/.bashrc +echo '. gaiacli_completion' >> ~/.bashrc +``` + +Refer to the user's manual of your interpreter provided by your +operating system for information on how to enable shell autocompletion. +:::