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