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