keys.go

  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}