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