package prep // initializes logging and command line options import ( "fmt" "os" "path/filepath" "strings" "go.wit.com/dev/alexflint/arg" "go.wit.com/lib/gui/shell" "go.wit.com/log" ) /* This struct can be used with the go-arg package. These are the generic default command line arguments for the 'GUI' package */ var argBash ArgsBash type ArgsBash struct { Bash bool `arg:"--bash" help:"generate bash completion"` } // try this struct out (?) var myAuto *AutoArgs // this is a work in progress type AutoArgs struct { id int // should be unique hidden bool // don't update the toolkits when it's hidden Auto func([]string) // the function for shell autocomplete appName string // a good way to track the name of the binary ? pp *arg.Parser // for parsing the command line args. Yay to alexf lint! autoFunc func(*Auto) // also a function for autocomplete match map[string]string // maps for strings } // argname is the name of the executable func Bash(argname string, autocomplete func([]string)) *AutoArgs { myAuto = new(AutoArgs) myAuto.appName = argname if len(os.Args) > 1 && os.Args[1] == "--bash" { doBash(argname) os.Exit(0) } if len(os.Args) > 1 && os.Args[1] == "--auto-complete" { autocomplete(os.Args[2:]) os.Exit(0) } arg.Register(&argBash) // parse go.Arg here? return myAuto } // print out auto complete debugging info func (pb *Auto) PrintDebug() { dur := pb.Duration.AsDuration() pb.Debugf("AUTOCOMPLETE: arg0='%s' arg1='%s' partial='%s' cmd='%s' age=%s argv=%v\n", pb.Arg0, pb.Arg1, pb.Partial, pb.Cmd, shell.FormatDuration(dur), pb.Argv) } // returns the last command (is blank if the current arg is not blank) func GetLast(cur string, argv []string) string { if cur != "''" { return "" } for _, s := range argv { if strings.HasPrefix(s, "-") { continue } return s } return "" } // returns the name of the executable registered for shell autocomplete func AppName() string { return myAuto.appName } // makes a bash autocomplete file for your command func doBash(argname string) { fmt.Println(makeBashCompletionText(argname)) homeDir, err := os.UserHomeDir() if err != nil { log.Printf("%v\n", err) os.Exit(0) } filename := filepath.Join(homeDir, ".local/share/bash-completion/completions", argname) if shell.Exists(filename) { log.Println(filename, "file already exists") os.Exit(0) } basedir, _ := filepath.Split(filename) if !shell.IsDir(basedir) { os.MkdirAll(basedir, os.ModePerm) } if f, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err == nil { f.Write([]byte(makeBashCompletionText(argname))) f.Close() log.Println("bash file created:", filename) log.Println("restart bash") } else { log.Info(filename, err) } os.Exit(0) }