summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-09-09 02:05:08 -0500
committerJeff Carr <[email protected]>2025-09-09 02:05:08 -0500
commit4d2f24f64e894c4af978fc8d1dd8886e897dec3d (patch)
tree1929c3c28e91943c6666f7b903787226f1ef341e
parent084601a9bc8c261721ef03aafac2445fded53800 (diff)
add prep.Bash()v0.0.3
-rw-r--r--bash.go131
-rw-r--r--gui.go2
2 files changed, 132 insertions, 1 deletions
diff --git a/bash.go b/bash.go
new file mode 100644
index 0000000..908cde7
--- /dev/null
+++ b/bash.go
@@ -0,0 +1,131 @@
+package prep
+
+// initializes logging and command line options
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "go.wit.com/dev/alexflint/arg"
+ "go.wit.com/lib/gui/shell"
+)
+
+var argBash ArgsBash
+
+/*
+This struct can be used with the go-arg package. These
+are the generic default command line arguments for the 'GUI' package
+*/
+type ArgsBash struct {
+ Bash bool `arg:"--bash" help:"generate bash completion"`
+}
+
+var myBash *BashAuto
+
+type BashAuto struct {
+ id int // should be unique
+ hidden bool // don't update the toolkits when it's hidden
+ Auto func([]string)
+}
+
+func dumpjunk() {
+ fmt.Fprintln(os.Stderr, "")
+ fmt.Fprintln(os.Stderr, os.Args)
+ os.Exit(0)
+}
+
+// argname is the name of the executable
+func Bash(argname string, autocomplete func([]string)) *BashAuto {
+ if len(os.Args) > 1 && os.Args[1] == "--bash" {
+ doBash(argname)
+ os.Exit(0)
+ }
+
+ if len(os.Args) > 1 && os.Args[1] == "--auto-complete" {
+ autocomplete(os.Args[2:])
+ os.Exit(0)
+ }
+
+ arg.Register(&argBash)
+
+ myBash = new(BashAuto)
+
+ // parse go.Arg here?
+ return myBash
+}
+
+// makes a bash autocomplete file for your command
+func doBash(argname string) {
+ if homeDir, err := os.UserHomeDir(); err == nil {
+ filename := filepath.Join(homeDir, ".local/share/bash-completion/completions", argname)
+ if shell.Exists(filename) {
+ } else {
+ if f, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err == nil {
+ f.Write([]byte(makeBashCompletionText(argname)))
+ f.Close()
+ }
+ fmt.Println("bash file created:", filename)
+ }
+ }
+
+ fmt.Println(makeBashCompletionText(argname))
+
+ fmt.Println("restart bash")
+ os.Exit(0)
+}
+
+func makeBashCompletionText(argname string) string {
+ var out string
+
+ out += fmt.Sprintf("# add this in your bashrc:\n")
+ out += fmt.Sprintf("\n")
+ out += fmt.Sprintf("# todo: add this to go-arg as a 'hidden' go-arg option --bash\n")
+ out += fmt.Sprintf("#\n")
+ out += fmt.Sprintf("# Put the below in the file: ~/.local/share/bash-completion/completions/%s\n", argname)
+ out += fmt.Sprintf("#\n")
+ out += fmt.Sprintf("# todo: make this output work/parse with:\n")
+ out += fmt.Sprintf("# complete -C %s --bash go\n", argname)
+ out += fmt.Sprintf("\n")
+ out += fmt.Sprintf("_%s_complete()\n", argname)
+ out += fmt.Sprintf("{\n")
+ out += fmt.Sprintf(" # sets local to this func vars\n")
+ out += fmt.Sprintf(" local cur prev all\n")
+ out += fmt.Sprintf(" cur=${COMP_WORDS[COMP_CWORD]}\n")
+ out += fmt.Sprintf(" prev=${COMP_WORDS[COMP_CWORD-1]}\n")
+ out += fmt.Sprintf(" all=${COMP_WORDS[@]}\n")
+ out += fmt.Sprintf("\n")
+ out += fmt.Sprintf(" # this is where we generate the go-arg output\n")
+ out += fmt.Sprintf(" GOARGS=$(%s --auto-complete \\'$prev\\' \\'$cur\\' $all)\n", argname)
+ out += fmt.Sprintf("\n")
+ out += fmt.Sprintf(" # this compares the command line input from the user\n")
+ out += fmt.Sprintf(" # to whatever strings we output\n")
+ out += fmt.Sprintf(" COMPREPLY=( $(compgen -W \"$GOARGS\" -- $cur) ) # THIS WORKS\n")
+ out += fmt.Sprintf(" return 0\n")
+ out += fmt.Sprintf("}\n")
+ out += fmt.Sprintf("complete -F _%s_complete %s\n", argname, argname)
+ out += fmt.Sprintf("\n")
+ out += fmt.Sprintf("# copy and paste the above into your bash shell should work\n")
+ return out
+}
+
+/*
+// prints help to STDERR // TODO: move everything below this to go-args
+func (args) doBashHelp() {
+ if argv.BashAuto[1] != "''" {
+ // if this is not blank, then the user has typed something
+ return
+ }
+ if argv.BashAuto[0] != ARGNAME {
+ // if this is not the name of the command, the user already started doing something
+ return
+ }
+ if argv.BashAuto[0] == ARGNAME {
+ me.pp.WriteHelp(os.Stderr)
+ return
+ }
+ fmt.Fprintln(os.Stderr, "")
+ fmt.Fprintln(os.Stderr, "hello world")
+ fmt.Fprintln(os.Stderr, "")
+}
+*/
diff --git a/gui.go b/gui.go
index 1ebf642..73109fb 100644
--- a/gui.go
+++ b/gui.go
@@ -53,7 +53,7 @@ func postMustParse(s string) string {
}
func Gui() *gui.Node {
- arg.Register(&argDebugger)
+ arg.Register(&argGui)
return gui.PreInit(postMustParse)
}