mirror of
https://github.com/go-task/task.git
synced 2026-07-10 04:22:03 +02:00
Engine: - Emit DirectiveKeepOrder for task variables so the `requires` declaration order is preserved instead of being sorted by the shell. - Return full `--flag=value` candidates for the inline `--output=` form so all shells match against the whole current token. - Add `--no-aliases` / `--no-descriptions` completion flags (via complete.Options) parsed from the __complete invocation; the zsh wrapper maps its show-aliases and verbose zstyles onto them. - Skip Taskfile setup when completing flags (NeedsTaskfile) and load the task list lazily; drop unused parameters; document exported identifiers. Shell wrappers: - zsh: reindent to tabs (.editorconfig), bridge zstyles to engine flags. - fish: reindent to 2 spaces, handle every file-completion directive in the wrapper (--no-files disables the native fallback), drop the duplicated yml/yaml extension list now that it lives only in the engine. - bash: prefix-filter by hand to preserve values containing spaces, exclude `=` from word breaks so `--output=` reaches the engine as one token. - powershell: filter candidates by the current word, fall back to file completion for DirectiveDefault. NoSpace is not representable in fish/PowerShell completion APIs; documented in the wrappers.
75 lines
2.0 KiB
Go
75 lines
2.0 KiB
Go
package complete
|
|
|
|
import (
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/spf13/pflag"
|
|
)
|
|
|
|
// flagEnums lists allowed values for enum-style flags. Keep in sync with the
|
|
// help strings in internal/flags/flags.go.
|
|
var flagEnums = map[string][]string{
|
|
"output": {"interleaved", "group", "prefixed"},
|
|
"sort": {"default", "alphanumeric", "none"},
|
|
"completion": {"bash", "zsh", "fish", "powershell"},
|
|
}
|
|
|
|
// flagDirective maps value-taking flags to a file-completion directive.
|
|
// DirectiveDefault entries (and any flag absent here) fall back to the shell's
|
|
// default file completion.
|
|
var flagDirective = map[string]Directive{
|
|
"taskfile": DirectiveFilterFileExt,
|
|
"dir": DirectiveFilterDirs,
|
|
"remote-cache-dir": DirectiveFilterDirs,
|
|
"cacert": DirectiveDefault,
|
|
"cert": DirectiveDefault,
|
|
"cert-key": DirectiveDefault,
|
|
}
|
|
|
|
var taskfileExtensions = []string{"yml", "yaml"}
|
|
|
|
// flagTakesValue is false for boolean switches (NoOptDefVal == "true").
|
|
func flagTakesValue(f *pflag.Flag) bool {
|
|
return f.NoOptDefVal == ""
|
|
}
|
|
|
|
// listFlags walks fs at call time so experiment-gated flags appear or
|
|
// disappear based on the active experiments.
|
|
func listFlags(fs *pflag.FlagSet) []Suggestion {
|
|
if fs == nil {
|
|
return nil
|
|
}
|
|
out := make([]Suggestion, 0, 64)
|
|
fs.VisitAll(func(f *pflag.Flag) {
|
|
if f.Hidden || f.Deprecated != "" {
|
|
return
|
|
}
|
|
out = append(out, Suggestion{
|
|
Value: "--" + f.Name,
|
|
Description: f.Usage,
|
|
})
|
|
if f.Shorthand != "" {
|
|
out = append(out, Suggestion{
|
|
Value: "-" + f.Shorthand,
|
|
Description: f.Usage,
|
|
})
|
|
}
|
|
})
|
|
sort.Slice(out, func(i, j int) bool { return out[i].Value < out[j].Value })
|
|
return out
|
|
}
|
|
|
|
func matchFlagName(fs *pflag.FlagSet, word string) *pflag.Flag {
|
|
if fs == nil {
|
|
return nil
|
|
}
|
|
switch {
|
|
case strings.HasPrefix(word, "--"):
|
|
return fs.Lookup(strings.TrimPrefix(word, "--"))
|
|
case strings.HasPrefix(word, "-") && len(word) == 2:
|
|
return fs.ShorthandLookup(word[1:])
|
|
}
|
|
return nil
|
|
}
|