package install import ( "bytes" "fmt" "os" "path/filepath" "text/template" ) // (un)install in fish type fish struct { configDir string } func (f fish) Install(cmd, bin string) error { completionFile := filepath.Join(f.configDir, "completions", fmt.Sprintf("%s.fish", cmd)) completeCmd, err := f.cmd(cmd, bin) if err != nil { return err } if _, err := os.Stat(completionFile); err == nil { return fmt.Errorf("already installed at %s", completionFile) } return createFile(completionFile, completeCmd) } func (f fish) Uninstall(cmd, bin string) error { completionFile := filepath.Join(f.configDir, "completions", fmt.Sprintf("%s.fish", cmd)) if _, err := os.Stat(completionFile); err != nil { return fmt.Errorf("does not installed in %s", f.configDir) } return os.Remove(completionFile) } func (f fish) cmd(cmd, bin string) (string, error) { var buf bytes.Buffer params := struct{ Cmd, Bin string }{cmd, bin} tmpl := template.Must(template.New("cmd").Parse(` function __complete_{{.Cmd}} set -lx COMP_LINE (string join ' ' (commandline -o)) test (commandline -ct) = "" and set COMP_LINE "$COMP_LINE " {{.Bin}} end complete -c {{.Cmd}} -a "(__complete_{{.Cmd}})" `)) err := tmpl.Execute(&buf, params) if err != nil { return "", err } return buf.String(), nil }