commit 4ee9034
Hubert Hirtz
·
2021-10-27 11:59:09 +0000 UTC
parent ef8780d
Rework the /help command - Normalize usage display - Sort commands alphabetically
1 files changed,
+43,
-37
+43,
-37
1@@ -2,6 +2,7 @@ package senpai
2
3 import (
4 "fmt"
5+ "sort"
6 "strconv"
7 "strings"
8 "time"
9@@ -180,65 +181,70 @@ func commandDoBuffer(app *App, args []string) error {
10 func commandDoHelp(app *App, args []string) (err error) {
11 t := time.Now()
12 netID, buffer := app.win.CurrentBuffer()
13+
14+ addLineCommand := func(sb *ui.StyledStringBuilder, name string, cmd *command) {
15+ sb.Reset()
16+ sb.Grow(len(name) + 1 + len(cmd.Usage))
17+ sb.SetStyle(tcell.StyleDefault.Bold(true))
18+ sb.WriteString(name)
19+ sb.SetStyle(tcell.StyleDefault)
20+ sb.WriteByte(' ')
21+ sb.WriteString(cmd.Usage)
22+ app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
23+ At: t,
24+ Body: sb.StyledString(),
25+ })
26+ app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
27+ At: t,
28+ Body: ui.PlainSprintf(" %s", cmd.Desc),
29+ })
30+ app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
31+ At: t,
32+ })
33+ }
34+
35+ addLineCommands := func(names []string) {
36+ sort.Strings(names)
37+ var sb ui.StyledStringBuilder
38+ for _, name := range names {
39+ addLineCommand(&sb, name, commands[name])
40+ }
41+ }
42+
43 if len(args) == 0 {
44 app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
45 At: t,
46 Head: "--",
47 Body: ui.PlainString("Available commands:"),
48 })
49- for cmdName, cmd := range commands {
50- if cmd.Desc == "" {
51- continue
52- }
53- app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
54- At: t,
55- Body: ui.PlainSprintf(" \x02%s\x02 %s", cmdName, cmd.Usage),
56- })
57- app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
58- At: t,
59- Body: ui.PlainSprintf(" %s", cmd.Desc),
60- })
61- app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
62- At: t,
63- })
64+
65+ cmdNames := make([]string, 0, len(commands))
66+ for cmdName := range commands {
67+ cmdNames = append(cmdNames, cmdName)
68 }
69+ addLineCommands(cmdNames)
70 } else {
71 search := strings.ToUpper(args[0])
72- found := false
73 app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
74 At: t,
75 Head: "--",
76 Body: ui.PlainSprintf("Commands that match \"%s\":", search),
77 })
78- for cmdName, cmd := range commands {
79+
80+ cmdNames := make([]string, 0, len(commands))
81+ for cmdName := range commands {
82 if !strings.Contains(cmdName, search) {
83 continue
84 }
85- var usage ui.StyledStringBuilder
86- usage.Grow(len(cmdName) + 1 + len(cmd.Usage))
87- usage.SetStyle(tcell.StyleDefault.Bold(true))
88- usage.WriteString(cmdName)
89- usage.SetStyle(tcell.StyleDefault)
90- usage.WriteByte(' ')
91- usage.WriteString(cmd.Usage)
92- app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
93- At: t,
94- Body: usage.StyledString(),
95- })
96- app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
97- At: t,
98- Body: ui.PlainSprintf(" %s", cmd.Desc),
99- })
100- app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
101- At: t,
102- })
103- found = true
104+ cmdNames = append(cmdNames, cmdName)
105 }
106- if !found {
107+ if len(cmdNames) == 0 {
108 app.win.AddLine(netID, buffer, ui.NotifyNone, ui.Line{
109 At: t,
110 Body: ui.PlainSprintf(" no command matches %q", args[0]),
111 })
112+ } else {
113+ addLineCommands(cmdNames)
114 }
115 }
116 return nil