1066c0bc7d
Search uses existing parse grammar ?prefix — type `?query #tag` in capture bar to filter entities client-side. Substring match on body+title+description with AND tag filtering. Esc clears search. Absorb via m key on fluid entities — opens source picker showing all other entities, enter merges source into target. Uses existing store.Absorb() backend.
68 lines
1.6 KiB
Go
68 lines
1.6 KiB
Go
package tui
|
|
|
|
import "strings"
|
|
|
|
func renderHelp(width, height int) string {
|
|
sections := []struct {
|
|
title string
|
|
binds [][2]string
|
|
}{
|
|
{"Navigation", [][2]string{
|
|
{"j/k ↑/↓", "move cursor"},
|
|
{"g/G home/end", "top / bottom"},
|
|
{"pgup/pgdn", "page up / down"},
|
|
{"enter", "view detail"},
|
|
{"esc", "back / clear filter"},
|
|
}},
|
|
{"Views", [][2]string{
|
|
{"1", "stream view"},
|
|
{"2", "cards view"},
|
|
{"s", "cycle sort (cards)"},
|
|
{"tab", "cycle intent (cards)"},
|
|
}},
|
|
{"Actions", [][2]string{
|
|
{"a", "add entity (or ?query to search)"},
|
|
{"d", "delete (with confirm)"},
|
|
{"x", "toggle todo completion"},
|
|
{"!", "toggle pin"},
|
|
{"#", "filter by tag"},
|
|
{"m", "absorb (merge into target)"},
|
|
{"p", "promote to card"},
|
|
}},
|
|
{"Detail View", [][2]string{
|
|
{"p", "promote to card"},
|
|
{"D", "demote to fluid"},
|
|
{"c", "copy to clipboard"},
|
|
{"e", "edit in $EDITOR"},
|
|
{"!", "toggle pin"},
|
|
}},
|
|
{"Global", [][2]string{
|
|
{"?", "toggle help"},
|
|
{"q / ctrl+c", "quit"},
|
|
}},
|
|
}
|
|
|
|
var b strings.Builder
|
|
b.WriteString(detailHeaderStyle.Render("keybindings"))
|
|
b.WriteString("\n\n")
|
|
|
|
for _, s := range sections {
|
|
b.WriteString(titleStyle.Render(s.title))
|
|
b.WriteString("\n")
|
|
for _, bind := range s.binds {
|
|
key := helpKeyStyle.Render(bind[0])
|
|
desc := helpDescStyle.Render(bind[1])
|
|
b.WriteString(" " + key + " " + desc + "\n")
|
|
}
|
|
b.WriteString("\n")
|
|
}
|
|
|
|
b.WriteString(helpStyle.Render("press ? or esc to close"))
|
|
|
|
lines := strings.Split(b.String(), "\n")
|
|
if len(lines) > height {
|
|
lines = lines[:height]
|
|
}
|
|
return strings.Join(lines, "\n")
|
|
}
|