zsh-completion template refactoring:

- removed redundant function
- improved other functions :)
- better names for other functions
This commit is contained in:
Haim Ashkenazi 2018-02-28 12:49:53 +02:00 committed by Steve Francia
parent 2662787697
commit e8018e8612

View File

@ -4,7 +4,6 @@ import (
"fmt" "fmt"
"io" "io"
"os" "os"
"strings"
"text/template" "text/template"
"github.com/spf13/pflag" "github.com/spf13/pflag"
@ -12,11 +11,9 @@ import (
var ( var (
funcMap = template.FuncMap{ funcMap = template.FuncMap{
"constructPath": constructPath, "genZshFuncName": generateZshCompletionFuncName,
"subCmdList": subCmdList, "extractFlags": extractFlags,
"extractFlags": extractFlags, "simpleFlag": simpleFlag,
"cmdName": cmdName,
"simpleFlag": simpleFlag,
} }
zshCompletionText = ` zshCompletionText = `
{{/* for pflag.Flag (specifically annotations) */}} {{/* for pflag.Flag (specifically annotations) */}}
@ -36,7 +33,8 @@ var (
{{/* should accept Command (that contains subcommands) as parameter */}} {{/* should accept Command (that contains subcommands) as parameter */}}
{{define "argumentsC" -}} {{define "argumentsC" -}}
function {{constructPath .}} { {{ $cmdPath := genZshFuncName .}}
function {{$cmdPath}} {
local -a commands local -a commands
_arguments -C \{{- range extractFlags .}} _arguments -C \{{- range extractFlags .}}
@ -47,15 +45,15 @@ function {{constructPath .}} {
case $state in case $state in
cmnds) cmnds)
commands=({{range .Commands}}{{if not .Hidden}} commands=({{range .Commands}}{{if not .Hidden}}
"{{cmdName .}}:{{.Short}}"{{end}}{{end}} "{{.Name}}:{{.Short}}"{{end}}{{end}}
) )
_describe "command" commands _describe "command" commands
;; ;;
esac esac
case "$words[1]" in {{- range .Commands}}{{if not .Hidden}} case "$words[1]" in {{- range .Commands}}{{if not .Hidden}}
{{cmdName .}}) {{.Name}})
{{constructPath .}} {{$cmdPath}}_{{.Name}}
;;{{end}}{{end}} ;;{{end}}{{end}}
esac esac
} }
@ -66,7 +64,7 @@ function {{constructPath .}} {
{{/* should accept Command without subcommands as parameter */}} {{/* should accept Command without subcommands as parameter */}}
{{define "arguments" -}} {{define "arguments" -}}
function {{constructPath .}} { function {{genZshFuncName .}} {
{{" _arguments"}}{{range extractFlags .}} \ {{" _arguments"}}{{range extractFlags .}} \
{{if simpleFlag .}}{{template "simpleFlag" .}}{{else}}{{template "complexFlag" .}}{{end -}} {{if simpleFlag .}}{{template "simpleFlag" .}}{{else}}{{template "complexFlag" .}}{{end -}}
{{end}} {{end}}
@ -82,7 +80,7 @@ function {{constructPath .}} {
{{/* template entry point */}} {{/* template entry point */}}
{{define "Main" -}} {{define "Main" -}}
#compdef _{{cmdName .}} {{cmdName .}} #compdef _{{.Name}} {{.Name}}
{{template "selectCmdTemplate" .}} {{template "selectCmdTemplate" .}}
{{end}} {{end}}
@ -109,39 +107,11 @@ func (c *Command) GenZshCompletion(w io.Writer) error {
return tmpl.Execute(w, c) return tmpl.Execute(w, c)
} }
func constructPath(c *Command) string { func generateZshCompletionFuncName(c *Command) string {
var path []string if c.HasParent() {
tmpCmd := c return generateZshCompletionFuncName(c.Parent()) + "_" + c.Name()
path = append(path, tmpCmd.Name())
for {
if !tmpCmd.HasParent() {
break
}
tmpCmd = tmpCmd.Parent()
path = append(path, tmpCmd.Name())
} }
return "_" + c.Name()
// reverse path
for left, right := 0, len(path)-1; left < right; left, right = left+1, right-1 {
path[left], path[right] = path[right], path[left]
}
return "_" + strings.Join(path, "_")
}
// subCmdList returns a space separated list of subcommands names
func subCmdList(c *Command) string {
var subCmds []string
for _, cmd := range c.Commands() {
if cmd.Hidden {
continue
}
subCmds = append(subCmds, cmd.Name())
}
return strings.Join(subCmds, " ")
} }
func extractFlags(c *Command) []*pflag.Flag { func extractFlags(c *Command) []*pflag.Flag {
@ -159,11 +129,6 @@ func extractFlags(c *Command) []*pflag.Flag {
return flags return flags
} }
// cmdName returns the command's innvocation
func cmdName(c *Command) string {
return c.Name()
}
func simpleFlag(p *pflag.Flag) bool { func simpleFlag(p *pflag.Flag) bool {
return p.Name == "" || p.Shorthand == "" return p.Name == "" || p.Shorthand == ""
} }