Compare commits
4 Commits
1522a2fef0
...
87751f7c72
Author | SHA1 | Date |
---|---|---|
|
87751f7c72 | |
|
e0c508f197 | |
|
763b1a60fc | |
|
fec80aca17 |
|
@ -28,7 +28,7 @@ func doBash2(argname string) {
|
||||||
filename := filepath.Join(homeDir, ".local/share/bash-completion/completions", argname)
|
filename := filepath.Join(homeDir, ".local/share/bash-completion/completions", argname)
|
||||||
if shell.Exists(filename) {
|
if shell.Exists(filename) {
|
||||||
log.Println(filename, "file already exists")
|
log.Println(filename, "file already exists")
|
||||||
os.Exit(0)
|
// os.Exit(0)
|
||||||
}
|
}
|
||||||
basedir, _ := filepath.Split(filename)
|
basedir, _ := filepath.Split(filename)
|
||||||
if !shell.IsDir(basedir) {
|
if !shell.IsDir(basedir) {
|
||||||
|
@ -63,7 +63,7 @@ func (pb *Auto) Debugf(fmts string, parts ...any) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// makes a bash autocomplete file for your command
|
// makes a bash autocomplete file for your command
|
||||||
func doHandlePB(pb *Auto) error {
|
func (pb *Auto) doHandlePB() error {
|
||||||
homeDir, err := os.UserHomeDir()
|
homeDir, err := os.UserHomeDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -81,7 +81,8 @@ func doHandlePB(pb *Auto) error {
|
||||||
for found := range all.IterAll() {
|
for found := range all.IterAll() {
|
||||||
dur := time.Since(found.Ctime.AsTime())
|
dur := time.Since(found.Ctime.AsTime())
|
||||||
pb.Duration = durationpb.New(dur)
|
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
|
last = found
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -160,6 +161,52 @@ func (pb *Auto) Autocomplete(notsure any, sendthis string) {
|
||||||
fmt.Printf("%s", strings.Join(all, " "))
|
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 {
|
func parseArgv(argname string) *Auto {
|
||||||
newauto := new(Auto)
|
newauto := new(Auto)
|
||||||
newauto.Argname = argname
|
newauto.Argname = argname
|
||||||
|
@ -206,32 +253,109 @@ func parseArgv(argname string) *Auto {
|
||||||
newauto.Cmd = s
|
newauto.Cmd = s
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if newauto.Cmd == "" {
|
if newauto.Partial == "'"+newauto.Cmd+"'" {
|
||||||
newauto.Cmd = strings.Join(newauto.Argv, "BLAH")
|
// not really a command, it's just a partially inputed string from the user
|
||||||
|
newauto.Cmd = ""
|
||||||
}
|
}
|
||||||
return newauto
|
// if newauto.Cmd == "" {
|
||||||
|
// newauto.Cmd = strings.Join(newauto.Argv, "BLAH")
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
return newauto
|
return newauto
|
||||||
}
|
}
|
||||||
|
|
||||||
// also try to parse/send cur (?)
|
// also try to parse/send cur (?)
|
||||||
func Bash2(argname string, autocomplete func(*Auto)) {
|
func Bash2(argname string, appAutoFunc func(*Auto)) *Auto {
|
||||||
newauto := parseArgv(argname)
|
pb := parseArgv(argname)
|
||||||
if newauto.SetupAuto {
|
if pb.SetupAuto {
|
||||||
|
// --bash was passed. try to configure bash-completion
|
||||||
doBash2(argname)
|
doBash2(argname)
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
if newauto.Debug {
|
if pb.Debug {
|
||||||
// dump debug info
|
// dump debug info
|
||||||
newauto.AutoDebug()
|
pb.PrintDebug()
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(os.Args) > 1 && os.Args[1] == "--auto-complete" {
|
if pb.IsAuto {
|
||||||
doHandlePB(newauto)
|
pb.doHandlePB()
|
||||||
autocomplete(newauto)
|
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)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
arg.Register(&argBash)
|
arg.Register(&argBash)
|
||||||
|
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() // read in the history protobuf file
|
||||||
|
|
||||||
|
// turn on debugging if duration < 200 milliseconds
|
||||||
|
dur := pb.Duration.AsDuration()
|
||||||
|
if dur < time.Millisecond*200 {
|
||||||
|
pb.Debug = true
|
||||||
|
}
|
||||||
|
|
||||||
|
arg.Register(&argBash)
|
||||||
|
flags := []string{}
|
||||||
|
for _, s := range pb.Argv {
|
||||||
|
if s == "--autodebug" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
flags = append(flags, s)
|
||||||
|
}
|
||||||
|
// pb.Debug = true
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
if myAuto.pp == nil {
|
||||||
|
pb.Debugf("DEBUG: myAuto.pp == nil after ParseFlags()")
|
||||||
|
} else {
|
||||||
|
pb.Debugf("DEBUG: myAuto.pp is ok after ParseFlags()")
|
||||||
|
}
|
||||||
|
|
||||||
|
appAutoFunc(pb) // run the autocomplete function the user made for their application
|
||||||
|
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
|
||||||
|
}
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
arg.Register(&argBash)
|
||||||
|
myAuto.pp = arg.MustParse(dest)
|
||||||
|
return pb
|
||||||
}
|
}
|
|
@ -13,35 +13,33 @@ import (
|
||||||
"go.wit.com/log"
|
"go.wit.com/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
var argBash ArgsBash
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This struct can be used with the go-arg package. These
|
This struct can be used with the go-arg package. These
|
||||||
are the generic default command line arguments for the 'GUI' package
|
are the generic default command line arguments for the 'GUI' package
|
||||||
*/
|
*/
|
||||||
|
var argBash ArgsBash
|
||||||
|
|
||||||
type ArgsBash struct {
|
type ArgsBash struct {
|
||||||
Bash bool `arg:"--bash" help:"generate bash completion"`
|
Bash bool `arg:"--bash" help:"generate bash completion"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var myBash *BashAuto
|
// try this struct out (?)
|
||||||
|
var myAuto *AutoArgs
|
||||||
|
|
||||||
type BashAuto struct {
|
type AutoArgs struct {
|
||||||
id int // should be unique
|
id int // should be unique
|
||||||
hidden bool // don't update the toolkits when it's hidden
|
hidden bool // don't update the toolkits when it's hidden
|
||||||
Auto func([]string)
|
Auto func([]string)
|
||||||
appName string // a good way to track the name of the binary ?
|
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
func dumpjunk() {
|
|
||||||
fmt.Fprintln(os.Stderr, "")
|
|
||||||
fmt.Fprintln(os.Stderr, os.Args)
|
|
||||||
os.Exit(0)
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// argname is the name of the executable
|
// argname is the name of the executable
|
||||||
func Bash(argname string, autocomplete func([]string)) *BashAuto {
|
func Bash(argname string, autocomplete func([]string)) *AutoArgs {
|
||||||
|
myAuto = new(AutoArgs)
|
||||||
|
myAuto.appName = argname
|
||||||
|
|
||||||
if len(os.Args) > 1 && os.Args[1] == "--bash" {
|
if len(os.Args) > 1 && os.Args[1] == "--bash" {
|
||||||
doBash(argname)
|
doBash(argname)
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
|
@ -54,15 +52,12 @@ func Bash(argname string, autocomplete func([]string)) *BashAuto {
|
||||||
|
|
||||||
arg.Register(&argBash)
|
arg.Register(&argBash)
|
||||||
|
|
||||||
myBash = new(BashAuto)
|
|
||||||
myBash.appName = argname
|
|
||||||
|
|
||||||
// parse go.Arg here?
|
// parse go.Arg here?
|
||||||
return myBash
|
return myAuto
|
||||||
}
|
}
|
||||||
|
|
||||||
// print out auto complete debugging info
|
// print out auto complete debugging info
|
||||||
func (pb *Auto) AutoDebug() {
|
func (pb *Auto) PrintDebug() {
|
||||||
dur := pb.Duration.AsDuration()
|
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)
|
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")
|
// fmt.Println("--all --gui --verbose --force")
|
||||||
|
@ -84,7 +79,7 @@ func GetLast(cur string, argv []string) string {
|
||||||
|
|
||||||
// returns the name of the executable registered for shell autocomplete
|
// returns the name of the executable registered for shell autocomplete
|
||||||
func AppName() string {
|
func AppName() string {
|
||||||
return myBash.appName
|
return myAuto.appName
|
||||||
}
|
}
|
||||||
|
|
||||||
// makes a bash autocomplete file for your command
|
// makes a bash autocomplete file for your command
|
|
@ -0,0 +1,18 @@
|
||||||
|
_cd_complete()
|
||||||
|
{
|
||||||
|
# sets local to this func vars
|
||||||
|
local cur prev all
|
||||||
|
cur=${COMP_WORDS[COMP_CWORD]}
|
||||||
|
# prev=${COMP_WORDS[COMP_CWORD-1]}
|
||||||
|
all=${COMP_WORDS[@]}
|
||||||
|
|
||||||
|
# this is where we generate the go-arg output
|
||||||
|
GOARGS=$(smartcd --auto-complete \'$cur\' $all)
|
||||||
|
|
||||||
|
# this compares the command line input from the user
|
||||||
|
# to whatever strings we output
|
||||||
|
COMPREPLY=( $(compgen -W "$GOARGS" -- $cur) ) # THIS WORKS
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
complete -F _cd_complete cd
|
||||||
|
|
Loading…
Reference in New Issue