on main help sign in
feat(tui): display newline shitf+enter in help when supported
9afc491Ayman Bagabas
internal/tui/components/chat/editor/editor.go+3
@@ -145,6 +145,9 @@ func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
145 var cmd tea.Cmd
145 var cmd tea.Cmd
146 var cmds []tea.Cmd
146 var cmds []tea.Cmd
147 switch msg := msg.(type) {
147 switch msg := msg.(type) {
148+ case tea.KeyboardEnhancementsMsg:
149+ m.keyMap.keyboard = msg
150+ return m, nil
148 case chat.SessionSelectedMsg:
151 case chat.SessionSelectedMsg:
149 if msg.ID != m.session.ID {
152 if msg.ID != m.session.ID {
150 m.session = msg
153 m.session = msg
internal/tui/components/chat/editor/keys.go+12−2
@@ -2,6 +2,7 @@ package editor
2
2
3import (
3import (
4 "github.com/charmbracelet/bubbles/v2/key"
4 "github.com/charmbracelet/bubbles/v2/key"
5+ tea "github.com/charmbracelet/bubbletea/v2"
5)
6)
6
7
7type EditorKeyMap struct {
8type EditorKeyMap struct {
@@ -9,6 +10,8 @@ type EditorKeyMap struct {
9 SendMessage key.Binding
10 SendMessage key.Binding
10 OpenEditor key.Binding
11 OpenEditor key.Binding
11 Newline key.Binding
12 Newline key.Binding
13+
14+ keyboard tea.KeyboardEnhancementsMsg
12}
15}
13
16
14func DefaultEditorKeyMap() EditorKeyMap {
17func DefaultEditorKeyMap() EditorKeyMap {
@@ -27,18 +30,25 @@ func DefaultEditorKeyMap() EditorKeyMap {
27 ),
30 ),
28 Newline: key.NewBinding(
31 Newline: key.NewBinding(
29 key.WithKeys("shift+enter", "ctrl+j"),
32 key.WithKeys("shift+enter", "ctrl+j"),
33+ // "ctrl+j" is a common keybinding for newline in many editors. If
34+ // the terminal supports "shift+enter", we substitute the help text
35+ // to reflect that.
30− key.WithHelp("shift+enter", "newline"), key.WithHelp("ctrl+j", "newline"),
36+ key.WithHelp("ctrl+j", "newline"),
31 ),
37 ),
32 }
38 }
33}
39}
34
40
35// KeyBindings implements layout.KeyMapProvider
41// KeyBindings implements layout.KeyMapProvider
36func (k EditorKeyMap) KeyBindings() []key.Binding {
42func (k EditorKeyMap) KeyBindings() []key.Binding {
43+ newline := k.Newline
44+ if k.keyboard.SupportsKeyDisambiguation() {
45+ newline.SetHelp("shift+enter", newline.Help().Desc)
46+ }
37 return []key.Binding{
47 return []key.Binding{
38 k.AddFile,
48 k.AddFile,
39 k.SendMessage,
49 k.SendMessage,
40 k.OpenEditor,
50 k.OpenEditor,
41− k.Newline,
51+ newline,
42 }
52 }
43}
53}
44
54
internal/tui/page/chat/chat.go+4
@@ -80,6 +80,10 @@ func (p *chatPage) cancelTimerCmd() tea.Cmd {
80func (p *chatPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
80func (p *chatPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
81 var cmds []tea.Cmd
81 var cmds []tea.Cmd
82 switch msg := msg.(type) {
82 switch msg := msg.(type) {
83+ case tea.KeyboardEnhancementsMsg:
84+ m, cmd := p.layout.Update(msg)
85+ p.layout = m.(layout.SplitPaneLayout)
86+ return p, cmd
83 case CancelTimerExpiredMsg:
87 case CancelTimerExpiredMsg:
84 p.cancelPending = false
88 p.cancelPending = false
85 return p, nil
89 return p, nil
internal/tui/tui.go+8−1
@@ -95,7 +95,14 @@ func (a *appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
95
95
96 switch msg := msg.(type) {
96 switch msg := msg.(type) {
97 case tea.KeyboardEnhancementsMsg:
97 case tea.KeyboardEnhancementsMsg:
98− return a, nil
98+ for id, page := range a.pages {
99+ m, pageCmd := page.Update(msg)
100+ a.pages[id] = m.(util.Model)
101+ if pageCmd != nil {
102+ cmds = append(cmds, pageCmd)
103+ }
104+ }
105+ return a, tea.Batch(cmds...)
99 case tea.WindowSizeMsg:
106 case tea.WindowSizeMsg:
100 return a, a.handleWindowResize(msg.Width, msg.Height)
107 return a, a.handleWindowResize(msg.Width, msg.Height)
101
108