another stab at autocomplete
This commit is contained in:
parent
763b1a60fc
commit
e0c508f197
132
bash.new.go
132
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
|
||||
}
|
||||
|
|
13
bash.orig.go
13
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")
|
||||
|
|
Loading…
Reference in New Issue