diff --git a/bash.go b/bash.go new file mode 100644 index 0000000..908cde7 --- /dev/null +++ b/bash.go @@ -0,0 +1,131 @@ +package prep + +// initializes logging and command line options + +import ( + "fmt" + "os" + "path/filepath" + + "go.wit.com/dev/alexflint/arg" + "go.wit.com/lib/gui/shell" +) + +var argBash ArgsBash + +/* +This struct can be used with the go-arg package. These +are the generic default command line arguments for the 'GUI' package +*/ +type ArgsBash struct { + Bash bool `arg:"--bash" help:"generate bash completion"` +} + +var myBash *BashAuto + +type BashAuto struct { + id int // should be unique + hidden bool // don't update the toolkits when it's hidden + Auto func([]string) +} + +func dumpjunk() { + fmt.Fprintln(os.Stderr, "") + fmt.Fprintln(os.Stderr, os.Args) + os.Exit(0) +} + +// argname is the name of the executable +func Bash(argname string, autocomplete func([]string)) *BashAuto { + 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) + + myBash = new(BashAuto) + + // parse go.Arg here? + return myBash +} + +// makes a bash autocomplete file for your command +func doBash(argname string) { + if homeDir, err := os.UserHomeDir(); err == nil { + filename := filepath.Join(homeDir, ".local/share/bash-completion/completions", argname) + if shell.Exists(filename) { + } else { + 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() + } + fmt.Println("bash file created:", filename) + } + } + + fmt.Println(makeBashCompletionText(argname)) + + fmt.Println("restart bash") + os.Exit(0) +} + +func makeBashCompletionText(argname string) string { + var out string + + out += fmt.Sprintf("# add this in your bashrc:\n") + out += fmt.Sprintf("\n") + out += fmt.Sprintf("# todo: add this to go-arg as a 'hidden' go-arg option --bash\n") + out += fmt.Sprintf("#\n") + out += fmt.Sprintf("# Put the below in the file: ~/.local/share/bash-completion/completions/%s\n", argname) + out += fmt.Sprintf("#\n") + out += fmt.Sprintf("# todo: make this output work/parse with:\n") + out += fmt.Sprintf("# complete -C %s --bash go\n", argname) + out += fmt.Sprintf("\n") + out += fmt.Sprintf("_%s_complete()\n", argname) + out += fmt.Sprintf("{\n") + out += fmt.Sprintf(" # sets local to this func vars\n") + out += fmt.Sprintf(" local cur prev all\n") + out += fmt.Sprintf(" cur=${COMP_WORDS[COMP_CWORD]}\n") + out += fmt.Sprintf(" prev=${COMP_WORDS[COMP_CWORD-1]}\n") + out += fmt.Sprintf(" all=${COMP_WORDS[@]}\n") + out += fmt.Sprintf("\n") + out += fmt.Sprintf(" # this is where we generate the go-arg output\n") + out += fmt.Sprintf(" GOARGS=$(%s --auto-complete \\'$prev\\' \\'$cur\\' $all)\n", argname) + out += fmt.Sprintf("\n") + out += fmt.Sprintf(" # this compares the command line input from the user\n") + out += fmt.Sprintf(" # to whatever strings we output\n") + out += fmt.Sprintf(" COMPREPLY=( $(compgen -W \"$GOARGS\" -- $cur) ) # THIS WORKS\n") + out += fmt.Sprintf(" return 0\n") + out += fmt.Sprintf("}\n") + out += fmt.Sprintf("complete -F _%s_complete %s\n", argname, argname) + out += fmt.Sprintf("\n") + out += fmt.Sprintf("# copy and paste the above into your bash shell should work\n") + return out +} + +/* +// prints help to STDERR // TODO: move everything below this to go-args +func (args) doBashHelp() { + if argv.BashAuto[1] != "''" { + // if this is not blank, then the user has typed something + return + } + if argv.BashAuto[0] != ARGNAME { + // if this is not the name of the command, the user already started doing something + return + } + if argv.BashAuto[0] == ARGNAME { + me.pp.WriteHelp(os.Stderr) + return + } + fmt.Fprintln(os.Stderr, "") + fmt.Fprintln(os.Stderr, "hello world") + fmt.Fprintln(os.Stderr, "") +} +*/ diff --git a/gui.go b/gui.go index 1ebf642..73109fb 100644 --- a/gui.go +++ b/gui.go @@ -53,7 +53,7 @@ func postMustParse(s string) string { } func Gui() *gui.Node { - arg.Register(&argDebugger) + arg.Register(&argGui) return gui.PreInit(postMustParse) }