1 /* $OpenBSD: keymap.c,v 1.50 2012/06/07 15:15:04 lum Exp $ */
3 /* This file is in the public domain. */
6 * Keyboard maps. This is character set dependent. The terminal specific
7 * parts of building the keymap has been moved to a better place.
14 * initial keymap declarations, deepest first
23 apropos_command, /* a */
28 struct KEYMAPE (2 + IMAPEXT) helpmap = {
34 CCHR('G'), CCHR('H'), cHcG, NULL
43 cscallerfuncs, /* c */
63 static struct KEYMAPE (1 + IMAPEXT) cCsmap = {
78 struct KEYMAPE (2 + IMAPEXT) ccmap = {
84 CCHR('@'), CCHR('@'), (PF[]){ rescan }, NULL
87 's', 's', cCs, (KEYMAP *) & cCsmap
103 static struct KEYMAPE (2 + IMAPEXT) cX4map = {
109 CCHR('F'), CCHR('G'), cX4cF, NULL
118 listbuffers, /* ^B */
127 lowerregion, /* ^L */
132 togglereadonly, /* ^Q */
133 filevisitro, /* ^R */
136 upperregion, /* ^U */
137 filevisitalt, /* ^V */
159 static PF cXcar[] = {
167 executemacro, /* e */
173 killbuffer_cmd, /* k */
186 struct KEYMAPE (6 + IMAPEXT) cXmap = {
192 CCHR('B'), CCHR('G'), cXcB, NULL
195 CCHR('L'), CCHR('X'), cXcL, NULL
201 '0', '4', cX0, (KEYMAP *) & cX4map
207 '^', 'u', cXcar, NULL
212 static PF metacG[] = {
216 static PF metacV[] = {
220 static PF metasp[] = {
224 static PF metapct[] = {
228 static PF metami[] = {
232 negative_argument, /* - */
235 digit_argument, /* 0 */
236 digit_argument, /* 1 */
237 digit_argument, /* 2 */
238 digit_argument, /* 3 */
239 digit_argument, /* 4 */
240 digit_argument, /* 5 */
241 digit_argument, /* 6 */
242 digit_argument, /* 7 */
243 digit_argument, /* 8 */
244 digit_argument, /* 9 */
252 static PF metasqf[] = {
267 static PF metal[] = {
269 backtoindent, /* m */
288 static PF metasqlZ[] = {
292 static PF metatilde[] = {
297 struct KEYMAPE (1 + IMAPEXT) metasqlmap = {
303 'Z', 'Z', metasqlZ, NULL
308 struct KEYMAPE (8 + IMAPEXT) metamap = {
314 CCHR('G'), CCHR('G'), metacG, NULL
317 CCHR('V'), CCHR('V'), metacV, NULL
320 ' ', ' ', metasp, NULL
323 '%', '%', metapct, NULL
326 '*', '>', metami, NULL
329 '[', 'f', metasqf, (KEYMAP *) &metasqlmap
332 'l', '}', metal, NULL
335 '~', CCHR('?'), metatilde, NULL
340 static PF fund_at[] = {
351 static PF fund_h[] = {
356 /* ^I is selfinsert */
357 static PF fund_CJ[] = {
366 backisearch, /* ^R */
367 forwisearch, /* ^S */
369 universal_argument, /* ^U */
377 static PF fund_esc[] = {
379 rescan, /* ^\ selfinsert is default on fundamental */
385 static PF fund_del[] = {
389 static PF fund_cb[] = {
394 #define NFUND_XMAPS 0 /* extra map sections after normal ones */
397 static struct KEYMAPE (6 + NFUND_XMAPS + IMAPEXT) fundmap = {
399 6 + NFUND_XMAPS + IMAPEXT,
403 CCHR('@'), CCHR('G'), fund_at, (KEYMAP *) & ccmap
406 CCHR('H'), CCHR('H'), fund_h, (KEYMAP *) & helpmap
409 CCHR('J'), CCHR('Z'), fund_CJ, (KEYMAP *) & cXmap
412 CCHR('['), CCHR('_'), fund_esc, (KEYMAP *) & metamap
415 ')', ')', fund_cb, NULL
418 CCHR('?'), CCHR('?'), fund_del, NULL
422 #endif /* FUND_XMAPS */
426 static PF fill_sp[] = {
430 static struct KEYMAPE (1 + IMAPEXT) fillmap = {
435 { ' ', ' ', fill_sp, NULL }
439 static PF indent_lf[] = {
446 static struct KEYMAPE (1 + IMAPEXT) indntmap = {
452 CCHR('J'), CCHR('M'), indent_lf, NULL
458 static PF notab_tab[] = {
459 space_to_tabstop /* ^I */
462 static struct KEYMAPE (1 + IMAPEXT) notabmap = {
468 CCHR('I'), CCHR('I'), notab_tab, NULL
474 static struct KEYMAPE (1 + IMAPEXT) overwmap = {
476 1 + IMAPEXT, /* 1 to avoid 0 sized array */
479 /* unused dummy entry for VMS C */
481 (KCHAR)0, (KCHAR)0, NULL, NULL
488 * The basic (root) keyboard map
490 struct maps_s fundamental_mode = { (KEYMAP *)&fundmap, "fundamental" };
493 * give names to the maps, for use by help etc. If the map is to be bindable,
494 * it must also be listed in the function name table below with the same
495 * name. Maps created dynamically currently don't get added here, thus are
496 * unnamed. Modes are just named keymaps with functions to add/subtract them
497 * from a buffer's list of modes. If you change a mode name, change it in
501 static struct maps_s map_table[] = {
502 {(KEYMAP *) &fillmap, "fill",},
503 {(KEYMAP *) &indntmap, "indent",},
505 {(KEYMAP *) ¬abmap, "notab",},
507 {(KEYMAP *) &overwmap, "overwrite",},
508 {(KEYMAP *) &metamap, "esc prefix",},
509 {(KEYMAP *) &cXmap, "c-x prefix",},
510 {(KEYMAP *) &cX4map, "c-x 4 prefix",},
511 {(KEYMAP *) &helpmap, "help",},
523 maps = &fundamental_mode;
524 for (i = 0; map_table[i].p_name != NULL; i++) {
532 * Insert a new (named) keymap at the head of the keymap list.
535 maps_add(KEYMAP *map, const char *name)
539 if ((mp = malloc(sizeof(*mp))) == NULL)
551 name_mode(const char *name)
555 for (mp = maps; mp != NULL; mp = mp->p_next)
556 if (strcmp(mp->p_name, name) == 0)
562 name_map(const char *name)
566 return ((mp = name_mode(name)) == NULL ? NULL : mp->p_map);