Annotation of src/usr.bin/mg/keymap.c, Revision 1.24
1.24 ! deraadt 1: /* $OpenBSD: keymap.c,v 1.23 2002/06/27 23:07:58 vincent Exp $ */
1.5 niklas 2:
1.1 deraadt 3: /*
1.11 mickey 4: * Keyboard maps. This is character set dependent. The terminal specific
1.4 millert 5: * parts of building the keymap has been moved to a better place.
1.1 deraadt 6: */
1.4 millert 7:
1.1 deraadt 8: #include "def.h"
9: #include "kbd.h"
10:
11: /*
1.11 mickey 12: * initial keymap declarations, deepest first
1.1 deraadt 13: */
14:
15: #ifndef NO_HELP
1.4 millert 16: static PF cHcG[] = {
1.3 millert 17: ctrlg, /* ^G */
18: help_help, /* ^H */
19: };
1.4 millert 20:
21: static PF cHa[] = {
1.3 millert 22: apropos_command, /* a */
23: wallchart, /* b */
24: desckey, /* c */
1.1 deraadt 25: };
1.4 millert 26:
1.3 millert 27: static struct KEYMAPE (2 + IMAPEXT) helpmap = {
1.1 deraadt 28: 2,
1.3 millert 29: 2 + IMAPEXT,
1.1 deraadt 30: rescan,
31: {
1.3 millert 32: {
1.10 art 33: CCHR('G'), CCHR('H'), cHcG, NULL
1.3 millert 34: },
35: {
1.10 art 36: 'a', 'c', cHa, NULL
1.3 millert 37: },
1.1 deraadt 38: }
39: };
1.4 millert 40: #endif /* !NO_HELP */
1.1 deraadt 41:
1.4 millert 42: static PF cX4cF[] = {
1.3 millert 43: poptofile, /* ^f */
44: ctrlg, /* ^g */
45: };
1.4 millert 46: static PF cX4b[] = {
1.3 millert 47: poptobuffer, /* b */
48: rescan, /* c */
49: rescan, /* d */
50: rescan, /* e */
51: poptofile, /* f */
1.1 deraadt 52: };
1.3 millert 53: static struct KEYMAPE (2 + IMAPEXT) cX4map = {
1.1 deraadt 54: 2,
1.3 millert 55: 2 + IMAPEXT,
1.1 deraadt 56: rescan,
57: {
1.3 millert 58: {
1.10 art 59: CCHR('F'), CCHR('G'), cX4cF, NULL
1.3 millert 60: },
61: {
1.10 art 62: 'b', 'f', cX4b, NULL
1.3 millert 63: },
1.1 deraadt 64: }
65: };
66:
1.4 millert 67: static PF cXcB[] = {
1.3 millert 68: listbuffers, /* ^B */
69: quit, /* ^C */
70: rescan, /* ^D */
71: rescan, /* ^E */
72: filevisit, /* ^F */
73: ctrlg, /* ^G */
74: };
1.4 millert 75:
76: static PF cXcL[] = {
1.3 millert 77: lowerregion, /* ^L */
78: rescan, /* ^M */
79: rescan, /* ^N */
80: deblank, /* ^O */
81: rescan, /* ^P */
1.23 vincent 82: rescan, /* ^Q */
1.3 millert 83: rescan, /* ^R */
84: filesave, /* ^S */
85: rescan, /* ^T */
86: upperregion, /* ^U */
1.22 vincent 87: rescan, /* ^V */
1.3 millert 88: filewrite, /* ^W */
89: swapmark, /* ^X */
1.1 deraadt 90: };
1.4 millert 91:
1.1 deraadt 92: #ifndef NO_MACRO
1.4 millert 93: static PF cXlp[] = {
1.3 millert 94: definemacro, /* ( */
95: finishmacro, /* ) */
96: };
1.4 millert 97: #endif /* !NO_MACRO */
98:
99: static PF cX0[] = {
1.3 millert 100: delwind, /* 0 */
101: onlywind, /* 1 */
102: splitwind, /* 2 */
103: rescan, /* 3 */
1.6 art 104: NULL, /* 4 */
1.3 millert 105: };
1.4 millert 106:
107: static PF cXeq[] = {
1.3 millert 108: showcpos, /* = */
109: };
1.4 millert 110:
111: static PF cXcar[] = {
1.3 millert 112: enlargewind, /* ^ */
113: rescan, /* _ */
114: rescan, /* ` */
115: rescan, /* a */
116: usebuffer, /* b */
117: rescan, /* c */
1.1 deraadt 118: #ifndef NO_DIRED
1.3 millert 119: dired, /* d */
1.4 millert 120: #else /* !NO_DIRED */
1.3 millert 121: rescan, /* d */
1.4 millert 122: #endif /* !NO_DIRED */
1.1 deraadt 123: #ifndef NO_MACRO
1.3 millert 124: executemacro, /* e */
1.4 millert 125: #else /* !NO_MACRO */
1.3 millert 126: rescan, /* e */
1.4 millert 127: #endif /* !NO_MACRO */
1.3 millert 128: setfillcol, /* f */
129: rescan, /* g */
130: rescan, /* h */
131: fileinsert, /* i */
132: rescan, /* j */
133: killbuffer, /* k */
134: rescan, /* l */
135: rescan, /* m */
1.15 deraadt 136: nextwind, /* n */
1.3 millert 137: nextwind, /* o */
1.15 deraadt 138: prevwind, /* p */
1.3 millert 139: rescan, /* q */
140: rescan, /* r */
141: savebuffers, /* s */
1.24 ! deraadt 142: NULL, /* t */
! 143: undo /* u */
1.1 deraadt 144: };
1.4 millert 145:
1.1 deraadt 146: #ifndef NO_MACRO
1.3 millert 147: static struct KEYMAPE (6 + IMAPEXT) cXmap = {
1.1 deraadt 148: 6,
1.3 millert 149: 6 + IMAPEXT,
1.4 millert 150: #else /* !NO_MACRO */
1.3 millert 151: static struct KEYMAPE (5 + IMAPEXT) cXmap = {
1.1 deraadt 152: 5,
1.3 millert 153: 5 + IMAPEXT,
1.4 millert 154: #endif /* !NO_MACRO */
1.1 deraadt 155: rescan,
156: {
1.3 millert 157: {
1.10 art 158: CCHR('B'), CCHR('G'), cXcB, NULL
1.3 millert 159: },
160: {
1.10 art 161: CCHR('L'), CCHR('X'), cXcL, NULL
1.3 millert 162: },
1.1 deraadt 163: #ifndef NO_MACRO
1.3 millert 164: {
1.10 art 165: '(', ')', cXlp, NULL
1.3 millert 166: },
1.4 millert 167: #endif /* !NO_MACRO */
1.3 millert 168: {
169: '0', '4', cX0, (KEYMAP *) & cX4map
170: },
171: {
1.10 art 172: '=', '=', cXeq, NULL
1.3 millert 173: },
174: {
1.24 ! deraadt 175: '^', 'u', cXcar, NULL
1.3 millert 176: },
1.1 deraadt 177: }
178: };
179:
1.4 millert 180: static PF metacG[] = {
1.3 millert 181: ctrlg, /* ^G */
1.1 deraadt 182: };
1.4 millert 183:
184: static PF metacV[] = {
1.3 millert 185: pagenext, /* ^V */
1.1 deraadt 186: };
1.4 millert 187:
188: static PF metasp[] = {
1.3 millert 189: justone, /* space */
1.1 deraadt 190: };
1.4 millert 191:
192: static PF metapct[] = {
1.3 millert 193: queryrepl, /* % */
1.1 deraadt 194: };
1.4 millert 195:
196: static PF metami[] = {
1.1 deraadt 197: negative_argument, /* - */
1.3 millert 198: rescan, /* . */
199: rescan, /* / */
200: digit_argument, /* 0 */
201: digit_argument, /* 1 */
202: digit_argument, /* 2 */
203: digit_argument, /* 3 */
204: digit_argument, /* 4 */
205: digit_argument, /* 5 */
206: digit_argument, /* 6 */
207: digit_argument, /* 7 */
208: digit_argument, /* 8 */
209: digit_argument, /* 9 */
210: rescan, /* : */
211: rescan, /* ; */
212: gotobob, /* < */
213: rescan, /* = */
214: gotoeob, /* > */
215: };
1.4 millert 216:
217: static PF metalb[] = {
1.3 millert 218: gotobop, /* [ */
219: delwhite, /* \ */
220: gotoeop, /* ] */
221: rescan, /* ^ */
222: rescan, /* _ */
223: rescan, /* ` */
224: rescan, /* a */
225: backword, /* b */
226: capword, /* c */
227: delfword, /* d */
228: rescan, /* e */
229: forwword, /* f */
230: };
1.4 millert 231:
232: static PF metal[] = {
1.3 millert 233: lowerword, /* l */
234: rescan, /* m */
235: rescan, /* n */
236: rescan, /* o */
237: rescan, /* p */
238: fillpara, /* q */
239: backsearch, /* r */
240: forwsearch, /* s */
241: rescan, /* t */
242: upperword, /* u */
243: backpage, /* v */
244: copyregion, /* w */
245: extend, /* x */
246: };
1.4 millert 247:
248: static PF metatilde[] = {
1.3 millert 249: notmodified, /* ~ */
250: delbword, /* DEL */
1.1 deraadt 251: };
1.4 millert 252:
1.3 millert 253: static struct KEYMAPE (8 + IMAPEXT) metamap = {
1.1 deraadt 254: 8,
1.3 millert 255: 8 + IMAPEXT,
1.1 deraadt 256: rescan,
257: {
1.3 millert 258: {
1.10 art 259: CCHR('G'), CCHR('G'), metacG, NULL
1.3 millert 260: },
261: {
1.10 art 262: CCHR('V'), CCHR('V'), metacV, NULL
1.3 millert 263: },
264: {
1.10 art 265: ' ', ' ', metasp, NULL
1.3 millert 266: },
267: {
1.10 art 268: '%', '%', metapct, NULL
1.3 millert 269: },
270: {
1.10 art 271: '-', '>', metami, NULL
1.3 millert 272: },
273: {
1.10 art 274: '[', 'f', metalb, NULL
1.3 millert 275: },
276: {
1.10 art 277: 'l', 'x', metal, NULL
1.3 millert 278: },
279: {
1.10 art 280: '~', CCHR('?'), metatilde, NULL
1.3 millert 281: },
1.1 deraadt 282: }
283: };
284:
1.4 millert 285: static PF fund_at[] = {
1.3 millert 286: setmark, /* ^@ */
287: gotobol, /* ^A */
288: backchar, /* ^B */
289: rescan, /* ^C */
290: forwdel, /* ^D */
291: gotoeol, /* ^E */
292: forwchar, /* ^F */
293: ctrlg, /* ^G */
1.1 deraadt 294: #ifndef NO_HELP
1.6 art 295: NULL, /* ^H */
1.4 millert 296: #else /* !NO_HELP */
1.3 millert 297: rescan, /* ^H */
1.4 millert 298: #endif /* !NO_HELP */
1.1 deraadt 299: };
1.4 millert 300:
1.1 deraadt 301: /* ^I is selfinsert */
1.4 millert 302: static PF fund_CJ[] = {
1.3 millert 303: indent, /* ^J */
304: killline, /* ^K */
305: reposition, /* ^L */
306: newline, /* ^M */
307: forwline, /* ^N */
308: openline, /* ^O */
309: backline, /* ^P */
310: quote, /* ^Q */
311: backisearch, /* ^R */
312: forwisearch, /* ^S */
313: twiddle, /* ^T */
1.1 deraadt 314: universal_argument, /* ^U */
1.3 millert 315: forwpage, /* ^V */
316: killregion, /* ^W */
1.6 art 317: NULL, /* ^X */
1.3 millert 318: yank, /* ^Y */
319: spawncli, /* ^Z */
1.1 deraadt 320: };
1.4 millert 321:
322: static PF fund_esc[] = {
1.6 art 323: NULL, /* esc */
1.4 millert 324: rescan, /* ^\ selfinsert is default on fundamental */
1.3 millert 325: rescan, /* ^] */
326: rescan, /* ^^ */
1.24 ! deraadt 327: undo, /* ^_ */
1.1 deraadt 328: };
1.4 millert 329:
330: static PF fund_del[] = {
1.3 millert 331: backdel, /* DEL */
1.1 deraadt 332: };
333:
334: #ifndef FUND_XMAPS
335: #define NFUND_XMAPS 0 /* extra map sections after normal ones */
336: #endif
337:
1.3 millert 338: static struct KEYMAPE (4 + NFUND_XMAPS + IMAPEXT) fundmap = {
1.1 deraadt 339: 4 + NFUND_XMAPS,
340: 4 + NFUND_XMAPS + IMAPEXT,
341: selfinsert,
342: {
343: #ifndef NO_HELP
1.3 millert 344: {
345: CCHR('@'), CCHR('H'), fund_at, (KEYMAP *) & helpmap
346: },
1.4 millert 347: #else /* !NO_HELP */
1.3 millert 348: {
1.10 art 349: CCHR('@'), CCHR('H'), fund_at, NULL
1.3 millert 350: },
1.4 millert 351: #endif /* !NO_HELP */
1.3 millert 352: {
353: CCHR('J'), CCHR('Z'), fund_CJ, (KEYMAP *) & cXmap
354: },
355: {
356: CCHR('['), CCHR('_'), fund_esc, (KEYMAP *) & metamap
357: },
358: {
1.10 art 359: CCHR('?'), CCHR('?'), fund_del, NULL
1.3 millert 360: },
1.4 millert 361: #ifdef FUND_XMAPS
1.1 deraadt 362: FUND_XMAPS,
1.4 millert 363: #endif /* FUND_XMAPS */
1.1 deraadt 364: }
365: };
366:
1.4 millert 367: static PF fill_sp[] = {
1.3 millert 368: fillword, /* ' ' */
1.1 deraadt 369: };
1.4 millert 370:
1.3 millert 371: static struct KEYMAPE (1 + IMAPEXT) fillmap = {
1.1 deraadt 372: 1,
1.3 millert 373: 1 + IMAPEXT,
1.1 deraadt 374: rescan,
375: {
1.3 millert 376: {
1.10 art 377: ' ', ' ', fill_sp, NULL
1.3 millert 378: },
1.1 deraadt 379: }
380: };
381:
1.4 millert 382: static PF indent_lf[] = {
1.3 millert 383: newline, /* ^J */
384: rescan, /* ^K */
385: rescan, /* ^L */
386: indent, /* ^M */
1.1 deraadt 387: };
1.4 millert 388:
1.3 millert 389: static struct KEYMAPE (1 + IMAPEXT) indntmap = {
1.1 deraadt 390: 1,
1.3 millert 391: 1 + IMAPEXT,
1.1 deraadt 392: rescan,
393: {
1.3 millert 394: {
1.10 art 395: CCHR('J'), CCHR('M'), indent_lf, NULL
1.3 millert 396: },
1.1 deraadt 397: }
398: };
1.4 millert 399:
400: static PF blink_rp[] = {
1.3 millert 401: showmatch, /* ) */
1.1 deraadt 402: };
1.4 millert 403:
1.3 millert 404: static struct KEYMAPE (1 + IMAPEXT) blinkmap = {
1.1 deraadt 405: 1,
1.3 millert 406: 1 + IMAPEXT,
1.1 deraadt 407: rescan,
408: {
1.3 millert 409: {
1.10 art 410: ')', ')', blink_rp, NULL
1.3 millert 411: },
1.1 deraadt 412: }
413: };
414:
1.4 millert 415: #ifdef NOTAB
416: static PF notab_tab[] = {
1.1 deraadt 417: space_to_tabstop, /* ^I */
418: };
1.4 millert 419:
1.3 millert 420: static struct KEYMAPE (1 + IMAPEXT) notabmap = {
1.1 deraadt 421: 1,
1.3 millert 422: 1 + IMAPEXT,
1.1 deraadt 423: rescan,
424: {
1.3 millert 425: {
1.10 art 426: CCHR('I'), CCHR('I'), notab_tab, NULL
1.3 millert 427: },
1.1 deraadt 428: }
429: };
1.4 millert 430: #endif /* NOTAB */
1.1 deraadt 431:
1.3 millert 432: static struct KEYMAPE (1 + IMAPEXT) overwmap = {
1.1 deraadt 433: 0,
1.3 millert 434: 1 + IMAPEXT, /* 1 to avoid 0 sized array */
1.1 deraadt 435: rescan,
436: {
437: /* unused dummy entry for VMS C */
1.3 millert 438: {
1.10 art 439: (KCHAR)0, (KCHAR)0, NULL, NULL
1.3 millert 440: },
1.1 deraadt 441: }
442: };
443:
444: #ifndef NO_DIRED
1.4 millert 445: static PF dirednul[] = {
1.3 millert 446: setmark, /* ^@ */
447: gotobol, /* ^A */
448: backchar, /* ^B */
449: rescan, /* ^C */
450: d_del, /* ^D */
451: gotoeol, /* ^E */
452: forwchar, /* ^F */
453: ctrlg, /* ^G */
1.1 deraadt 454: #ifndef NO_HELP
1.6 art 455: NULL, /* ^H */
1.4 millert 456: #endif /* !NO_HELP */
1.1 deraadt 457: };
1.4 millert 458:
459: static PF diredcl[] = {
1.3 millert 460: reposition, /* ^L */
461: forwline, /* ^M */
462: forwline, /* ^N */
463: rescan, /* ^O */
464: backline, /* ^P */
465: rescan, /* ^Q */
466: backisearch, /* ^R */
467: forwisearch, /* ^S */
468: rescan, /* ^T */
469: universal_argument, /* ^U */
470: forwpage, /* ^V */
471: rescan, /* ^W */
1.6 art 472: NULL, /* ^X */
1.1 deraadt 473: };
1.4 millert 474:
475: static PF diredcz[] = {
1.3 millert 476: spawncli, /* ^Z */
1.6 art 477: NULL, /* esc */
1.3 millert 478: rescan, /* ^\ */
479: rescan, /* ^] */
480: rescan, /* ^^ */
481: rescan, /* ^_ */
482: forwline, /* SP */
483: };
1.4 millert 484:
485: static PF diredc[] = {
1.3 millert 486: d_copy, /* c */
487: d_del, /* d */
488: d_findfile, /* e */
489: d_findfile, /* f */
490: };
1.4 millert 491:
492: static PF diredn[] = {
1.3 millert 493: forwline, /* n */
494: d_ffotherwindow, /* o */
495: backline, /* p */
496: rescan, /* q */
497: d_rename, /* r */
498: rescan, /* s */
499: rescan, /* t */
500: d_undel, /* u */
501: rescan, /* v */
502: rescan, /* w */
503: d_expunge, /* x */
1.1 deraadt 504: };
1.4 millert 505:
506: static PF direddl[] = {
1.3 millert 507: d_undelbak, /* del */
1.1 deraadt 508: };
509:
510: #ifndef DIRED_XMAPS
511: #define NDIRED_XMAPS 0 /* number of extra map sections */
1.4 millert 512: #endif /* DIRED_XMAPS */
1.1 deraadt 513:
1.3 millert 514: static struct KEYMAPE (6 + NDIRED_XMAPS + IMAPEXT) diredmap = {
1.1 deraadt 515: 6 + NDIRED_XMAPS,
516: 6 + NDIRED_XMAPS + IMAPEXT,
517: rescan,
518: {
519: #ifndef NO_HELP
1.3 millert 520: {
521: CCHR('@'), CCHR('H'), dirednul, (KEYMAP *) & helpmap
522: },
1.4 millert 523: #else /* !NO_HELP */
1.3 millert 524: {
1.10 art 525: CCHR('@'), CCHR('G'), dirednul, NULL
1.3 millert 526: },
1.4 millert 527: #endif /* !NO_HELP */
1.3 millert 528: {
529: CCHR('L'), CCHR('X'), diredcl, (KEYMAP *) & cXmap
530: },
531: {
532: CCHR('Z'), ' ', diredcz, (KEYMAP *) & metamap
533: },
534: {
1.10 art 535: 'c', 'f', diredc, NULL
1.3 millert 536: },
537: {
1.10 art 538: 'n', 'x', diredn, NULL
1.3 millert 539: },
540: {
1.10 art 541: CCHR('?'), CCHR('?'), direddl, NULL
1.3 millert 542: },
1.1 deraadt 543: #ifdef DIRED_XMAPS
1.3 millert 544: DIRED_XMAPS, /* map sections for dired mode keys */
1.4 millert 545: #endif /* DIRED_XMAPS */
1.1 deraadt 546: }
547: };
1.4 millert 548: #endif /* !NO_DIRED */
1.1 deraadt 549:
1.13 art 550: MAPS fundamental_mode = { (KEYMAP *)&fundmap, "fundamental", };
551:
1.3 millert 552: /*
553: * give names to the maps, for use by help etc. If the map is to be bindable,
554: * it must also be listed in the function name table below with the same
555: * name. Maps created dynamicly currently don't get added here, thus are
556: * unnamed. Modes are just named keymaps with functions to add/subtract them
557: * from a buffer's list of modes. If you change a mode name, change it in
1.1 deraadt 558: * modes.c also.
559: */
560:
1.13 art 561: static MAPS map_table[] = {
562: {(KEYMAP *) &fillmap, "fill",},
563: {(KEYMAP *) &indntmap, "indent",},
564: {(KEYMAP *) &blinkmap, "blink",},
1.4 millert 565: #ifdef NOTAB
1.13 art 566: {(KEYMAP *) ¬abmap, "notab",},
1.4 millert 567: #endif /* NOTAB */
1.13 art 568: {(KEYMAP *) &overwmap, "overwrite",},
569: {(KEYMAP *) &metamap, "esc prefix",},
570: {(KEYMAP *) &cXmap, "c-x prefix",},
571: {(KEYMAP *) &cX4map, "c-x 4 prefix",},
1.1 deraadt 572: #ifndef NO_HELP
1.13 art 573: {(KEYMAP *) &helpmap, "help",},
1.1 deraadt 574: #endif
575: #ifndef NO_DIRED
1.13 art 576: {(KEYMAP *) &diredmap, "dired",},
1.1 deraadt 577: #endif
1.13 art 578: {NULL, NULL},
1.1 deraadt 579: };
580:
1.13 art 581: MAPS *maps;
582:
583: void
584: maps_init(void)
585: {
586: int i;
587: MAPS *mp;
588:
589: maps = &fundamental_mode;
590: for (i = 0; map_table[i].p_name != NULL; i++) {
591: mp = &map_table[i];
592: mp->p_next = maps;
593: maps = mp;
594: }
595: }
1.9 art 596:
1.13 art 597: int
1.19 vincent 598: maps_add(KEYMAP *map, const char *name)
1.13 art 599: {
600: MAPS *mp;
601:
602: if ((mp = malloc(sizeof(*mp))) == NULL)
603: return FALSE;
604:
605: mp->p_name = name;
606: mp->p_map = map;
607: mp->p_next = maps;
608: maps = mp;
609:
610: return TRUE;
611: }
1.1 deraadt 612:
1.19 vincent 613: const char *
1.13 art 614: map_name(KEYMAP *map)
1.1 deraadt 615: {
1.13 art 616: MAPS *mp;
1.1 deraadt 617:
1.13 art 618: for (mp = maps; mp != NULL; mp = mp->p_next)
1.3 millert 619: if (mp->p_map == map)
620: return mp->p_name;
1.10 art 621: return NULL;
1.1 deraadt 622: }
623:
1.4 millert 624: MAPS *
1.19 vincent 625: name_mode(const char *name)
1.1 deraadt 626: {
1.13 art 627: MAPS *mp;
1.1 deraadt 628:
1.13 art 629: for (mp = maps; mp != NULL; mp = mp->p_next)
1.3 millert 630: if (strcmp(mp->p_name, name) == 0)
631: return mp;
1.10 art 632: return NULL;
1.1 deraadt 633: }
634:
1.4 millert 635: KEYMAP *
1.19 vincent 636: name_map(const char *name)
1.1 deraadt 637: {
1.4 millert 638: MAPS *mp;
1.10 art 639: return (mp = name_mode(name)) == NULL ? NULL : mp->p_map;
1.1 deraadt 640: }
641: