on main help sign in
feat: add alt/option+esc binding to current esc key behavior

This mimics the behavior of Claude Code and allows folks who use Crush from within a terminal emulator that captures the escape key (like Nvim's built in terminal emulator) to use it.

commit3b6a37597433a631bcbed50c11e102b6dfeffa96 authorMax Justus Spransy <maxjustus@gmail.com> dateWed 27 Aug 2025, 12:26 (1 year ago) parentab96589
14 files changed+20−20
internal/tui/components/chat/editor/editor.go+1−1 internal/tui/components/chat/editor/keys.go+1−1 internal/tui/components/chat/messages/messages.go+1−1 internal/tui/components/chat/splash/keys.go+1−1 internal/tui/components/completions/keys.go+1−1 internal/tui/components/dialogs/commands/keys.go+1−1 internal/tui/components/dialogs/compact/keys.go+1−1 internal/tui/components/dialogs/filepicker/keys.go+1−1 internal/tui/components/dialogs/keys.go+1−1 internal/tui/components/dialogs/models/keys.go+1−1 internal/tui/components/dialogs/quit/keys.go+1−1 internal/tui/components/dialogs/sessions/keys.go+1−1 internal/tui/page/chat/chat.go+7−7 internal/tui/page/chat/keys.go+1−1
internal/tui/components/chat/editor/editor.go+1−1
@@ -75,7 +75,7 @@ var DeleteKeyMaps = DeleteAttachmentKeyMaps{
7575 key.WithHelp("ctrl+r+{i}", "delete attachment at index i"),
7676 ),
7777 Escape: key.NewBinding(
78− key.WithKeys("esc"),
78+ key.WithKeys("esc", "alt+esc"),
7979 key.WithHelp("esc", "cancel delete mode"),
8080 ),
8181 DeleteAllAttachments: key.NewBinding(
internal/tui/components/chat/editor/keys.go+1−1
@@ -61,7 +61,7 @@ var AttachmentsKeyMaps = DeleteAttachmentKeyMaps{
6161 key.WithHelp("ctrl+r+{i}", "delete attachment at index i"),
6262 ),
6363 Escape: key.NewBinding(
64− key.WithKeys("esc"),
64+ key.WithKeys("esc", "alt+esc"),
6565 key.WithHelp("esc", "cancel delete mode"),
6666 ),
6767 DeleteAllAttachments: key.NewBinding(
internal/tui/components/chat/messages/messages.go+1−1
@@ -29,7 +29,7 @@ import (
2929var CopyKey = key.NewBinding(key.WithKeys("c", "y", "C", "Y"), key.WithHelp("c/y", "copy"))
3030
3131// ClearSelectionKey is the key binding for clearing the current selection in the chat interface.
32−var ClearSelectionKey = key.NewBinding(key.WithKeys("esc"), key.WithHelp("esc", "clear selection"))
32+var ClearSelectionKey = key.NewBinding(key.WithKeys("esc", "alt+esc"), key.WithHelp("esc", "clear selection"))
3333
3434// MessageCmp defines the interface for message components in the chat interface.
3535// It combines standard UI model interfaces with message-specific functionality.
internal/tui/components/chat/splash/keys.go+1−1
@@ -46,7 +46,7 @@ func DefaultKeyMap() KeyMap {
4646 key.WithHelp("←/→", "switch"),
4747 ),
4848 Back: key.NewBinding(
49− key.WithKeys("esc"),
49+ key.WithKeys("esc", "alt+esc"),
5050 key.WithHelp("esc", "back"),
5151 ),
5252 }
internal/tui/components/completions/keys.go+1−1
@@ -28,7 +28,7 @@ func DefaultKeyMap() KeyMap {
2828 key.WithHelp("enter", "select"),
2929 ),
3030 Cancel: key.NewBinding(
31− key.WithKeys("esc"),
31+ key.WithKeys("esc", "alt+esc"),
3232 key.WithHelp("esc", "cancel"),
3333 ),
3434 DownInsert: key.NewBinding(
internal/tui/components/dialogs/commands/keys.go+1−1
@@ -31,7 +31,7 @@ func DefaultCommandsDialogKeyMap() CommandsDialogKeyMap {
3131 key.WithHelp("tab", "switch selection"),
3232 ),
3333 Close: key.NewBinding(
34− key.WithKeys("esc"),
34+ key.WithKeys("esc", "alt+esc"),
3535 key.WithHelp("esc", "cancel"),
3636 ),
3737 }
internal/tui/components/dialogs/compact/keys.go+1−1
@@ -33,7 +33,7 @@ func DefaultKeyMap() KeyMap {
3333 key.WithHelp("n", "no"),
3434 ),
3535 Close: key.NewBinding(
36− key.WithKeys("esc"),
36+ key.WithKeys("esc", "alt+esc"),
3737 key.WithHelp("esc", "cancel"),
3838 ),
3939 }
internal/tui/components/dialogs/filepicker/keys.go+1−1
@@ -38,7 +38,7 @@ func DefaultKeyMap() KeyMap {
3838 ),
3939
4040 Close: key.NewBinding(
41− key.WithKeys("esc"),
41+ key.WithKeys("esc", "alt+esc"),
4242 key.WithHelp("esc", "close/exit"),
4343 ),
4444 }
internal/tui/components/dialogs/keys.go+1−1
@@ -12,7 +12,7 @@ type KeyMap struct {
1212func DefaultKeyMap() KeyMap {
1313 return KeyMap{
1414 Close: key.NewBinding(
15− key.WithKeys("esc"),
15+ key.WithKeys("esc", "alt+esc"),
1616 ),
1717 }
1818}
internal/tui/components/dialogs/models/keys.go+1−1
@@ -34,7 +34,7 @@ func DefaultKeyMap() KeyMap {
3434 key.WithHelp("tab", "toggle type"),
3535 ),
3636 Close: key.NewBinding(
37− key.WithKeys("esc"),
37+ key.WithKeys("esc", "alt+esc"),
3838 key.WithHelp("esc", "cancel"),
3939 ),
4040 }
internal/tui/components/dialogs/quit/keys.go+1−1
@@ -37,7 +37,7 @@ func DefaultKeymap() KeyMap {
3737 key.WithHelp("tab", "switch options"),
3838 ),
3939 Close: key.NewBinding(
40− key.WithKeys("esc"),
40+ key.WithKeys("esc", "alt+esc"),
4141 key.WithHelp("esc", "cancel"),
4242 ),
4343 }
internal/tui/components/dialogs/sessions/keys.go+1−1
@@ -26,7 +26,7 @@ func DefaultKeyMap() KeyMap {
2626 key.WithHelp("↑", "previous item"),
2727 ),
2828 Close: key.NewBinding(
29− key.WithKeys("esc"),
29+ key.WithKeys("esc", "alt+esc"),
3030 key.WithHelp("esc", "cancel"),
3131 ),
3232 }
internal/tui/page/chat/chat.go+7−7
@@ -766,7 +766,7 @@ func (p *chatPage) Bindings() []key.Binding {
766766 cancelBinding := p.keyMap.Cancel
767767 if p.isCanceling {
768768 cancelBinding = key.NewBinding(
769− key.WithKeys("esc"),
769+ key.WithKeys("esc", "alt+esc"),
770770 key.WithHelp("esc", "press again to cancel"),
771771 )
772772 }
@@ -835,7 +835,7 @@ func (p *chatPage) Help() help.KeyMap {
835835 shortList = append(shortList,
836836 // Go back
837837 key.NewBinding(
838− key.WithKeys("esc"),
838+ key.WithKeys("esc", "alt+esc"),
839839 key.WithHelp("esc", "back"),
840840 ),
841841 )
@@ -870,7 +870,7 @@ func (p *chatPage) Help() help.KeyMap {
870870 key.WithHelp("tab/enter", "complete"),
871871 ),
872872 key.NewBinding(
873− key.WithKeys("esc"),
873+ key.WithKeys("esc", "alt+esc"),
874874 key.WithHelp("esc", "cancel"),
875875 ),
876876 key.NewBinding(
@@ -885,18 +885,18 @@ func (p *chatPage) Help() help.KeyMap {
885885 }
886886 if p.app.CoderAgent != nil && p.app.CoderAgent.IsBusy() {
887887 cancelBinding := key.NewBinding(
888− key.WithKeys("esc"),
888+ key.WithKeys("esc", "alt+esc"),
889889 key.WithHelp("esc", "cancel"),
890890 )
891891 if p.isCanceling {
892892 cancelBinding = key.NewBinding(
893− key.WithKeys("esc"),
893+ key.WithKeys("esc", "alt+esc"),
894894 key.WithHelp("esc", "press again to cancel"),
895895 )
896896 }
897897 if p.app.CoderAgent != nil && p.app.CoderAgent.QueuedPrompts(p.session.ID) > 0 {
898898 cancelBinding = key.NewBinding(
899− key.WithKeys("esc"),
899+ key.WithKeys("esc", "alt+esc"),
900900 key.WithHelp("esc", "clear queue"),
901901 )
902902 }
@@ -1042,7 +1042,7 @@ func (p *chatPage) Help() help.KeyMap {
10421042 key.WithHelp("ctrl+r+r", "delete all attachments"),
10431043 ),
10441044 key.NewBinding(
1045− key.WithKeys("esc"),
1045+ key.WithKeys("esc", "alt+esc"),
10461046 key.WithHelp("esc", "cancel delete mode"),
10471047 ),
10481048 })
internal/tui/page/chat/keys.go+1−1
@@ -23,7 +23,7 @@ func DefaultKeyMap() KeyMap {
2323 key.WithHelp("ctrl+f", "add attachment"),
2424 ),
2525 Cancel: key.NewBinding(
26− key.WithKeys("esc"),
26+ key.WithKeys("esc", "alt+esc"),
2727 key.WithHelp("esc", "cancel"),
2828 ),
2929 Tab: key.NewBinding(