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