@@ -14,6 +14,7 @@ import (
1414
1515 "github.com/sirupsen/logrus"
1616 "github.com/spf13/cobra"
17+ "github.com/spf13/pflag"
1718
1819 "github.com/lima-vm/lima/v2/cmd/limactl/editflags"
1920 "github.com/lima-vm/lima/v2/pkg/editutil"
@@ -84,9 +85,6 @@ func newStartCommand() *cobra.Command {
8485
8586 To create an instance "default" from a template "docker", and start it:
8687 $ limactl start --name=default template://docker
87-
88- 'limactl start' also accepts the 'limactl create' flags such as '--set'.
89- See the examples in 'limactl create --help'.
9088` ,
9189 Short : "Start an instance of Lima" ,
9290 Args : WrapArgsError (cobra .MaximumNArgs (1 )),
@@ -100,9 +98,111 @@ See the examples in 'limactl create --help'.
10098 }
10199 startCommand .Flags ().Duration ("timeout" , instance .DefaultWatchHostAgentEventsTimeout , "Duration to wait for the instance to be running before timing out" )
102100 startCommand .Flags ().Bool ("progress" , false , "Show provision script progress by tailing cloud-init logs" )
101+ startCommand .SetHelpFunc (func (cmd * cobra.Command , _ []string ) {
102+ printCommandSummary (cmd )
103+
104+ allFlags , createFlags := collectFlags (cmd )
105+ printFlags (allFlags , createFlags )
106+
107+ printGlobalFlags (cmd )
108+ })
109+
103110 return startCommand
104111}
105112
113+ func printCommandSummary (cmd * cobra.Command ) {
114+ fmt .Fprintf (cmd .OutOrStdout (), "%s\n \n " , cmd .Short )
115+ fmt .Fprintf (cmd .OutOrStdout (), "Usage:\n %s\n \n " , cmd .UseLine ())
116+
117+ if cmd .Example != "" {
118+ fmt .Fprintf (cmd .OutOrStdout (), "Examples:\n %s\n \n " , cmd .Example )
119+ }
120+ }
121+
122+ func getFlagType (flag * pflag.Flag ) string {
123+ switch flag .Value .Type () {
124+ case "bool" :
125+ return ""
126+ case "string" :
127+ return "string"
128+ case "int" :
129+ return "int"
130+ case "duration" :
131+ return "duration"
132+ case "stringSlice" , "stringArray" :
133+ return "strings"
134+ case "ipSlice" :
135+ return "ipSlice"
136+ case "uint16" :
137+ return "uint16"
138+ case "float32" :
139+ return "float32"
140+ default :
141+ return flag .Value .Type ()
142+ }
143+ }
144+
145+ func formatFlag (flag * pflag.Flag ) (flagName , shorthand string ) {
146+ flagName = "--" + flag .Name
147+
148+ if flag .Shorthand != "" {
149+ shorthand = "-" + flag .Shorthand
150+ }
151+
152+ flagType := getFlagType (flag )
153+ if flagType != "" {
154+ flagName += " " + flagType
155+ }
156+
157+ return flagName , shorthand
158+ }
159+
160+ func collectFlags (cmd * cobra.Command ) (allFlags , createFlags []string ) {
161+ cmd .LocalFlags ().VisitAll (func (flag * pflag.Flag ) {
162+ flagName , shorthand := formatFlag (flag )
163+ flagUsage := flag .Usage
164+
165+ var formattedFlag string
166+ if shorthand != "" {
167+ formattedFlag = fmt .Sprintf (" %s, %s" , shorthand , flagName )
168+ } else {
169+ formattedFlag = fmt .Sprintf (" %s" , flagName )
170+ }
171+
172+ if strings .HasPrefix (flagUsage , "[limactl create]" ) {
173+ cleanUsage := strings .TrimPrefix (flagUsage , "[limactl create] " )
174+ createFlags = append (createFlags , fmt .Sprintf ("%-25s %s" , formattedFlag , cleanUsage ))
175+ } else {
176+ allFlags = append (allFlags , fmt .Sprintf ("%-25s %s" , formattedFlag , flagUsage ))
177+ }
178+ })
179+ return allFlags , createFlags
180+ }
181+
182+ func printFlags (allFlags , createFlags []string ) {
183+ if len (allFlags ) > 0 {
184+ fmt .Fprint (os .Stdout , "Flags:\n " )
185+ for _ , flag := range allFlags {
186+ fmt .Fprintln (os .Stdout , flag )
187+ }
188+ fmt .Fprint (os .Stdout , "\n " )
189+ }
190+
191+ if len (createFlags ) > 0 {
192+ fmt .Fprint (os .Stdout , "Flags inherited from `limactl create`:\n " )
193+ for _ , flag := range createFlags {
194+ fmt .Fprintln (os .Stdout , flag )
195+ }
196+ fmt .Fprint (os .Stdout , "\n " )
197+ }
198+ }
199+
200+ func printGlobalFlags (cmd * cobra.Command ) {
201+ if cmd .HasAvailableInheritedFlags () {
202+ fmt .Fprintf (cmd .OutOrStdout (), "Global Flags:\n %s" , cmd .InheritedFlags ().FlagUsages ())
203+ }
204+ }
205+
106206func loadOrCreateInstance (cmd * cobra.Command , args []string , createOnly bool ) (* store.Instance , error ) {
107207 ctx := cmd .Context ()
108208 var arg string // can be empty
0 commit comments