-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcompletion_zsh.go
99 lines (92 loc) · 2.61 KB
/
completion_zsh.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package completion
import (
"fmt"
"strings"
)
func zsh(cmd *command) string {
var zsh string
zsh += fmt.Sprintf("#!/bin/zsh\n")
zsh += zshFunctions(cmd)
zsh += fmt.Sprintf("\ncompdef _%s %s\n", cmd.Name, cmd.Name)
return zsh
}
func zshFunctions(cmd *command) string {
var function string
function += fmt.Sprintf("\n%s() {\n", cmd.FullName())
function += fmt.Sprintf("\tlocal line\n")
if cmd.Name == "help" {
function += zshHelpFunction(cmd)
} else {
function += zshSubCommandsInfo(cmd)
function += zshArguments(cmd)
function += zshSubCommandsLink(cmd)
}
function += fmt.Sprintf("}\n")
if cmd.HasSubCommands() {
for _, c := range cmd.SubCommands {
function += zshFunctions(c)
}
}
return function
}
func zshHelpFunction(cmd *command) string {
var helpFunction string
helpFunction += fmt.Sprintf("\n\t_arguments \\\n")
helpFunction += fmt.Sprintf("\t\t\"1:command:(%s)\"\n", strings.Join(cmd.Parent.ListSubCommands(), " "))
return helpFunction
}
func zshSubCommandsInfo(cmd *command) string {
var subCommandsInfo string
if cmd.HasSubCommands() {
subCommandsInfo += fmt.Sprintf("\n\tcmds=\"((\n")
for _, c := range cmd.SubCommands {
subCommandsInfo += fmt.Sprintf("\t\t%s\\:'%s'\n", c.Name, c.Description)
}
subCommandsInfo += fmt.Sprintf("\t))\"\n")
}
return subCommandsInfo
}
func zshSubCommandsLink(cmd *command) string {
var subCommandsLink string
if cmd.HasSubCommands() {
subCommandsLink += fmt.Sprintf("\n\tcase $line[1] in\n")
for _, c := range cmd.SubCommands {
alias := func(alias []string) string {
var res string
for _, a := range alias {
res += fmt.Sprintf("|%s", a)
}
return res
}
subCommandsLink += fmt.Sprintf("\t\t%s%s)\n\t\t\t%s\n\t\t\t;;\n", c.Name, alias(c.Alias), c.FullName())
}
subCommandsLink += fmt.Sprintf("\tesac\n")
}
return subCommandsLink
}
func zshArguments(cmd *command) string {
var arguments string
if cmd.HasArguments() || cmd.HasFlags() || cmd.HasSubCommands() {
arguments += fmt.Sprintf("\n\t_arguments -C \\\n")
if cmd.HasFlags() {
for _, f := range cmd.Flags {
if f.HasShorthand() {
arguments += fmt.Sprintf("\t\t{-%s,--%s}\"[%s]\"\\\n", f.Shorthand, f.Name, f.Description)
} else {
arguments += fmt.Sprintf("\t\t\"--%s[%s]\"\\\n", f.Name, f.Description)
}
}
}
if cmd.HasArguments() {
for k, a := range cmd.Arguments {
if a == "command" && cmd.HasSubCommands() {
arguments += fmt.Sprintf("\t\t\"%d:%s:$cmds\"\\\n", k+1, a)
arguments += fmt.Sprintf("\t\t\"*::arg:->args\"\n")
} else {
arguments += fmt.Sprintf("\t\t\"%d:%s\"\\\n", k+1, a)
}
}
}
}
return arguments
}