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.go132
1 files changed, 78 insertions, 54 deletions
diff --git a/internal/askcli/completion.go b/internal/askcli/completion.go
index 4d4b5d3..79dd923 100644
--- a/internal/askcli/completion.go
+++ b/internal/askcli/completion.go
@@ -1,6 +1,7 @@
package askcli
import (
+ "path/filepath"
"strings"
)
@@ -54,43 +55,60 @@ func fishAddDependencyModifierCompletionContext(positional []string, current str
return current == "depends" || strings.HasPrefix(current, "depends:")
}
-// FishCompletion returns the default Fish completion script for the do CLI.
+// FishCompletion returns the default Fish completion script for the ask CLI.
func FishCompletion() string {
- return FishCompletionFor("do")
+ return FishCompletionFor("ask")
+}
+
+// fishShellCommandName returns the argv0 basename used for `complete -c` wiring.
+func fishShellCommandName(binaryPath string) string {
+ first := strings.TrimSpace(binaryPath)
+ if i := strings.IndexByte(first, ' '); i >= 0 {
+ first = first[:i]
+ }
+ return filepath.Base(first)
}
// FishCompletionFor returns a Fish completion script that points to the provided binary path.
func FishCompletionFor(binaryPath string) string {
+ cmd := fishShellCommandName(binaryPath)
var b strings.Builder
- writeFishPreamble(&b)
+ writeFishPreamble(&b, cmd)
writeFishContextFunctions(&b)
writeFishTaskSelectorFunction(&b, binaryPath)
writeFishAddDependencyModifierFunction(&b)
- b.WriteString("complete -c do -f\n")
- b.WriteString("complete -c do -s j -l json -d 'Emit JSON output'\n")
+ b.WriteString("complete -c ")
+ b.WriteString(cmd)
+ b.WriteString(" -f\n")
+ b.WriteString("complete -c ")
+ b.WriteString(cmd)
+ b.WriteString(" -s j -l json -d 'Emit JSON output'\n")
for _, item := range []fishCompletionItem{
{name: "na", description: "Run against project tasks without +agent"},
{name: "no-agent", description: "Run against project tasks without +agent"},
{name: "proj:", description: "Run against an explicit project"},
} {
- writeFishCompletionLine(&b, "__do_needs_root_completion", item)
+ writeFishCompletionLine(&b, cmd, "__ask_needs_root_completion", item)
}
for _, entry := range commandRegistry.rootCompletionEntries() {
item := fishCompletionItem{name: entry.name, description: entry.description}
- writeFishCompletionLine(&b, "__do_needs_command_completion", item)
+ writeFishCompletionLine(&b, cmd, "__ask_needs_command_completion", item)
}
for _, item := range askDepCompletionItems {
- writeFishCompletionLine(&b, "__do_in_dep_context", item)
+ writeFishCompletionLine(&b, cmd, "__ask_in_dep_context", item)
}
- writeFishUUIDCompletionLine(&b, "__do_in_uuid_context", "Task selector")
- writeFishUUIDCompletionLine(&b, "__do_in_dep_uuid_context", "Task selector")
- writeFishFunctionCompletionLine(&b, "__do_in_add_dep_modifier_context", "__do_add_dependency_modifiers", "Task dependency")
+ writeFishUUIDCompletionLine(&b, cmd, "__ask_in_uuid_context", "Task selector")
+ writeFishUUIDCompletionLine(&b, cmd, "__ask_in_dep_uuid_context", "Task selector")
+ writeFishFunctionCompletionLine(&b, cmd, "__ask_in_add_dep_modifier_context", "__ask_add_dependency_modifiers", "Task dependency")
return b.String()
}
-func writeFishPreamble(b *strings.Builder) {
- b.WriteString("# Fish completion for do.\n")
- b.WriteString("# Source with: do fish | source\n\n")
+func writeFishPreamble(b *strings.Builder, cmd string) {
+ b.WriteString("# Fish completion for ")
+ b.WriteString(cmd)
+ b.WriteString(".\n# Source with: ")
+ b.WriteString(cmd)
+ b.WriteString(" fish | source\n\n")
}
func writeFishContextFunctions(b *strings.Builder) {
@@ -106,7 +124,7 @@ func writeFishContextFunctions(b *strings.Builder) {
}
func writeFishPositionalTokensFunction(b *strings.Builder) {
- b.WriteString("function __do_positional_tokens\n")
+ b.WriteString("function __ask_positional_tokens\n")
b.WriteString(" set -l tokens (commandline -opc)\n")
b.WriteString(" set -l positional\n")
b.WriteString(" for token in $tokens[2..-1]\n")
@@ -122,11 +140,11 @@ func writeFishPositionalTokensFunction(b *strings.Builder) {
}
func writeFishCommandPositionalsFunction(b *strings.Builder) {
- b.WriteString("function __do_command_positionals\n")
- b.WriteString(" set -l positional (__do_positional_tokens)\n")
+ b.WriteString("function __ask_command_positionals\n")
+ b.WriteString(" set -l positional (__ask_positional_tokens)\n")
b.WriteString(" while test (count $positional) -gt 0\n")
b.WriteString(" switch $positional[1]\n")
- b.WriteString(" case na no-agent proj:*\n")
+ b.WriteString(" case na no-agent 'proj:*'\n")
b.WriteString(" set positional $positional[2..-1]\n")
b.WriteString(" case '*'\n")
b.WriteString(" break\n")
@@ -139,11 +157,11 @@ func writeFishCommandPositionalsFunction(b *strings.Builder) {
}
func writeFishScopePrefixFunction(b *strings.Builder) {
- b.WriteString("function __do_scope_prefix\n")
- b.WriteString(" set -l positional (__do_positional_tokens)\n")
+ b.WriteString("function __ask_scope_prefix\n")
+ b.WriteString(" set -l positional (__ask_positional_tokens)\n")
b.WriteString(" while test (count $positional) -gt 0\n")
b.WriteString(" switch $positional[1]\n")
- b.WriteString(" case na no-agent proj:*\n")
+ b.WriteString(" case na no-agent 'proj:*'\n")
b.WriteString(" printf '%s\\n' $positional[1]\n")
b.WriteString(" set positional $positional[2..-1]\n")
b.WriteString(" case '*'\n")
@@ -155,8 +173,8 @@ func writeFishScopePrefixFunction(b *strings.Builder) {
}
func writeFishNeedsRootCompletionFunction(b *strings.Builder) {
- b.WriteString("function __do_needs_root_completion\n")
- b.WriteString(" set -l positional (__do_positional_tokens)\n")
+ b.WriteString("function __ask_needs_root_completion\n")
+ b.WriteString(" set -l positional (__ask_positional_tokens)\n")
b.WriteString(" if test (count $positional) -eq 0\n")
b.WriteString(" return 0\n")
b.WriteString(" end\n")
@@ -165,14 +183,14 @@ func writeFishNeedsRootCompletionFunction(b *strings.Builder) {
}
func writeFishNeedsCommandCompletionFunction(b *strings.Builder) {
- b.WriteString("function __do_needs_command_completion\n")
- b.WriteString(" set -l positional (__do_positional_tokens)\n")
+ b.WriteString("function __ask_needs_command_completion\n")
+ b.WriteString(" set -l positional (__ask_positional_tokens)\n")
b.WriteString(" if test (count $positional) -eq 0\n")
b.WriteString(" return 0\n")
b.WriteString(" end\n")
b.WriteString(" if test (count $positional) -eq 1\n")
b.WriteString(" switch $positional[1]\n")
- b.WriteString(" case na no-agent proj:*\n")
+ b.WriteString(" case na no-agent 'proj:*'\n")
b.WriteString(" return 0\n")
b.WriteString(" end\n")
b.WriteString(" end\n")
@@ -181,8 +199,8 @@ func writeFishNeedsCommandCompletionFunction(b *strings.Builder) {
}
func writeFishDepContextFunction(b *strings.Builder) {
- b.WriteString("function __do_in_dep_context\n")
- b.WriteString(" set -l positional (__do_command_positionals)\n")
+ b.WriteString("function __ask_in_dep_context\n")
+ b.WriteString(" set -l positional (__ask_command_positionals)\n")
b.WriteString(" if test (count $positional) -lt 1\n")
b.WriteString(" return 1\n")
b.WriteString(" end\n")
@@ -194,8 +212,8 @@ func writeFishDepContextFunction(b *strings.Builder) {
}
func writeFishUUIDContextFunction(b *strings.Builder) {
- b.WriteString("function __do_in_uuid_context\n")
- b.WriteString(" set -l positional (__do_command_positionals)\n")
+ b.WriteString("function __ask_in_uuid_context\n")
+ b.WriteString(" set -l positional (__ask_command_positionals)\n")
b.WriteString(" if test (count $positional) -eq 0\n")
b.WriteString(" return 1\n")
b.WriteString(" end\n")
@@ -215,8 +233,8 @@ func writeFishUUIDContextFunction(b *strings.Builder) {
}
func writeFishDepUUIDContextFunction(b *strings.Builder) {
- b.WriteString("function __do_in_dep_uuid_context\n")
- b.WriteString(" set -l positional (__do_command_positionals)\n")
+ b.WriteString("function __ask_in_dep_uuid_context\n")
+ b.WriteString(" set -l positional (__ask_command_positionals)\n")
b.WriteString(" if test (count $positional) -lt 2\n")
b.WriteString(" return 1\n")
b.WriteString(" end\n")
@@ -240,8 +258,8 @@ func writeFishDepUUIDContextFunction(b *strings.Builder) {
}
func writeFishAddDependencyModifierContextFunction(b *strings.Builder) {
- b.WriteString("function __do_in_add_dep_modifier_context\n")
- b.WriteString(" set -l positional (__do_command_positionals)\n")
+ b.WriteString("function __ask_in_add_dep_modifier_context\n")
+ b.WriteString(" set -l positional (__ask_command_positionals)\n")
b.WriteString(" if test (count $positional) -lt 1\n")
b.WriteString(" return 1\n")
b.WriteString(" end\n")
@@ -257,38 +275,38 @@ func writeFishAddDependencyModifierContextFunction(b *strings.Builder) {
}
func writeFishTaskSelectorFunction(b *strings.Builder, binaryPath string) {
- b.WriteString("function __do_task_selectors\n")
- b.WriteString(" set -l do_bin ")
+ b.WriteString("function __ask_task_selectors\n")
+ b.WriteString(" set -l ask_bin ")
b.WriteString(quoteFishString(binaryPath))
b.WriteString("\n")
- b.WriteString(" set -l scope_prefix (__do_scope_prefix)\n")
+ b.WriteString(" set -l scope_prefix (__ask_scope_prefix)\n")
b.WriteString(" set -l cache_key default\n")
b.WriteString(" if test (count $scope_prefix) -gt 0\n")
b.WriteString(" set cache_key (string join ' ' $scope_prefix)\n")
b.WriteString(" end\n")
b.WriteString(" set -l now (date +%s)\n")
- b.WriteString(" if set -q __do_task_selector_cache_until; and test $__do_task_selector_cache_until -ge $now; and set -q __do_task_selector_cache_key; and test \"$__do_task_selector_cache_key\" = \"$cache_key\"\n")
- b.WriteString(" printf '%s\\n' $__do_task_selector_cache\n")
+ b.WriteString(" if set -q __ask_task_selector_cache_until; and test $__ask_task_selector_cache_until -ge $now; and set -q __ask_task_selector_cache_key; and test \"$__ask_task_selector_cache_key\" = \"$cache_key\"\n")
+ b.WriteString(" printf '%s\\n' $__ask_task_selector_cache\n")
b.WriteString(" return 0\n")
b.WriteString(" end\n")
b.WriteString(" set -l selectors\n")
b.WriteString(" if test (count $scope_prefix) -gt 0\n")
- b.WriteString(" set selectors (command $do_bin $scope_prefix complete-aliases 2>/dev/null)\n")
+ b.WriteString(" set selectors (command $ask_bin $scope_prefix complete-aliases 2>/dev/null)\n")
b.WriteString(" else\n")
- b.WriteString(" set selectors (command $do_bin complete-aliases 2>/dev/null)\n")
+ b.WriteString(" set selectors (command $ask_bin complete-aliases 2>/dev/null)\n")
b.WriteString(" end\n")
b.WriteString(" if test $status -ne 0\n")
b.WriteString(" return 1\n")
b.WriteString(" end\n")
- b.WriteString(" set -g __do_task_selector_cache $selectors\n")
- b.WriteString(" set -g __do_task_selector_cache_until (math $now + 2)\n")
- b.WriteString(" set -g __do_task_selector_cache_key $cache_key\n")
+ b.WriteString(" set -g __ask_task_selector_cache $selectors\n")
+ b.WriteString(" set -g __ask_task_selector_cache_until (math $now + 2)\n")
+ b.WriteString(" set -g __ask_task_selector_cache_key $cache_key\n")
b.WriteString(" printf '%s\\n' $selectors\n")
b.WriteString("end\n\n")
}
func writeFishAddDependencyModifierFunction(b *strings.Builder) {
- b.WriteString("function __do_add_dependency_modifiers\n")
+ b.WriteString("function __ask_add_dependency_modifiers\n")
b.WriteString(" set -l current (commandline -ct)\n")
b.WriteString(" if test $current = depends\n")
b.WriteString(" printf '%s\\n' 'depends:'\n")
@@ -307,9 +325,9 @@ func writeFishAddDependencyModifierFunction(b *strings.Builder) {
b.WriteString(" set chosen $pieces[1..-2]\n")
b.WriteString(" end\n")
b.WriteString(" end\n")
- // Each item from __do_task_selectors is "selector\tdescription"; extract
+ // Each item from __ask_task_selectors is "selector\tdescription"; extract
// just the selector (before the tab) for matching and output purposes.
- b.WriteString(" for item in (__do_task_selectors)\n")
+ b.WriteString(" for item in (__ask_task_selectors)\n")
b.WriteString(" set -l selector (string split -m1 '\\t' -- $item)[1]\n")
b.WriteString(" if contains -- $selector $chosen\n")
b.WriteString(" continue\n")
@@ -326,8 +344,10 @@ func writeFishAddDependencyModifierFunction(b *strings.Builder) {
b.WriteString("end\n\n")
}
-func writeFishCompletionLine(b *strings.Builder, condition string, item fishCompletionItem) {
- b.WriteString("complete -c do -n '")
+func writeFishCompletionLine(b *strings.Builder, cmd, condition string, item fishCompletionItem) {
+ b.WriteString("complete -c ")
+ b.WriteString(cmd)
+ b.WriteString(" -n '")
b.WriteString(condition)
b.WriteString("' -a '")
b.WriteString(item.name)
@@ -336,16 +356,20 @@ func writeFishCompletionLine(b *strings.Builder, condition string, item fishComp
b.WriteString("'\n")
}
-func writeFishUUIDCompletionLine(b *strings.Builder, condition, description string) {
- b.WriteString("complete -c do -n '")
+func writeFishUUIDCompletionLine(b *strings.Builder, cmd, condition, description string) {
+ b.WriteString("complete -c ")
+ b.WriteString(cmd)
+ b.WriteString(" -n '")
b.WriteString(condition)
- b.WriteString("' -a '(__do_task_selectors)' -d '")
+ b.WriteString("' -a '(__ask_task_selectors)' -d '")
b.WriteString(strings.ReplaceAll(description, "'", "\\'"))
b.WriteString("'\n")
}
-func writeFishFunctionCompletionLine(b *strings.Builder, condition, functionName, description string) {
- b.WriteString("complete -c do -n '")
+func writeFishFunctionCompletionLine(b *strings.Builder, cmd, condition, functionName, description string) {
+ b.WriteString("complete -c ")
+ b.WriteString(cmd)
+ b.WriteString(" -n '")
b.WriteString(condition)
b.WriteString("' -a '(")
b.WriteString(functionName)