1package model
2
3import "charm.land/bubbles/v2/key"
4
5type KeyMap struct {
6 Editor struct {
7 AddFile key.Binding
8 SendMessage key.Binding
9 OpenEditor key.Binding
10 Newline key.Binding
11 AddImage key.Binding
12 MentionFile key.Binding
13
14 // Attachments key maps
15 AttachmentDeleteMode key.Binding
16 Escape key.Binding
17 DeleteAllAttachments key.Binding
18 }
19
20 Chat struct {
21 NewSession key.Binding
22 AddAttachment key.Binding
23 Cancel key.Binding
24 Tab key.Binding
25 Details key.Binding
26 TogglePills key.Binding
27 PillLeft key.Binding
28 PillRight key.Binding
29 Down key.Binding
30 Up key.Binding
31 UpDown key.Binding
32 DownOneItem key.Binding
33 UpOneItem key.Binding
34 UpDownOneItem key.Binding
35 PageDown key.Binding
36 PageUp key.Binding
37 HalfPageDown key.Binding
38 HalfPageUp key.Binding
39 Home key.Binding
40 End key.Binding
41 Copy key.Binding
42 ClearHighlight key.Binding
43 Expand key.Binding
44 }
45
46 Initialize struct {
47 Yes,
48 No,
49 Enter,
50 Switch key.Binding
51 }
52
53 // Global key maps
54 Quit key.Binding
55 Help key.Binding
56 Commands key.Binding
57 Models key.Binding
58 Suspend key.Binding
59 Sessions key.Binding
60 Tab key.Binding
61}
62
63func DefaultKeyMap() KeyMap {
64 km := KeyMap{
65 Quit: key.NewBinding(
66 key.WithKeys("ctrl+c"),
67 key.WithHelp("ctrl+c", "quit"),
68 ),
69 Help: key.NewBinding(
70 key.WithKeys("ctrl+g"),
71 key.WithHelp("ctrl+g", "more"),
72 ),
73 Commands: key.NewBinding(
74 key.WithKeys("ctrl+p"),
75 key.WithHelp("ctrl+p", "commands"),
76 ),
77 Models: key.NewBinding(
78 key.WithKeys("ctrl+m", "ctrl+l"),
79 key.WithHelp("ctrl+l", "models"),
80 ),
81 Suspend: key.NewBinding(
82 key.WithKeys("ctrl+z"),
83 key.WithHelp("ctrl+z", "suspend"),
84 ),
85 Sessions: key.NewBinding(
86 key.WithKeys("ctrl+s"),
87 key.WithHelp("ctrl+s", "sessions"),
88 ),
89 Tab: key.NewBinding(
90 key.WithKeys("tab"),
91 key.WithHelp("tab", "change focus"),
92 ),
93 }
94
95 km.Editor.AddFile = key.NewBinding(
96 key.WithKeys("/"),
97 key.WithHelp("/", "add file"),
98 )
99 km.Editor.SendMessage = key.NewBinding(
100 key.WithKeys("enter"),
101 key.WithHelp("enter", "send"),
102 )
103 km.Editor.OpenEditor = key.NewBinding(
104 key.WithKeys("ctrl+o"),
105 key.WithHelp("ctrl+o", "open editor"),
106 )
107 km.Editor.Newline = key.NewBinding(
108 key.WithKeys("shift+enter", "ctrl+j"),
109 // "ctrl+j" is a common keybinding for newline in many editors. If
110 // the terminal supports "shift+enter", we substitute the help tex
111 // to reflect that.
112 key.WithHelp("ctrl+j", "newline"),
113 )
114 km.Editor.AddImage = key.NewBinding(
115 key.WithKeys("ctrl+f"),
116 key.WithHelp("ctrl+f", "add image"),
117 )
118 km.Editor.MentionFile = key.NewBinding(
119 key.WithKeys("@"),
120 key.WithHelp("@", "mention file"),
121 )
122 km.Editor.AttachmentDeleteMode = key.NewBinding(
123 key.WithKeys("ctrl+r"),
124 key.WithHelp("ctrl+r+{i}", "delete attachment at index i"),
125 )
126 km.Editor.Escape = key.NewBinding(
127 key.WithKeys("esc", "alt+esc"),
128 key.WithHelp("esc", "cancel delete mode"),
129 )
130 km.Editor.DeleteAllAttachments = key.NewBinding(
131 key.WithKeys("r"),
132 key.WithHelp("ctrl+r+r", "delete all attachments"),
133 )
134
135 km.Chat.NewSession = key.NewBinding(
136 key.WithKeys("ctrl+n"),
137 key.WithHelp("ctrl+n", "new session"),
138 )
139 km.Chat.AddAttachment = key.NewBinding(
140 key.WithKeys("ctrl+f"),
141 key.WithHelp("ctrl+f", "add attachment"),
142 )
143 km.Chat.Cancel = key.NewBinding(
144 key.WithKeys("esc", "alt+esc"),
145 key.WithHelp("esc", "cancel"),
146 )
147 km.Chat.Tab = key.NewBinding(
148 key.WithKeys("tab"),
149 key.WithHelp("tab", "change focus"),
150 )
151 km.Chat.Details = key.NewBinding(
152 key.WithKeys("ctrl+d"),
153 key.WithHelp("ctrl+d", "toggle details"),
154 )
155 km.Chat.TogglePills = key.NewBinding(
156 key.WithKeys("ctrl+space"),
157 key.WithHelp("ctrl+space", "toggle tasks"),
158 )
159 km.Chat.PillLeft = key.NewBinding(
160 key.WithKeys("left"),
161 key.WithHelp("←/→", "switch section"),
162 )
163 km.Chat.PillRight = key.NewBinding(
164 key.WithKeys("right"),
165 key.WithHelp("←/→", "switch section"),
166 )
167
168 km.Chat.Down = key.NewBinding(
169 key.WithKeys("down", "ctrl+j", "j"),
170 key.WithHelp("↓", "down"),
171 )
172 km.Chat.Up = key.NewBinding(
173 key.WithKeys("up", "ctrl+k", "k"),
174 key.WithHelp("↑", "up"),
175 )
176 km.Chat.UpDown = key.NewBinding(
177 key.WithKeys("up", "down"),
178 key.WithHelp("↑↓", "scroll"),
179 )
180 km.Chat.UpOneItem = key.NewBinding(
181 key.WithKeys("shift+up", "K"),
182 key.WithHelp("shift+↑", "up one item"),
183 )
184 km.Chat.DownOneItem = key.NewBinding(
185 key.WithKeys("shift+down", "J"),
186 key.WithHelp("shift+↓", "down one item"),
187 )
188 km.Chat.UpDownOneItem = key.NewBinding(
189 key.WithKeys("shift+up", "shift+down"),
190 key.WithHelp("shift+↑↓", "scroll one item"),
191 )
192 km.Chat.HalfPageDown = key.NewBinding(
193 key.WithKeys("d"),
194 key.WithHelp("d", "half page down"),
195 )
196 km.Chat.PageDown = key.NewBinding(
197 key.WithKeys("pgdown", " ", "f"),
198 key.WithHelp("f/pgdn", "page down"),
199 )
200 km.Chat.PageUp = key.NewBinding(
201 key.WithKeys("pgup", "b"),
202 key.WithHelp("b/pgup", "page up"),
203 )
204 km.Chat.HalfPageUp = key.NewBinding(
205 key.WithKeys("u"),
206 key.WithHelp("u", "half page up"),
207 )
208 km.Chat.Home = key.NewBinding(
209 key.WithKeys("g", "home"),
210 key.WithHelp("g", "home"),
211 )
212 km.Chat.End = key.NewBinding(
213 key.WithKeys("G", "end"),
214 key.WithHelp("G", "end"),
215 )
216 km.Chat.Copy = key.NewBinding(
217 key.WithKeys("c", "y", "C", "Y"),
218 key.WithHelp("c/y", "copy"),
219 )
220 km.Chat.ClearHighlight = key.NewBinding(
221 key.WithKeys("esc", "alt+esc"),
222 key.WithHelp("esc", "clear selection"),
223 )
224 km.Chat.Expand = key.NewBinding(
225 key.WithKeys("space"),
226 key.WithHelp("space", "expand/collapse"),
227 )
228 km.Initialize.Yes = key.NewBinding(
229 key.WithKeys("y", "Y"),
230 key.WithHelp("y", "yes"),
231 )
232 km.Initialize.No = key.NewBinding(
233 key.WithKeys("n", "N", "esc", "alt+esc"),
234 key.WithHelp("n", "no"),
235 )
236 km.Initialize.Switch = key.NewBinding(
237 key.WithKeys("left", "right", "tab"),
238 key.WithHelp("tab", "switch"),
239 )
240 km.Initialize.Enter = key.NewBinding(
241 key.WithKeys("enter"),
242 key.WithHelp("enter", "select"),
243 )
244
245 return km
246}