summaryrefslogtreecommitdiff
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
parent763b1a60fcc9c6c0e6751859a6c06c81372d0268 (diff)
another stab at autocomplete
-rw-r--r--bash.new.go132
-rw-r--r--bash.orig.go13
2 files changed, 127 insertions, 18 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
}
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")