summaryrefslogtreecommitdiff
path: root/install/fish.go
diff options
context:
space:
mode:
Diffstat (limited to 'install/fish.go')
-rw-r--r--install/fish.go69
1 files changed, 69 insertions, 0 deletions
diff --git a/install/fish.go b/install/fish.go
new file mode 100644
index 0000000..2b64bfc
--- /dev/null
+++ b/install/fish.go
@@ -0,0 +1,69 @@
+package install
+
+import (
+ "bytes"
+ "fmt"
+ "os"
+ "path/filepath"
+ "text/template"
+)
+
+// (un)install in fish
+
+type fish struct {
+ configDir string
+}
+
+func (f fish) IsInstalled(cmd, bin string) bool {
+ completionFile := f.getCompletionFilePath(cmd)
+ if _, err := os.Stat(completionFile); err == nil {
+ return true
+ }
+ return false
+}
+
+func (f fish) Install(cmd, bin string) error {
+ if f.IsInstalled(cmd, bin) {
+ return fmt.Errorf("already installed at %s", f.getCompletionFilePath(cmd))
+ }
+
+ completionFile := f.getCompletionFilePath(cmd)
+ completeCmd, err := f.cmd(cmd, bin)
+ if err != nil {
+ return err
+ }
+
+ return createFile(completionFile, completeCmd)
+}
+
+func (f fish) Uninstall(cmd, bin string) error {
+ if !f.IsInstalled(cmd, bin) {
+ return fmt.Errorf("does not installed in %s", f.configDir)
+ }
+
+ completionFile := f.getCompletionFilePath(cmd)
+ return os.Remove(completionFile)
+}
+
+func (f fish) getCompletionFilePath(cmd string) string {
+ return filepath.Join(f.configDir, "completions", fmt.Sprintf("%s.fish", cmd))
+}
+
+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 (commandline -cp)
+ test -z (commandline -ct)
+ and set COMP_LINE "$COMP_LINE "
+ {{.Bin}}
+end
+complete -f -c {{.Cmd}} -a "(__complete_{{.Cmd}})"
+`))
+ err := tmpl.Execute(&buf, params)
+ if err != nil {
+ return "", err
+ }
+ return buf.String(), nil
+}