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)) } /* This script will be placed in a directory in your $fpath (e.g., ~/.zsh/completions/_my-app). #compdef my-app # This function will be called by Zsh to get the completions. _my_app_completions() { local -a suggestions # Here is the key part: # We execute our Go program with the hidden flag and capture its output. 9 # The `(f)` flag splits the output by line into an array. 10 suggestions=( ${(f)"$(my-app --_generate_completions)"} ) 11 12 # Pass the suggestions to the Zsh completion engine. 13 _describe 'command' suggestions 14 } 15 16 # Tell Zsh to call our function when completing for my-app 17 _my_app_completions "$@" */ // zsh: /* #compdef forge # Zsh completion function for the 'forge' command. _forge_completions() { local -a words local -i CURRENT # Zsh's equivalent of Bash's COMP_WORDS and COMP_CWORD words=("${(@)words}") CURRENT=$CURRENT # Generate the completion suggestions by calling the forge command. # The output is split into an array. local -a suggestions suggestions=("${(@f)$(forge --auto-complete "'${words[CURRENT]}'" "${words[@]}")}") # Pass the suggestions to the Zsh completion system. _describe 'completions' suggestions } # Register the function to be called for the 'forge' command. _forge_completions "$@" */