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