@@ -33,6 +33,9 @@ func fmtDefValue(value interface{}) string {
3333 }
3434}
3535
36+ // \xFF is used to escape a \t so tabwriter ignores it.
37+ const tabEscape = "\xFF "
38+
3639func renderFlagHelp (fl * flag.FlagSet , w io.Writer ) {
3740 var count int
3841 fl .VisitAll (func (f * flag.Flag ) {
@@ -42,9 +45,9 @@ func renderFlagHelp(fl *flag.FlagSet, w io.Writer) {
4245
4346 count ++
4447 if f .DefValue == "" {
45- fmt .Fprintf (w , "\t %v%v\t %v\n " , flagDashes (f .Name ), f .Name , f .Usage )
48+ fmt .Fprintf (w , tabEscape + "\t %v%v\t %v\n " , flagDashes (f .Name ), f .Name , f .Usage )
4649 } else {
47- fmt .Fprintf (w , "\t %v%v=%v\t %v\n " , flagDashes (f .Name ), f .Name , fmtDefValue (f .DefValue ), f .Usage )
50+ fmt .Fprintf (w , tabEscape + "\t %v%v=%v\t %v\n " , flagDashes (f .Name ), f .Name , fmtDefValue (f .DefValue ), f .Usage )
4851 }
4952 })
5053}
@@ -57,8 +60,11 @@ func renderHelp(cmd Command, fl *flag.FlagSet, w io.Writer) {
5760 )
5861 fmt .Fprintf (w , "%v\n " , cmd .Spec ().Desc )
5962
63+ tw := tabwriter .NewWriter (w , 0 , 4 , 2 , ' ' , tabwriter .StripEscape )
64+ defer tw .Flush ()
65+
6066 // Render flag help.
61- renderFlagHelp (fl , w )
67+ renderFlagHelp (fl , tw )
6268
6369 // Render subcommand summaries.
6470 pc , ok := cmd .(ParentCommand )
@@ -69,20 +75,16 @@ func renderHelp(cmd Command, fl *flag.FlagSet, w io.Writer) {
6975 fmt .Fprint (w , "Commands:\n " )
7076 }
7177
72- tw := tabwriter .NewWriter (w , 0 , 0 , 2 , ' ' , tabwriter .StripEscape )
7378 for _ , cmd := range pc .Subcommands () {
7479 if cmd .Spec ().Hidden {
7580 continue
7681 }
7782
78- // \xFF is used to escape the leading \t so tabwriter ignores it
7983 fmt .Fprintf (tw ,
80- " \xFF \t \xFF %v\t %v\n " ,
84+ tabEscape + " \t " + tabEscape + " %v\t %v\n " ,
8185 cmd .Spec ().Name ,
8286 cmd .Spec ().ShortDesc (),
8387 )
8488 }
85-
86- tw .Flush ()
8789 }
8890}
0 commit comments