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