package prep // initializes logging and command line options import ( "fmt" "io/ioutil" "os" "strings" ) // deprecate this func Bash3(dest any) *Auto { return Autocomplete(dest) } // deprecate this func Bash(dest any) *Auto { return Autocomplete(dest) } func makeCompletionText(argname string) string { sh := getParentProcessName() return fmt.Sprintf("# shell might be %s", sh) } 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 } func makeBashCompletionText2(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 \\'$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 } func getParentProcessName() string { ppid := os.Getppid() // On Linux, the command name is in /proc//comm commPath := fmt.Sprintf("/proc/%d/comm", ppid) content, err := ioutil.ReadFile(commPath) if err != nil { return "unknown" } // The file content has a trailing newline, so trim it. return strings.TrimSpace(string(content)) }