vendor/github.com/spf13/cobra/active_help.md
changeset 260 445e01aede7e
equal deleted inserted replaced
259:db4911b0c721 260:445e01aede7e
       
     1 # Active Help
       
     2 
       
     3 Active Help is a framework provided by Cobra which allows a program to define messages (hints, warnings, etc) that will be printed during program usage.  It aims to make it easier for your users to learn how to use your program.  If configured by the program, Active Help is printed when the user triggers shell completion.
       
     4 
       
     5 For example, 
       
     6 ```
       
     7 bash-5.1$ helm repo add [tab]
       
     8 You must choose a name for the repo you are adding.
       
     9 
       
    10 bash-5.1$ bin/helm package [tab]
       
    11 Please specify the path to the chart to package
       
    12 
       
    13 bash-5.1$ bin/helm package [tab][tab]
       
    14 bin/    internal/    scripts/    pkg/     testdata/
       
    15 ```
       
    16 
       
    17 **Hint**: A good place to use Active Help messages is when the normal completion system does not provide any suggestions. In such cases, Active Help nicely supplements the normal shell completions to guide the user in knowing what is expected by the program.
       
    18 ## Supported shells
       
    19 
       
    20 Active Help is currently only supported for the following shells:
       
    21 - Bash (using [bash completion V2](shell_completions.md#bash-completion-v2) only). Note that bash 4.4 or higher is required for the prompt to appear when an Active Help message is printed.
       
    22 - Zsh
       
    23 
       
    24 ## Adding Active Help messages
       
    25 
       
    26 As Active Help uses the shell completion system, the implementation of Active Help messages is done by enhancing custom dynamic completions.  If you are not familiar with dynamic completions, please refer to [Shell Completions](shell_completions.md).
       
    27 
       
    28 Adding Active Help is done through the use of the `cobra.AppendActiveHelp(...)` function, where the program repeatedly adds Active Help messages to the list of completions.  Keep reading for details.
       
    29 
       
    30 ### Active Help for nouns
       
    31 
       
    32 Adding Active Help when completing a noun is done within the `ValidArgsFunction(...)` of a command.  Please notice the use of `cobra.AppendActiveHelp(...)` in the following example:
       
    33 
       
    34 ```go
       
    35 cmd := &cobra.Command{
       
    36 	Use:   "add [NAME] [URL]",
       
    37 	Short: "add a chart repository",
       
    38 	Args:  require.ExactArgs(2),
       
    39 	RunE: func(cmd *cobra.Command, args []string) error {
       
    40 		return addRepo(args)
       
    41 	},
       
    42 	ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
       
    43 		var comps []string
       
    44 		if len(args) == 0 {
       
    45 			comps = cobra.AppendActiveHelp(comps, "You must choose a name for the repo you are adding")
       
    46 		} else if len(args) == 1 {
       
    47 			comps = cobra.AppendActiveHelp(comps, "You must specify the URL for the repo you are adding")
       
    48 		} else {
       
    49 			comps = cobra.AppendActiveHelp(comps, "This command does not take any more arguments")
       
    50 		}
       
    51 		return comps, cobra.ShellCompDirectiveNoFileComp
       
    52 	},
       
    53 }
       
    54 ```
       
    55 The example above defines the completions (none, in this specific example) as well as the Active Help messages for the `helm repo add` command.  It yields the following behavior:
       
    56 ```
       
    57 bash-5.1$ helm repo add [tab]
       
    58 You must choose a name for the repo you are adding
       
    59 
       
    60 bash-5.1$ helm repo add grafana [tab]
       
    61 You must specify the URL for the repo you are adding
       
    62 
       
    63 bash-5.1$ helm repo add grafana https://grafana.github.io/helm-charts [tab]
       
    64 This command does not take any more arguments
       
    65 ```
       
    66 **Hint**: As can be seen in the above example, a good place to use Active Help messages is when the normal completion system does not provide any suggestions. In such cases, Active Help nicely supplements the normal shell completions.
       
    67 
       
    68 ### Active Help for flags
       
    69 
       
    70 Providing Active Help for flags is done in the same fashion as for nouns, but using the completion function registered for the flag.  For example:
       
    71 ```go
       
    72 _ = cmd.RegisterFlagCompletionFunc("version", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
       
    73 		if len(args) != 2 {
       
    74 			return cobra.AppendActiveHelp(nil, "You must first specify the chart to install before the --version flag can be completed"), cobra.ShellCompDirectiveNoFileComp
       
    75 		}
       
    76 		return compVersionFlag(args[1], toComplete)
       
    77 	})
       
    78 ```
       
    79 The example above prints an Active Help message when not enough information was given by the user to complete the `--version` flag.
       
    80 ```
       
    81 bash-5.1$ bin/helm install myrelease --version 2.0.[tab]
       
    82 You must first specify the chart to install before the --version flag can be completed
       
    83 
       
    84 bash-5.1$ bin/helm install myrelease bitnami/solr --version 2.0.[tab][tab]
       
    85 2.0.1  2.0.2  2.0.3
       
    86 ```
       
    87 
       
    88 ## User control of Active Help
       
    89 
       
    90 You may want to allow your users to disable Active Help or choose between different levels of Active Help.  It is entirely up to the program to define the type of configurability of Active Help that it wants to offer, if any.
       
    91 Allowing to configure Active Help is entirely optional; you can use Active Help in your program without doing anything about Active Help configuration.
       
    92 
       
    93 The way to configure Active Help is to use the program's Active Help environment
       
    94 variable.  That variable is named `<PROGRAM>_ACTIVE_HELP` where `<PROGRAM>` is the name of your 
       
    95 program in uppercase with any `-` replaced by an `_`.  The variable should be set by the user to whatever
       
    96 Active Help configuration values are supported by the program.
       
    97 
       
    98 For example, say `helm` has chosen to support three levels for Active Help: `on`, `off`, `local`.  Then a user
       
    99 would set the desired behavior to `local` by doing `export HELM_ACTIVE_HELP=local` in their shell.
       
   100 
       
   101 For simplicity, when in `cmd.ValidArgsFunction(...)` or a flag's completion function, the program should read the
       
   102 Active Help configuration using the `cobra.GetActiveHelpConfig(cmd)` function and select what Active Help messages
       
   103 should or should not be added (instead of reading the environment variable directly).
       
   104 
       
   105 For example:
       
   106 ```go
       
   107 ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
       
   108 	activeHelpLevel := cobra.GetActiveHelpConfig(cmd)
       
   109 
       
   110 	var comps []string
       
   111 	if len(args) == 0 {
       
   112 		if activeHelpLevel != "off"  {
       
   113 			comps = cobra.AppendActiveHelp(comps, "You must choose a name for the repo you are adding")
       
   114 		}
       
   115 	} else if len(args) == 1 {
       
   116 		if activeHelpLevel != "off" {
       
   117 			comps = cobra.AppendActiveHelp(comps, "You must specify the URL for the repo you are adding")
       
   118 		}
       
   119 	} else {
       
   120 		if activeHelpLevel == "local" {
       
   121 			comps = cobra.AppendActiveHelp(comps, "This command does not take any more arguments")
       
   122 		}
       
   123 	}
       
   124 	return comps, cobra.ShellCompDirectiveNoFileComp
       
   125 },
       
   126 ```
       
   127 **Note 1**: If the `<PROGRAM>_ACTIVE_HELP` environment variable is set to the string "0", Cobra will automatically disable all Active Help output (even if some output was specified by the program using the `cobra.AppendActiveHelp(...)` function).  Using "0" can simplify your code in situations where you want to blindly disable Active Help without having to call `cobra.GetActiveHelpConfig(cmd)` explicitly.
       
   128 
       
   129 **Note 2**: If a user wants to disable Active Help for every single program based on Cobra, she can set the environment variable `COBRA_ACTIVE_HELP` to "0".  In this case `cobra.GetActiveHelpConfig(cmd)` will return "0" no matter what the variable `<PROGRAM>_ACTIVE_HELP` is set to.
       
   130 
       
   131 **Note 3**: If the user does not set `<PROGRAM>_ACTIVE_HELP` or `COBRA_ACTIVE_HELP` (which will be a common case), the default value for the Active Help configuration returned by `cobra.GetActiveHelpConfig(cmd)` will be the empty string. 
       
   132 ## Active Help with Cobra's default completion command
       
   133 
       
   134 Cobra provides a default `completion` command for programs that wish to use it.
       
   135 When using the default `completion` command, Active Help is configurable in the same
       
   136 fashion as described above using environment variables.  You may wish to document this in more
       
   137 details for your users.
       
   138 
       
   139 ## Debugging Active Help
       
   140 
       
   141 Debugging your Active Help code is done in the same way as debugging your dynamic completion code, which is with Cobra's hidden `__complete` command.  Please refer to [debugging shell completion](shell_completions.md#debugging) for details.
       
   142 
       
   143 When debugging with the `__complete` command, if you want to specify different Active Help configurations, you should use the active help environment variable.  That variable is named `<PROGRAM>_ACTIVE_HELP` where any `-` is replaced by an `_`.  For example, we can test deactivating some Active Help as shown below:
       
   144 ```
       
   145 $ HELM_ACTIVE_HELP=1 bin/helm __complete install wordpress bitnami/h<ENTER>
       
   146 bitnami/haproxy
       
   147 bitnami/harbor
       
   148 _activeHelp_ WARNING: cannot re-use a name that is still in use
       
   149 :0
       
   150 Completion ended with directive: ShellCompDirectiveDefault
       
   151 
       
   152 $ HELM_ACTIVE_HELP=0 bin/helm __complete install wordpress bitnami/h<ENTER>
       
   153 bitnami/haproxy
       
   154 bitnami/harbor
       
   155 :0
       
   156 Completion ended with directive: ShellCompDirectiveDefault
       
   157 ```