summaryrefslogtreecommitdiff
path: root/bash.new.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-09-18 15:27:46 -0500
committerJeff Carr <[email protected]>2025-09-18 15:27:46 -0500
commite0c508f1971d831c0a247257790ebf8cb6840e87 (patch)
treefea833160dfa82e341eaf15c2d4ddce3acebcb29 /bash.new.go
parent763b1a60fcc9c6c0e6751859a6c06c81372d0268 (diff)
another stab at autocomplete
Diffstat (limited to 'bash.new.go')
-rw-r--r--bash.new.go132
1 files changed, 120 insertions, 12 deletions
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
}