diff --git a/bash.new.go b/bash.new.go index fcee961..d6ac13b 100644 --- a/bash.new.go +++ b/bash.new.go @@ -63,7 +63,7 @@ func (pb *Auto) Debugf(fmts string, parts ...any) { } // makes a bash autocomplete file for your command -func doHandlePB(pb *Auto) error { +func (pb *Auto) doHandlePB() error { homeDir, err := os.UserHomeDir() if err != nil { return err @@ -81,7 +81,8 @@ func doHandlePB(pb *Auto) error { for found := range all.IterAll() { dur := time.Since(found.Ctime.AsTime()) pb.Duration = durationpb.New(dur) - pb.Debugf("AUTO HISTORY: ctime='%v' age=%s argv='%v'", found.Ctime, shell.FormatDuration(dur), found.Argv) + // found.PrintDebug() + pb.Debugf("AUTO HISTORY: age=%s cmd='%s' partial='%s' argv='%v'", shell.FormatDuration(dur), found.Cmd, found.Partial, found.Argv) last = found } } @@ -160,6 +161,52 @@ func (pb *Auto) Autocomplete(notsure any, sendthis string) { fmt.Printf("%s", strings.Join(all, " ")) } +func (pb *Auto) Autocomplete2(sendthis string) { + dur := pb.Duration.AsDuration() + if dur < time.Millisecond*200 { + pb.Debug = true + /* + pb.Debugf("TODO: show extended help here '%s' '%s' %v dur=%v\n", pb.Arg0, pb.Arg1, pb.Argv, shell.FormatDuration(dur)) + pb.PrintDebug() + fmt.Println(" ") + */ + if myAuto.pp == nil { + pb.Debugf("myAuto.pp == nil") + } else { + pb.Debugf("myAuto.pp != nil") + if pb.Cmd == "" { + myAuto.pp.WriteHelp(os.Stderr) + } else { + myAuto.pp.WriteHelpForSubcommand(os.Stderr, pb.Cmd) + } + } + } + + parts := strings.Split(sendthis, " ") + var all []string + for _, part := range parts { + var found bool + for _, s := range os.Args { + if s == part { + found = true + } + } + if found { + continue + } + all = append(all, part) + } + fmt.Printf("%s", strings.Join(all, " ")) + /* + if dur > time.Millisecond*200 { + if dur < time.Millisecond*800 { + // fmt.Println("a b") + fmt.Println(pb.Partial + " hello world") + } + } + */ +} + func parseArgv(argname string) *Auto { newauto := new(Auto) newauto.Argname = argname @@ -214,30 +261,91 @@ func parseArgv(argname string) *Auto { return newauto } +// MustParse processes command line arguments and exits upon failure +func MustParse(dest ...interface{}) *arg.Parser { + // arg. + // register = append(register, dest...) + return arg.MustParse(dest) +} + // also try to parse/send cur (?) -func Bash2(argname string, autocomplete func(*Auto)) *Auto { - newauto := parseArgv(argname) - if newauto.SetupAuto { +func Bash2(argname string, appAutoFunc func(*Auto)) *Auto { + pb := parseArgv(argname) + if pb.SetupAuto { // --bash was passed. try to configure bash-completion doBash2(argname) os.Exit(0) } - if newauto.Debug { + if pb.Debug { // dump debug info - newauto.AutoDebug() + pb.PrintDebug() } - if len(os.Args) > 1 && os.Args[1] == "--auto-complete" { - doHandlePB(newauto) - autocomplete(newauto) - if newauto.Debug { + if pb.IsAuto { + pb.doHandlePB() + if pb.Debug { + // TODO: // check here to see if there was any completion text sent // if not, send "reset bash newline\n" to cause bash to redraw PS1 for the user } + arg.Register(&argBash) + // flags := []string{pb.Arg3, pb.Arg0} + // arg.InitFlags(flags) + + appAutoFunc(pb) // run the autocomplete function the user made for their application os.Exit(0) } arg.Register(&argBash) - return newauto + return pb +} + +// also try to parse/send cur (?) +func Bash3(argname string, appAutoFunc func(*Auto), dest any) *Auto { + myAuto = new(AutoArgs) + myAuto.appName = argname + myAuto.autoFunc = appAutoFunc + + pb := parseArgv(argname) + if pb.SetupAuto { + // --bash was passed. try to configure bash-completion + doBash2(argname) + os.Exit(0) + } + + if pb.Debug { + // dump debug info + pb.PrintDebug() + } + + if pb.IsAuto { + pb.doHandlePB() + if pb.Debug { + // TODO: + // check here to see if there was any completion text sent + // if not, send "reset bash newline\n" to cause bash to redraw PS1 for the user + } + arg.Register(&argBash) + flags := []string{} + for _, s := range pb.Argv { + if s == "--autodebug" { + continue + } + flags = append(flags, s) + } + pb.Debugf("DEBUG: MustParse(%v)", flags) + var err error + myAuto.pp, err = arg.ParseFlags(flags, dest) + if err != nil { + pb.Debugf("DEBUG: Parse error: %v", err) + } + + appAutoFunc(pb) // run the autocomplete function the user made for their application + os.Exit(0) + } + + arg.Register(&argBash) + myAuto.pp = arg.MustParse(dest) + return pb } diff --git a/bash.orig.go b/bash.orig.go index 2d32a05..b539c79 100644 --- a/bash.orig.go +++ b/bash.orig.go @@ -27,11 +27,12 @@ type ArgsBash struct { var myAuto *AutoArgs type AutoArgs struct { - id int // should be unique - hidden bool // don't update the toolkits when it's hidden - Auto func([]string) - 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! + id int // should be unique + hidden bool // don't update the toolkits when it's hidden + Auto func([]string) + 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) } // argname is the name of the executable @@ -56,7 +57,7 @@ func Bash(argname string, autocomplete func([]string)) *AutoArgs { } // print out auto complete debugging info -func (pb *Auto) AutoDebug() { +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) // fmt.Println("--all --gui --verbose --force")