From 557aa4ec097267ff31e34a5c2fdd7b256e42d1be Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 23 Oct 2025 10:47:06 -0700 Subject: [PATCH] fixing auto complete (#7365) * fixing auto complete * Update weed/command/autocomplete.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update weed/command/autocomplete.go Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- weed/command/autocomplete.go | 74 +++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 5 deletions(-) diff --git a/weed/command/autocomplete.go b/weed/command/autocomplete.go index f63c8df41..d9e4c6b04 100644 --- a/weed/command/autocomplete.go +++ b/weed/command/autocomplete.go @@ -2,6 +2,8 @@ package command import ( "fmt" + "os" + "path/filepath" "github.com/posener/complete" completeinstall "github.com/posener/complete/cmd/install" flag "github.com/seaweedfs/seaweedfs/weed/util/fla9" @@ -39,6 +41,40 @@ func AutocompleteMain(commands []*Command) bool { return cmp.Complete() } +func printAutocompleteScript(shell string) bool { + bin, err := os.Executable() + if err != nil { + fmt.Fprintf(os.Stderr, "failed to get executable path: %s\n", err) + return false + } + binPath, err := filepath.Abs(bin) + if err != nil { + fmt.Fprintf(os.Stderr, "failed to get absolute path: %s\n", err) + return false + } + + switch shell { + case "bash": + fmt.Printf("complete -C %q weed\n", binPath) + case "zsh": + fmt.Printf("autoload -U +X bashcompinit && bashcompinit\n") + fmt.Printf("complete -o nospace -C %q weed\n", binPath) + case "fish": + fmt.Printf(`function __complete_weed + set -lx COMP_LINE (commandline -cp) + test -z (commandline -ct) + and set COMP_LINE "$COMP_LINE " + %q +end +complete -f -c weed -a "(__complete_weed)" +`, binPath) + default: + fmt.Fprintf(os.Stderr, "unsupported shell: %s. Supported shells: bash, zsh, fish\n", shell) + return false + } + return true +} + func installAutoCompletion() bool { if runtime.GOOS == "windows" { fmt.Println("Windows is not supported") @@ -71,9 +107,25 @@ func uninstallAutoCompletion() bool { var cmdAutocomplete = &Command{ Run: runAutocomplete, - UsageLine: "autocomplete", - Short: "install autocomplete", - Long: `weed autocomplete is installed in the shell. + UsageLine: "autocomplete [shell]", + Short: "generate or install shell autocomplete script", + Long: `Generate shell autocomplete script or install it to your shell configuration. + +Usage: + weed autocomplete [bash|zsh|fish] # print autocomplete script to stdout + weed autocomplete install # install to shell config files + + When a shell name is provided, the autocomplete script is printed to stdout. + You can then add it to your shell configuration manually, e.g.: + + # For bash: + weed autocomplete bash >> ~/.bashrc + + # Or use eval in your shell config: + eval "$(weed autocomplete bash)" + + When 'install' is provided (or no argument), the script is automatically + installed to your shell configuration files. Supported shells are bash, zsh, and fish. Windows is not supported. @@ -82,11 +134,23 @@ var cmdAutocomplete = &Command{ } func runAutocomplete(cmd *Command, args []string) bool { - if len(args) != 0 { + if len(args) == 0 { + // Default behavior: install + return installAutoCompletion() + } + + if len(args) > 1 { cmd.Usage() + return false + } + + shell := args[0] + if shell == "install" { + return installAutoCompletion() } - return installAutoCompletion() + // Print the autocomplete script for the specified shell + return printAutocompleteScript(shell) } var cmdUnautocomplete = &Command{