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}