diff options
Diffstat (limited to 'makeAutocompleteFiles.bash.go')
| -rw-r--r-- | makeAutocompleteFiles.bash.go | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/makeAutocompleteFiles.bash.go b/makeAutocompleteFiles.bash.go new file mode 100644 index 0000000..0cef75c --- /dev/null +++ b/makeAutocompleteFiles.bash.go @@ -0,0 +1,156 @@ +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/<pid>/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 "$@" + +*/ |
