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}
 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}