1package editor
2
3import (
4 "github.com/charmbracelet/bubbles/v2/key"
5 tea "github.com/charmbracelet/bubbletea/v2"
6)
7
8type EditorKeyMap struct {
9 AddFile key.Binding
10 SendMessage key.Binding
11 OpenEditor key.Binding
12 Newline key.Binding
13
14 keyboard tea.KeyboardEnhancementsMsg
15}
16
17func DefaultEditorKeyMap() EditorKeyMap {
18 return EditorKeyMap{
19 AddFile: key.NewBinding(
20 key.WithKeys("/"),
21 key.WithHelp("/", "add file"),
22 ),
23 SendMessage: key.NewBinding(
24 key.WithKeys("enter"),
25 key.WithHelp("enter", "send"),
26 ),
27 OpenEditor: key.NewBinding(
28 key.WithKeys("ctrl+e"),
29 key.WithHelp("ctrl+e", "open editor"),
30 ),
31 Newline: key.NewBinding(
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.
36 key.WithHelp("ctrl+j", "newline"),
37 ),
38 }
39}
40
41// KeyBindings implements layout.KeyMapProvider
42func (k EditorKeyMap) KeyBindings() []key.Binding {
43 newline := k.Newline
44 if k.keyboard.SupportsKeyDisambiguation() {
45 newline.SetHelp("shift+enter", newline.Help().Desc)
46 }
47 return []key.Binding{
48 k.AddFile,
49 k.SendMessage,
50 k.OpenEditor,
51 newline,
52 }
53}
54
55type DeleteAttachmentKeyMaps struct {
56 AttachmentDeleteMode key.Binding
57 Escape key.Binding
58 DeleteAllAttachments key.Binding
59}
60
61// TODO: update this to use the new keymap concepts
62var AttachmentsKeyMaps = DeleteAttachmentKeyMaps{
63 AttachmentDeleteMode: key.NewBinding(
64 key.WithKeys("ctrl+r"),
65 key.WithHelp("ctrl+r+{i}", "delete attachment at index i"),
66 ),
67 Escape: key.NewBinding(
68 key.WithKeys("esc"),
69 key.WithHelp("esc", "cancel delete mode"),
70 ),
71 DeleteAllAttachments: key.NewBinding(
72 key.WithKeys("r"),
73 key.WithHelp("ctrl+r+r", "delete all attachments"),
74 ),
75}