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