1// Package main is complete tool for the go command line 2package main 3 4import "github.com/posener/complete" 5 6var ( 7 ellipsis = complete.PredictSet("./...") 8 anyPackage = complete.PredictFunc(predictPackages) 9 goFiles = complete.PredictFiles("*.go") 10 anyFile = complete.PredictFiles("*") 11 anyGo = complete.PredictOr(goFiles, anyPackage, ellipsis) 12) 13 14func main() { 15 build := complete.Command{ 16 Flags: complete.Flags{ 17 "-o": anyFile, 18 "-i": complete.PredictNothing, 19 20 "-a": complete.PredictNothing, 21 "-n": complete.PredictNothing, 22 "-p": complete.PredictAnything, 23 "-race": complete.PredictNothing, 24 "-msan": complete.PredictNothing, 25 "-v": complete.PredictNothing, 26 "-work": complete.PredictNothing, 27 "-x": complete.PredictNothing, 28 "-asmflags": complete.PredictAnything, 29 "-buildmode": complete.PredictAnything, 30 "-compiler": complete.PredictAnything, 31 "-gccgoflags": complete.PredictSet("gccgo", "gc"), 32 "-gcflags": complete.PredictAnything, 33 "-installsuffix": complete.PredictAnything, 34 "-ldflags": complete.PredictAnything, 35 "-linkshared": complete.PredictNothing, 36 "-pkgdir": anyPackage, 37 "-tags": complete.PredictAnything, 38 "-toolexec": complete.PredictAnything, 39 }, 40 Args: anyGo, 41 } 42 43 run := complete.Command{ 44 Flags: complete.Flags{ 45 "-exec": complete.PredictAnything, 46 }, 47 Args: goFiles, 48 } 49 50 test := complete.Command{ 51 Flags: complete.Flags{ 52 "-args": complete.PredictAnything, 53 "-c": complete.PredictNothing, 54 "-exec": complete.PredictAnything, 55 56 "-bench": predictBenchmark, 57 "-benchtime": complete.PredictAnything, 58 "-count": complete.PredictAnything, 59 "-cover": complete.PredictNothing, 60 "-covermode": complete.PredictSet("set", "count", "atomic"), 61 "-coverpkg": complete.PredictDirs("*"), 62 "-cpu": complete.PredictAnything, 63 "-run": predictTest, 64 "-short": complete.PredictNothing, 65 "-timeout": complete.PredictAnything, 66 67 "-benchmem": complete.PredictNothing, 68 "-blockprofile": complete.PredictFiles("*.out"), 69 "-blockprofilerate": complete.PredictAnything, 70 "-coverprofile": complete.PredictFiles("*.out"), 71 "-cpuprofile": complete.PredictFiles("*.out"), 72 "-memprofile": complete.PredictFiles("*.out"), 73 "-memprofilerate": complete.PredictAnything, 74 "-mutexprofile": complete.PredictFiles("*.out"), 75 "-mutexprofilefraction": complete.PredictAnything, 76 "-outputdir": complete.PredictDirs("*"), 77 "-trace": complete.PredictFiles("*.out"), 78 }, 79 Args: anyGo, 80 } 81 82 fmt := complete.Command{ 83 Flags: complete.Flags{ 84 "-n": complete.PredictNothing, 85 "-x": complete.PredictNothing, 86 }, 87 Args: anyGo, 88 } 89 90 get := complete.Command{ 91 Flags: complete.Flags{ 92 "-d": complete.PredictNothing, 93 "-f": complete.PredictNothing, 94 "-fix": complete.PredictNothing, 95 "-insecure": complete.PredictNothing, 96 "-t": complete.PredictNothing, 97 "-u": complete.PredictNothing, 98 }, 99 Args: anyGo, 100 } 101 102 generate := complete.Command{ 103 Flags: complete.Flags{ 104 "-n": complete.PredictNothing, 105 "-x": complete.PredictNothing, 106 "-v": complete.PredictNothing, 107 "-run": complete.PredictAnything, 108 }, 109 Args: anyGo, 110 } 111 112 vet := complete.Command{ 113 Flags: complete.Flags{ 114 "-n": complete.PredictNothing, 115 "-x": complete.PredictNothing, 116 }, 117 Args: anyGo, 118 } 119 120 list := complete.Command{ 121 Flags: complete.Flags{ 122 "-e": complete.PredictNothing, 123 "-f": complete.PredictAnything, 124 "-json": complete.PredictNothing, 125 }, 126 Args: complete.PredictOr(anyPackage, ellipsis), 127 } 128 129 doc := complete.Command{ 130 Flags: complete.Flags{ 131 "-c": complete.PredictNothing, 132 "-cmd": complete.PredictNothing, 133 "-u": complete.PredictNothing, 134 }, 135 Args: anyPackage, 136 } 137 138 tool := complete.Command{ 139 Flags: complete.Flags{ 140 "-n": complete.PredictNothing, 141 }, 142 Sub: complete.Commands{ 143 "addr2line": { 144 Args: anyFile, 145 }, 146 "asm": { 147 Flags: complete.Flags{ 148 "-D": complete.PredictAnything, 149 "-I": complete.PredictDirs("*"), 150 "-S": complete.PredictNothing, 151 "-debug": complete.PredictNothing, 152 "-dynlink": complete.PredictNothing, 153 "-e": complete.PredictNothing, 154 "-o": anyFile, 155 "-shared": complete.PredictNothing, 156 "-trimpath": complete.PredictNothing, 157 }, 158 Args: complete.PredictFiles("*.s"), 159 }, 160 "cgo": { 161 Flags: complete.Flags{ 162 "-debug-define": complete.PredictNothing, 163 "debug-gcc": complete.PredictNothing, 164 "dynimport": anyFile, 165 "dynlinker": complete.PredictNothing, 166 "dynout": anyFile, 167 "dynpackage": anyPackage, 168 "exportheader": complete.PredictDirs("*"), 169 "gccgo": complete.PredictNothing, 170 "gccgopkgpath": complete.PredictDirs("*"), 171 "gccgoprefix": complete.PredictAnything, 172 "godefs": complete.PredictNothing, 173 "import_runtime_cgo": complete.PredictNothing, 174 "import_syscall": complete.PredictNothing, 175 "importpath": complete.PredictDirs("*"), 176 "objdir": complete.PredictDirs("*"), 177 "srcdir": complete.PredictDirs("*"), 178 }, 179 Args: goFiles, 180 }, 181 "compile": { 182 Flags: complete.Flags{ 183 "-%": complete.PredictNothing, 184 "-+": complete.PredictNothing, 185 "-B": complete.PredictNothing, 186 "-D": complete.PredictDirs("*"), 187 "-E": complete.PredictNothing, 188 "-I": complete.PredictDirs("*"), 189 "-K": complete.PredictNothing, 190 "-N": complete.PredictNothing, 191 "-S": complete.PredictNothing, 192 "-V": complete.PredictNothing, 193 "-W": complete.PredictNothing, 194 "-asmhdr": anyFile, 195 "-bench": anyFile, 196 "-buildid": complete.PredictNothing, 197 "-complete": complete.PredictNothing, 198 "-cpuprofile": anyFile, 199 "-d": complete.PredictNothing, 200 "-dynlink": complete.PredictNothing, 201 "-e": complete.PredictNothing, 202 "-f": complete.PredictNothing, 203 "-h": complete.PredictNothing, 204 "-i": complete.PredictNothing, 205 "-importmap": complete.PredictAnything, 206 "-installsuffix": complete.PredictAnything, 207 "-j": complete.PredictNothing, 208 "-l": complete.PredictNothing, 209 "-largemodel": complete.PredictNothing, 210 "-linkobj": anyFile, 211 "-live": complete.PredictNothing, 212 "-m": complete.PredictNothing, 213 "-memprofile": complete.PredictNothing, 214 "-memprofilerate": complete.PredictAnything, 215 "-msan": complete.PredictNothing, 216 "-nolocalimports": complete.PredictNothing, 217 "-o": anyFile, 218 "-p": complete.PredictDirs("*"), 219 "-pack": complete.PredictNothing, 220 "-r": complete.PredictNothing, 221 "-race": complete.PredictNothing, 222 "-s": complete.PredictNothing, 223 "-shared": complete.PredictNothing, 224 "-traceprofile": anyFile, 225 "-trimpath": complete.PredictAnything, 226 "-u": complete.PredictNothing, 227 "-v": complete.PredictNothing, 228 "-w": complete.PredictNothing, 229 "-wb": complete.PredictNothing, 230 }, 231 Args: goFiles, 232 }, 233 "cover": { 234 Flags: complete.Flags{ 235 "-func": complete.PredictAnything, 236 "-html": complete.PredictAnything, 237 "-mode": complete.PredictSet("set", "count", "atomic"), 238 "-o": anyFile, 239 "-var": complete.PredictAnything, 240 }, 241 Args: anyFile, 242 }, 243 "dist": { 244 Sub: complete.Commands{ 245 "banner": {Flags: complete.Flags{"-v": complete.PredictNothing}}, 246 "bootstrap": {Flags: complete.Flags{"-v": complete.PredictNothing}}, 247 "clean": {Flags: complete.Flags{"-v": complete.PredictNothing}}, 248 "env": {Flags: complete.Flags{"-v": complete.PredictNothing, "-p": complete.PredictNothing}}, 249 "install": {Flags: complete.Flags{"-v": complete.PredictNothing}, Args: complete.PredictDirs("*")}, 250 "list": {Flags: complete.Flags{"-v": complete.PredictNothing, "-json": complete.PredictNothing}}, 251 "test": {Flags: complete.Flags{"-v": complete.PredictNothing, "-h": complete.PredictNothing}}, 252 "version": {Flags: complete.Flags{"-v": complete.PredictNothing}}, 253 }, 254 }, 255 "doc": doc, 256 "fix": { 257 Flags: complete.Flags{ 258 "-diff": complete.PredictNothing, 259 "-force": complete.PredictAnything, 260 "-r": complete.PredictSet("context", "gotypes", "netipv6zone", "printerconfig"), 261 }, 262 Args: anyGo, 263 }, 264 "link": {}, 265 "nm": { 266 Flags: complete.Flags{ 267 "-n": complete.PredictNothing, 268 "-size": complete.PredictNothing, 269 "-sort": complete.PredictAnything, 270 "-type": complete.PredictNothing, 271 }, 272 Args: anyGo, 273 }, 274 "objdump": { 275 Flags: complete.Flags{ 276 "-s": complete.PredictAnything, 277 }, 278 Args: anyFile, 279 }, 280 "pack": {}, 281 "pprof": { 282 Flags: complete.Flags{ 283 "-callgrind": complete.PredictNothing, 284 "-disasm": complete.PredictAnything, 285 "-dot": complete.PredictNothing, 286 "-eog": complete.PredictNothing, 287 "-evince": complete.PredictNothing, 288 "-gif": complete.PredictNothing, 289 "-gv": complete.PredictNothing, 290 "-list": complete.PredictAnything, 291 "-pdf": complete.PredictNothing, 292 "-peek": complete.PredictAnything, 293 "-png": complete.PredictNothing, 294 "-proto": complete.PredictNothing, 295 "-ps": complete.PredictNothing, 296 "-raw": complete.PredictNothing, 297 "-svg": complete.PredictNothing, 298 "-tags": complete.PredictNothing, 299 "-text": complete.PredictNothing, 300 "-top": complete.PredictNothing, 301 "-tree": complete.PredictNothing, 302 "-web": complete.PredictNothing, 303 "-weblist": complete.PredictAnything, 304 "-output": anyFile, 305 "-functions": complete.PredictNothing, 306 "-files": complete.PredictNothing, 307 "-lines": complete.PredictNothing, 308 "-addresses": complete.PredictNothing, 309 "-base": complete.PredictAnything, 310 "-drop_negative": complete.PredictNothing, 311 "-cum": complete.PredictNothing, 312 "-seconds": complete.PredictAnything, 313 "-nodecount": complete.PredictAnything, 314 "-nodefraction": complete.PredictAnything, 315 "-edgefraction": complete.PredictAnything, 316 "-sample_index": complete.PredictNothing, 317 "-mean": complete.PredictNothing, 318 "-inuse_space": complete.PredictNothing, 319 "-inuse_objects": complete.PredictNothing, 320 "-alloc_space": complete.PredictNothing, 321 "-alloc_objects": complete.PredictNothing, 322 "-total_delay": complete.PredictNothing, 323 "-contentions": complete.PredictNothing, 324 "-mean_delay": complete.PredictNothing, 325 "-runtime": complete.PredictNothing, 326 "-focus": complete.PredictAnything, 327 "-ignore": complete.PredictAnything, 328 "-tagfocus": complete.PredictAnything, 329 "-tagignore": complete.PredictAnything, 330 "-call_tree": complete.PredictNothing, 331 "-unit": complete.PredictAnything, 332 "-divide_by": complete.PredictAnything, 333 "-buildid": complete.PredictAnything, 334 "-tools": complete.PredictDirs("*"), 335 "-help": complete.PredictNothing, 336 }, 337 Args: anyFile, 338 }, 339 "tour": { 340 Flags: complete.Flags{ 341 "-http": complete.PredictAnything, 342 "-openbrowser": complete.PredictNothing, 343 }, 344 }, 345 "trace": { 346 Flags: complete.Flags{ 347 "-http": complete.PredictAnything, 348 "-pprof": complete.PredictSet("net", "sync", "syscall", "sched"), 349 }, 350 Args: anyFile, 351 }, 352 "vet": { 353 Flags: complete.Flags{ 354 "-all": complete.PredictNothing, 355 "-asmdecl": complete.PredictNothing, 356 "-assign": complete.PredictNothing, 357 "-atomic": complete.PredictNothing, 358 "-bool": complete.PredictNothing, 359 "-buildtags": complete.PredictNothing, 360 "-cgocall": complete.PredictNothing, 361 "-composites": complete.PredictNothing, 362 "-compositewhitelist": complete.PredictNothing, 363 "-copylocks": complete.PredictNothing, 364 "-httpresponse": complete.PredictNothing, 365 "-lostcancel": complete.PredictNothing, 366 "-methods": complete.PredictNothing, 367 "-nilfunc": complete.PredictNothing, 368 "-printf": complete.PredictNothing, 369 "-printfuncs": complete.PredictAnything, 370 "-rangeloops": complete.PredictNothing, 371 "-shadow": complete.PredictNothing, 372 "-shadowstrict": complete.PredictNothing, 373 "-shift": complete.PredictNothing, 374 "-structtags": complete.PredictNothing, 375 "-tags": complete.PredictAnything, 376 "-tests": complete.PredictNothing, 377 "-unreachable": complete.PredictNothing, 378 "-unsafeptr": complete.PredictNothing, 379 "-unusedfuncs": complete.PredictAnything, 380 "-unusedresult": complete.PredictNothing, 381 "-unusedstringmethods": complete.PredictAnything, 382 "-v": complete.PredictNothing, 383 }, 384 Args: anyGo, 385 }, 386 }, 387 } 388 389 clean := complete.Command{ 390 Flags: complete.Flags{ 391 "-i": complete.PredictNothing, 392 "-r": complete.PredictNothing, 393 "-n": complete.PredictNothing, 394 "-x": complete.PredictNothing, 395 }, 396 Args: complete.PredictOr(anyPackage, ellipsis), 397 } 398 399 env := complete.Command{ 400 Args: complete.PredictAnything, 401 } 402 403 bug := complete.Command{} 404 version := complete.Command{} 405 406 fix := complete.Command{ 407 Args: anyGo, 408 } 409 410 // commands that also accepts the build flags 411 for name, options := range build.Flags { 412 test.Flags[name] = options 413 run.Flags[name] = options 414 list.Flags[name] = options 415 vet.Flags[name] = options 416 get.Flags[name] = options 417 } 418 419 gogo := complete.Command{ 420 Sub: complete.Commands{ 421 "build": build, 422 "install": build, // install and build have the same flags 423 "run": run, 424 "test": test, 425 "fmt": fmt, 426 "get": get, 427 "generate": generate, 428 "vet": vet, 429 "list": list, 430 "doc": doc, 431 "tool": tool, 432 "clean": clean, 433 "env": env, 434 "bug": bug, 435 "fix": fix, 436 "version": version, 437 }, 438 GlobalFlags: complete.Flags{ 439 "-h": complete.PredictNothing, 440 }, 441 } 442 443 complete.New("go", gogo).Run() 444} 445