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