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