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