summaryrefslogtreecommitdiff
path: root/internal/askcli/completion.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/askcli/completion.go')
-rw-r--r--internal/askcli/completion.go26
1 files changed, 21 insertions, 5 deletions
diff --git a/internal/askcli/completion.go b/internal/askcli/completion.go
index 6033415..5684e33 100644
--- a/internal/askcli/completion.go
+++ b/internal/askcli/completion.go
@@ -26,6 +26,7 @@ var askRootCompletionItems = []fishCompletionItem{
{name: "modify", description: "Modify task fields"},
{name: "denotate", description: "Remove an annotation"},
{name: "delete", description: "Delete a task"},
+ {name: "fish", description: "Emit Fish shell completion script"},
{name: "help", description: "Show help"},
}
@@ -49,10 +50,14 @@ var askUUIDCompletionItems = []fishCompletionItem{
}
func FishCompletion() string {
+ return FishCompletionFor("ask")
+}
+
+func FishCompletionFor(binaryPath string) string {
var b strings.Builder
writeFishPreamble(&b)
writeFishContextFunctions(&b)
- writeFishTaskUUIDFunction(&b)
+ writeFishTaskUUIDFunction(&b, binaryPath)
b.WriteString("complete -c ask -f\n")
b.WriteString("complete -c ask -s j -l json -d 'Emit JSON output'\n")
for _, item := range askRootCompletionItems {
@@ -68,8 +73,7 @@ func FishCompletion() string {
func writeFishPreamble(b *strings.Builder) {
b.WriteString("# Fish completion for ask.\n")
- b.WriteString("# Install as ~/.config/fish/completions/ask.fish or")
- b.WriteString(" $XDG_CONFIG_HOME/fish/completions/ask.fish.\n\n")
+ b.WriteString("# Source with: ask fish | source\n\n")
}
func writeFishContextFunctions(b *strings.Builder) {
@@ -177,14 +181,17 @@ func writeFishDepUUIDContextFunction(b *strings.Builder) {
b.WriteString("end\n\n")
}
-func writeFishTaskUUIDFunction(b *strings.Builder) {
+func writeFishTaskUUIDFunction(b *strings.Builder, binaryPath string) {
b.WriteString("function __ask_task_uuids\n")
+ b.WriteString(" set -l ask_bin ")
+ b.WriteString(quoteFishString(binaryPath))
+ b.WriteString("\n")
b.WriteString(" set -l now (date +%s)\n")
b.WriteString(" if set -q __ask_task_uuid_cache_until; and test $__ask_task_uuid_cache_until -ge $now\n")
b.WriteString(" printf '%s\\n' $__ask_task_uuid_cache\n")
b.WriteString(" return 0\n")
b.WriteString(" end\n")
- b.WriteString(" set -l uuids (command ask complete-uuids 2>/dev/null)\n")
+ b.WriteString(" set -l uuids (command $ask_bin complete-uuids 2>/dev/null)\n")
b.WriteString(" if test $status -ne 0\n")
b.WriteString(" return 1\n")
b.WriteString(" end\n")
@@ -211,3 +218,12 @@ func writeFishUUIDCompletionLine(b *strings.Builder, condition, description stri
b.WriteString(strings.ReplaceAll(description, "'", "\\'"))
b.WriteString("'\n")
}
+
+func quoteFishString(value string) string {
+ replacer := strings.NewReplacer(
+ "\\", "\\\\",
+ "\"", "\\\"",
+ "$", "\\$",
+ )
+ return `"` + replacer.Replace(value) + `"`
+}