diff options
Diffstat (limited to 'internal/tui/components/chat/editor.go')
| -rw-r--r-- | internal/tui/components/chat/editor.go | 64 |
1 files changed, 23 insertions, 41 deletions
diff --git a/internal/tui/components/chat/editor.go b/internal/tui/components/chat/editor.go index 4f6937039..2d89803cd 100644 --- a/internal/tui/components/chat/editor.go +++ b/internal/tui/components/chat/editor.go @@ -26,7 +26,6 @@ type FocusEditorMsg bool type focusedEditorKeyMaps struct { Send key.Binding OpenEditor key.Binding - Blur key.Binding } type bluredEditorKeyMaps struct { @@ -35,30 +34,11 @@ type bluredEditorKeyMaps struct { OpenEditor key.Binding } -var focusedKeyMaps = focusedEditorKeyMaps{ +var KeyMaps = focusedEditorKeyMaps{ Send: key.NewBinding( key.WithKeys("ctrl+s"), key.WithHelp("ctrl+s", "send message"), ), - Blur: key.NewBinding( - key.WithKeys("esc"), - key.WithHelp("esc", "focus messages"), - ), - OpenEditor: key.NewBinding( - key.WithKeys("ctrl+e"), - key.WithHelp("ctrl+e", "open editor"), - ), -} - -var bluredKeyMaps = bluredEditorKeyMaps{ - Send: key.NewBinding( - key.WithKeys("ctrl+s", "enter"), - key.WithHelp("ctrl+s/enter", "send message"), - ), - Focus: key.NewBinding( - key.WithKeys("i"), - key.WithHelp("i", "focus editor"), - ), OpenEditor: key.NewBinding( key.WithKeys("ctrl+e"), key.WithHelp("ctrl+e", "open editor"), @@ -88,6 +68,9 @@ func openEditor() tea.Cmd { if err != nil { return util.ReportError(err) } + if len(content) == 0 { + return util.ReportWarn("Message is empty") + } os.Remove(tmpfile.Name()) return SendMsg{ Text: string(content), @@ -106,7 +89,6 @@ func (m *editorCmp) send() tea.Cmd { value := m.textarea.Value() m.textarea.Reset() - m.textarea.Blur() if value == "" { return nil } @@ -131,26 +113,32 @@ func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, tea.Batch(textarea.Blink, util.CmdHandler(EditorFocusMsg(true))) } case tea.KeyMsg: - if key.Matches(msg, focusedKeyMaps.OpenEditor) { + if key.Matches(msg, messageKeys.PageUp) || key.Matches(msg, messageKeys.PageDown) || + key.Matches(msg, messageKeys.HalfPageUp) || key.Matches(msg, messageKeys.HalfPageDown) { + return m, nil + } + if key.Matches(msg, KeyMaps.OpenEditor) { if m.app.CoderAgent.IsSessionBusy(m.session.ID) { return m, util.ReportWarn("Agent is working, please wait...") } return m, openEditor() } // if the key does not match any binding, return - if m.textarea.Focused() && key.Matches(msg, focusedKeyMaps.Send) { + if m.textarea.Focused() && key.Matches(msg, KeyMaps.Send) { return m, m.send() } - if !m.textarea.Focused() && key.Matches(msg, bluredKeyMaps.Send) { - return m, m.send() - } - if m.textarea.Focused() && key.Matches(msg, focusedKeyMaps.Blur) { - m.textarea.Blur() - return m, util.CmdHandler(EditorFocusMsg(false)) - } - if !m.textarea.Focused() && key.Matches(msg, bluredKeyMaps.Focus) { - m.textarea.Focus() - return m, tea.Batch(textarea.Blink, util.CmdHandler(EditorFocusMsg(true))) + + // Handle Enter key + if m.textarea.Focused() && msg.String() == "enter" { + value := m.textarea.Value() + if len(value) > 0 && value[len(value)-1] == '\\' { + // If the last character is a backslash, remove it and add a newline + m.textarea.SetValue(value[:len(value)-1] + "\n") + return m, nil + } else { + // Otherwise, send the message + return m, m.send() + } } } m.textarea, cmd = m.textarea.Update(msg) @@ -175,13 +163,7 @@ func (m *editorCmp) GetSize() (int, int) { func (m *editorCmp) BindingKeys() []key.Binding { bindings := []key.Binding{} - if m.textarea.Focused() { - bindings = append(bindings, layout.KeyMapToSlice(focusedKeyMaps)...) - } else { - bindings = append(bindings, layout.KeyMapToSlice(bluredKeyMaps)...) - } - - bindings = append(bindings, layout.KeyMapToSlice(m.textarea.KeyMap)...) + bindings = append(bindings, layout.KeyMapToSlice(KeyMaps)...) return bindings } |
