From 62b020ee700ece56e665feab6c02fbb2f71cb91a Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Wed, 19 Feb 2025 22:26:49 -0500 Subject: [PATCH] fix(examples): only show keybindings when they'll have an effect --- examples/autocomplete/main.go | 61 ++++++++++++++++++++++++++--------- examples/go.mod | 4 +-- examples/go.sum | 8 ++--- 3 files changed, 51 insertions(+), 22 deletions(-) diff --git a/examples/autocomplete/main.go b/examples/autocomplete/main.go index 6972e22ce8..13fe80c65c 100644 --- a/examples/autocomplete/main.go +++ b/examples/autocomplete/main.go @@ -67,14 +67,16 @@ type model struct { keymap keymap } -type keymap struct{} +type keymap struct { + complete, next, prev, quit key.Binding +} func (k keymap) ShortHelp() []key.Binding { return []key.Binding{ - key.NewBinding(key.WithKeys("tab"), key.WithHelp("tab", "complete")), - key.NewBinding(key.WithKeys("ctrl+n"), key.WithHelp("ctrl+n", "next")), - key.NewBinding(key.WithKeys("ctrl+p"), key.WithHelp("ctrl+p", "prev")), - key.NewBinding(key.WithKeys("esc"), key.WithHelp("esc", "quit")), + k.complete, + k.next, + k.prev, + k.quit, } } @@ -84,7 +86,6 @@ func (k keymap) FullHelp() [][]key.Binding { func initialModel() model { ti := textinput.New() - ti.Placeholder = "repository" ti.Prompt = "charmbracelet/" ti.Styles.Focused.Prompt = lipgloss.NewStyle().Foreground(lipgloss.Color("63")).MarginLeft(2) ti.Styles.Cursor.Color = lipgloss.Color("63") @@ -93,7 +94,20 @@ func initialModel() model { ti.SetWidth(20) ti.ShowSuggestions = true - return model{textInput: ti, help: help.New()} + km := keymap{ + // XXX: we should be using the keybindings on the textinput model. + complete: key.NewBinding(key.WithKeys("tab"), key.WithHelp("tab", "complete"), key.WithDisabled()), + next: key.NewBinding(key.WithKeys("ctrl+n"), key.WithHelp("ctrl+n", "next"), key.WithDisabled()), + prev: key.NewBinding(key.WithKeys("ctrl+p"), key.WithHelp("ctrl+p", "prev"), key.WithDisabled()), + + quit: key.NewBinding(key.WithKeys("enter", "ctrl+c", "esc"), key.WithHelp("esc", "quit")), + } + + return model{ + textInput: ti, + keymap: km, + help: help.New(), + } } func (m model) Init() tea.Cmd { @@ -108,32 +122,47 @@ func (m model) Cursor() *tea.Cursor { func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { - case tea.KeyPressMsg: - switch msg.String() { - case "enter", "ctrl+c", "esc": - return m, tea.Quit - } + case gotReposSuccessMsg: var suggestions []string for _, r := range msg { suggestions = append(suggestions, r.Name) } m.textInput.SetSuggestions(suggestions) + + case tea.KeyPressMsg: + switch { + case key.Matches(msg, m.keymap.quit): + return m, tea.Quit + } } var cmd tea.Cmd m.textInput, cmd = m.textInput.Update(msg) + + // Determine whether to show completion keybindings. + // + // XXX: we should be using the keybindings on the textinput model. + hasChoices := len(m.textInput.MatchedSuggestions()) > 1 + m.keymap.complete.SetEnabled(hasChoices) + m.keymap.next.SetEnabled(hasChoices) + m.keymap.prev.SetEnabled(hasChoices) + return m, cmd } -func (m model) View() string { +func (m model) View() (string, *tea.Cursor) { + if len(m.textInput.AvailableSuggestions()) < 1 { + return "One sec, we're fetching completions...", nil + } + return lipgloss.JoinVertical( - lipgloss.Top, + lipgloss.Left, m.headerView(), m.textInput.View(), m.footerView(), - ) + ), m.Cursor() } -func (m model) headerView() string { return "Pick a Charmâ„¢ repo:\n" } +func (m model) headerView() string { return "Enter a Charmâ„¢ repo:\n" } func (m model) footerView() string { return "\n" + m.help.View(m.keymap) } diff --git a/examples/go.mod b/examples/go.mod index 791ae86a20..d68a4d45b1 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -3,12 +3,12 @@ module examples go 1.23.1 require ( - github.com/charmbracelet/bubbles/v2 v2.0.0-alpha.2.0.20250210190055-c20ae83e2f58 + github.com/charmbracelet/bubbles/v2 v2.0.0-alpha.2.0.20250211170751-4491afa808c7 github.com/charmbracelet/bubbletea/v2 v2.0.0-alpha.2.0.20250204175057-2a96bc438da6 github.com/charmbracelet/colorprofile v0.2.0 github.com/charmbracelet/glamour v0.8.0 github.com/charmbracelet/harmonica v0.2.0 - github.com/charmbracelet/lipgloss/v2 v2.0.0-alpha.2.0.20250204145343-96725424379d + github.com/charmbracelet/lipgloss/v2 v2.0.0-alpha.2.0.20250218201041-aa91bd691cf5 github.com/charmbracelet/x/ansi v0.8.0 github.com/charmbracelet/x/exp/teatest/v2 v2.0.0-20241016014612-3b4d04043233 github.com/fogleman/ease v0.0.0-20170301025033-8da417bf1776 diff --git a/examples/go.sum b/examples/go.sum index b7fbc844b0..7e68baee2a 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -14,8 +14,8 @@ github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWp github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/charmbracelet/bubbles/v2 v2.0.0-alpha.2.0.20250210190055-c20ae83e2f58 h1:P3U+GsG3TK0uUTURbbZO/rVWJLsczLUE6nnPjlDzVbQ= -github.com/charmbracelet/bubbles/v2 v2.0.0-alpha.2.0.20250210190055-c20ae83e2f58/go.mod h1:OQsv1nZAu5v8GtZqNTqS4yY5mfR0VgImkpe2F0QYEfs= +github.com/charmbracelet/bubbles/v2 v2.0.0-alpha.2.0.20250211170751-4491afa808c7 h1:8cwDdcNLWHcwdN59to+ASr0uaHUWmGTWYpVMrMNA/mU= +github.com/charmbracelet/bubbles/v2 v2.0.0-alpha.2.0.20250211170751-4491afa808c7/go.mod h1:OQsv1nZAu5v8GtZqNTqS4yY5mfR0VgImkpe2F0QYEfs= github.com/charmbracelet/colorprofile v0.2.0 h1:iiIQlp3LSvoJPtR11KoDfIf9wqWm2mn/iU420rHOZ/A= github.com/charmbracelet/colorprofile v0.2.0/go.mod h1:6wPrSSR4QtwYtOY3h0bLRw5YOUAIKWlZIJ02CTAsZsk= github.com/charmbracelet/glamour v0.8.0 h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs= @@ -24,8 +24,8 @@ github.com/charmbracelet/harmonica v0.2.0 h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg= github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo= -github.com/charmbracelet/lipgloss/v2 v2.0.0-alpha.2.0.20250204145343-96725424379d h1:wW4446FqrhqEHT96r2OVGNU0izi8siEybQVZ+qBRpJs= -github.com/charmbracelet/lipgloss/v2 v2.0.0-alpha.2.0.20250204145343-96725424379d/go.mod h1:ZWl23X8o1vsQu8dpju10HKXepcMMlsHO8SwLl2OhmEU= +github.com/charmbracelet/lipgloss/v2 v2.0.0-alpha.2.0.20250218201041-aa91bd691cf5 h1:IctsjPxgKr8rEpUzoqwM2TlVhLcxS2TlOe7PFa6U7M4= +github.com/charmbracelet/lipgloss/v2 v2.0.0-alpha.2.0.20250218201041-aa91bd691cf5/go.mod h1:wvhSDGHyThg9IW8ehatv9MkG4YH5MHYcdhQYmsaCITM= github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= github.com/charmbracelet/x/cellbuf v0.0.12-0.20250212155406-f75055277088 h1:m6tAMwKSqnvNu5+2IsCTkZFPy58SFJ55CNuBE5U8ilw=