Annotation of src/usr.bin/mg/keymap.c, Revision 1.4
1.1 deraadt 1: /*
1.4 ! millert 2: * Keyboard maps. This is character set dependent. The terminal specific
! 3: * parts of building the keymap has been moved to a better place.
1.1 deraadt 4: */
1.4 ! millert 5:
1.1 deraadt 6: #include "def.h"
7: #include "kbd.h"
8:
1.4 ! millert 9: static int name_fent __P((char *, int));
1.1 deraadt 10:
11: /*
1.4 ! millert 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.4 ! millert 33: CCHR('G'), CCHR('H'), cHcG, (KEYMAP *)NULL
1.3 millert 34: },
35: {
1.4 ! millert 36: 'a', 'c', cHa, (KEYMAP *)NULL
1.3 millert 37: },
1.1 deraadt 38: }
39: };
1.4 ! millert 40: #endif /* !NO_HELP */
1.1 deraadt 41:
1.3 millert 42: static struct KEYMAPE (1 + IMAPEXT) extramap1 = {
1.1 deraadt 43: 0,
1.3 millert 44: 1 + IMAPEXT,
1.1 deraadt 45: rescan
46: };
47:
1.3 millert 48: static struct KEYMAPE (1 + IMAPEXT) extramap2 = {
1.1 deraadt 49: 0,
1.3 millert 50: 1 + IMAPEXT,
1.1 deraadt 51: rescan
52: };
53:
1.3 millert 54: static struct KEYMAPE (1 + IMAPEXT) extramap3 = {
1.1 deraadt 55: 0,
1.3 millert 56: 1 + IMAPEXT,
1.1 deraadt 57: rescan
58: };
59:
1.3 millert 60: static struct KEYMAPE (1 + IMAPEXT) extramap4 = {
1.1 deraadt 61: 0,
1.3 millert 62: 1 + IMAPEXT,
1.1 deraadt 63: rescan
64: };
65:
1.3 millert 66: static struct KEYMAPE (1 + IMAPEXT) extramap5 = {
1.1 deraadt 67: 0,
1.3 millert 68: 1 + IMAPEXT,
1.1 deraadt 69: rescan
70: };
71:
1.4 ! millert 72: static PF cX4cF[] = {
1.3 millert 73: poptofile, /* ^f */
74: ctrlg, /* ^g */
75: };
1.4 ! millert 76: static PF cX4b[] = {
1.3 millert 77: poptobuffer, /* b */
78: rescan, /* c */
79: rescan, /* d */
80: rescan, /* e */
81: poptofile, /* f */
1.1 deraadt 82: };
1.3 millert 83: static struct KEYMAPE (2 + IMAPEXT) cX4map = {
1.1 deraadt 84: 2,
1.3 millert 85: 2 + IMAPEXT,
1.1 deraadt 86: rescan,
87: {
1.3 millert 88: {
1.4 ! millert 89: CCHR('F'), CCHR('G'), cX4cF, (KEYMAP *)NULL
1.3 millert 90: },
91: {
1.4 ! millert 92: 'b', 'f', cX4b, (KEYMAP *)NULL
1.3 millert 93: },
1.1 deraadt 94: }
95: };
96:
1.4 ! millert 97: static PF cXcB[] = {
1.3 millert 98: listbuffers, /* ^B */
99: quit, /* ^C */
100: rescan, /* ^D */
101: rescan, /* ^E */
102: filevisit, /* ^F */
103: ctrlg, /* ^G */
104: };
1.4 ! millert 105:
! 106: static PF cXcL[] = {
1.3 millert 107: lowerregion, /* ^L */
108: rescan, /* ^M */
109: rescan, /* ^N */
110: deblank, /* ^O */
111: rescan, /* ^P */
112: rescan, /* ^Q */
113: rescan, /* ^R */
114: filesave, /* ^S */
115: rescan, /* ^T */
116: upperregion, /* ^U */
117: rescan, /* ^V */
118: filewrite, /* ^W */
119: swapmark, /* ^X */
1.1 deraadt 120: };
1.4 ! millert 121:
1.1 deraadt 122: #ifndef NO_MACRO
1.4 ! millert 123: static PF cXlp[] = {
1.3 millert 124: definemacro, /* ( */
125: finishmacro, /* ) */
126: };
1.4 ! millert 127: #endif /* !NO_MACRO */
! 128:
! 129: static PF cX0[] = {
1.3 millert 130: delwind, /* 0 */
131: onlywind, /* 1 */
132: splitwind, /* 2 */
133: rescan, /* 3 */
134: prefix, /* 4 */
135: };
1.4 ! millert 136:
! 137: static PF cXeq[] = {
1.3 millert 138: showcpos, /* = */
139: };
1.4 ! millert 140:
! 141: static PF cXcar[] = {
1.3 millert 142: enlargewind, /* ^ */
143: rescan, /* _ */
144: rescan, /* ` */
145: rescan, /* a */
146: usebuffer, /* b */
147: rescan, /* c */
1.1 deraadt 148: #ifndef NO_DIRED
1.3 millert 149: dired, /* d */
1.4 ! millert 150: #else /* !NO_DIRED */
1.3 millert 151: rescan, /* d */
1.4 ! millert 152: #endif /* !NO_DIRED */
1.1 deraadt 153: #ifndef NO_MACRO
1.3 millert 154: executemacro, /* e */
1.4 ! millert 155: #else /* !NO_MACRO */
1.3 millert 156: rescan, /* e */
1.4 ! millert 157: #endif /* !NO_MACRO */
1.3 millert 158: setfillcol, /* f */
159: rescan, /* g */
160: rescan, /* h */
161: fileinsert, /* i */
162: rescan, /* j */
163: killbuffer, /* k */
164: rescan, /* l */
165: rescan, /* m */
166: rescan, /* n */
167: nextwind, /* o */
168: rescan, /* p */
169: rescan, /* q */
170: rescan, /* r */
171: savebuffers, /* s */
1.1 deraadt 172: };
1.4 ! millert 173:
1.1 deraadt 174: #ifndef NO_MACRO
1.3 millert 175: static struct KEYMAPE (6 + IMAPEXT) cXmap = {
1.1 deraadt 176: 6,
1.3 millert 177: 6 + IMAPEXT,
1.4 ! millert 178: #else /* !NO_MACRO */
1.3 millert 179: static struct KEYMAPE (5 + IMAPEXT) cXmap = {
1.1 deraadt 180: 5,
1.3 millert 181: 5 + IMAPEXT,
1.4 ! millert 182: #endif /* !NO_MACRO */
1.1 deraadt 183: rescan,
184: {
1.3 millert 185: {
1.4 ! millert 186: CCHR('B'), CCHR('G'), cXcB, (KEYMAP *)NULL
1.3 millert 187: },
188: {
1.4 ! millert 189: CCHR('L'), CCHR('X'), cXcL, (KEYMAP *)NULL
1.3 millert 190: },
1.1 deraadt 191: #ifndef NO_MACRO
1.3 millert 192: {
1.4 ! millert 193: '(', ')', cXlp, (KEYMAP *)NULL
1.3 millert 194: },
1.4 ! millert 195: #endif /* !NO_MACRO */
1.3 millert 196: {
197: '0', '4', cX0, (KEYMAP *) & cX4map
198: },
199: {
1.4 ! millert 200: '=', '=', cXeq, (KEYMAP *)NULL
1.3 millert 201: },
202: {
1.4 ! millert 203: '^', 's', cXcar, (KEYMAP *)NULL
1.3 millert 204: },
1.1 deraadt 205: }
206: };
207:
1.4 ! millert 208: static PF metacG[] = {
1.3 millert 209: ctrlg, /* ^G */
1.1 deraadt 210: };
1.4 ! millert 211:
! 212: static PF metacV[] = {
1.3 millert 213: pagenext, /* ^V */
1.1 deraadt 214: };
1.4 ! millert 215:
! 216: static PF metasp[] = {
1.3 millert 217: justone, /* space */
1.1 deraadt 218: };
1.4 ! millert 219:
! 220: static PF metapct[] = {
1.3 millert 221: queryrepl, /* % */
1.1 deraadt 222: };
1.4 ! millert 223:
! 224: static PF metami[] = {
1.1 deraadt 225: negative_argument, /* - */
1.3 millert 226: rescan, /* . */
227: rescan, /* / */
228: digit_argument, /* 0 */
229: digit_argument, /* 1 */
230: digit_argument, /* 2 */
231: digit_argument, /* 3 */
232: digit_argument, /* 4 */
233: digit_argument, /* 5 */
234: digit_argument, /* 6 */
235: digit_argument, /* 7 */
236: digit_argument, /* 8 */
237: digit_argument, /* 9 */
238: rescan, /* : */
239: rescan, /* ; */
240: gotobob, /* < */
241: rescan, /* = */
242: gotoeob, /* > */
243: };
1.4 ! millert 244:
! 245: static PF metalb[] = {
1.3 millert 246: gotobop, /* [ */
247: delwhite, /* \ */
248: gotoeop, /* ] */
249: rescan, /* ^ */
250: rescan, /* _ */
251: rescan, /* ` */
252: rescan, /* a */
253: backword, /* b */
254: capword, /* c */
255: delfword, /* d */
256: rescan, /* e */
257: forwword, /* f */
258: };
1.4 ! millert 259:
! 260: static PF metal[] = {
1.3 millert 261: lowerword, /* l */
262: rescan, /* m */
263: rescan, /* n */
264: rescan, /* o */
265: rescan, /* p */
266: fillpara, /* q */
267: backsearch, /* r */
268: forwsearch, /* s */
269: rescan, /* t */
270: upperword, /* u */
271: backpage, /* v */
272: copyregion, /* w */
273: extend, /* x */
274: };
1.4 ! millert 275:
! 276: static PF metatilde[] = {
1.3 millert 277: notmodified, /* ~ */
278: delbword, /* DEL */
1.1 deraadt 279: };
1.4 ! millert 280:
1.3 millert 281: static struct KEYMAPE (8 + IMAPEXT) metamap = {
1.1 deraadt 282: 8,
1.3 millert 283: 8 + IMAPEXT,
1.1 deraadt 284: rescan,
285: {
1.3 millert 286: {
1.4 ! millert 287: CCHR('G'), CCHR('G'), metacG, (KEYMAP *)NULL
1.3 millert 288: },
289: {
1.4 ! millert 290: CCHR('V'), CCHR('V'), metacV, (KEYMAP *)NULL
1.3 millert 291: },
292: {
1.4 ! millert 293: ' ', ' ', metasp, (KEYMAP *)NULL
1.3 millert 294: },
295: {
1.4 ! millert 296: '%', '%', metapct, (KEYMAP *)NULL
1.3 millert 297: },
298: {
1.4 ! millert 299: '-', '>', metami, (KEYMAP *)NULL
1.3 millert 300: },
301: {
1.4 ! millert 302: '[', 'f', metalb, (KEYMAP *)NULL
1.3 millert 303: },
304: {
305: 'l', 'x', metal, (KEYMAP *) NULL
306: },
307: {
1.4 ! millert 308: '~', CCHR('?'), metatilde, (KEYMAP *)NULL
1.3 millert 309: },
1.1 deraadt 310: }
311: };
312:
1.4 ! millert 313: static PF fund_at[] = {
1.3 millert 314: setmark, /* ^@ */
315: gotobol, /* ^A */
316: backchar, /* ^B */
317: rescan, /* ^C */
318: forwdel, /* ^D */
319: gotoeol, /* ^E */
320: forwchar, /* ^F */
321: ctrlg, /* ^G */
1.1 deraadt 322: #ifndef NO_HELP
1.3 millert 323: prefix, /* ^H */
1.4 ! millert 324: #else /* !NO_HELP */
1.3 millert 325: rescan, /* ^H */
1.4 ! millert 326: #endif /* !NO_HELP */
1.1 deraadt 327: };
1.4 ! millert 328:
1.1 deraadt 329: /* ^I is selfinsert */
1.4 ! millert 330: static PF fund_CJ[] = {
1.3 millert 331: indent, /* ^J */
332: killline, /* ^K */
333: reposition, /* ^L */
334: newline, /* ^M */
335: forwline, /* ^N */
336: openline, /* ^O */
337: backline, /* ^P */
338: quote, /* ^Q */
339: backisearch, /* ^R */
340: forwisearch, /* ^S */
341: twiddle, /* ^T */
1.1 deraadt 342: universal_argument, /* ^U */
1.3 millert 343: forwpage, /* ^V */
344: killregion, /* ^W */
345: prefix, /* ^X */
346: yank, /* ^Y */
347: spawncli, /* ^Z */
1.1 deraadt 348: };
1.4 ! millert 349:
! 350: static PF fund_esc[] = {
1.3 millert 351: prefix, /* esc */
1.4 ! millert 352: rescan, /* ^\ selfinsert is default on fundamental */
1.3 millert 353: rescan, /* ^] */
354: rescan, /* ^^ */
355: rescan, /* ^_ */
1.1 deraadt 356: };
1.4 ! millert 357:
! 358: static PF fund_del[] = {
1.3 millert 359: backdel, /* DEL */
1.1 deraadt 360: };
361:
362: #ifndef FUND_XMAPS
363: #define NFUND_XMAPS 0 /* extra map sections after normal ones */
364: #endif
365:
1.3 millert 366: static struct KEYMAPE (4 + NFUND_XMAPS + IMAPEXT) fundmap = {
1.1 deraadt 367: 4 + NFUND_XMAPS,
368: 4 + NFUND_XMAPS + IMAPEXT,
369: selfinsert,
370: {
371: #ifndef NO_HELP
1.3 millert 372: {
373: CCHR('@'), CCHR('H'), fund_at, (KEYMAP *) & helpmap
374: },
1.4 ! millert 375: #else /* !NO_HELP */
1.3 millert 376: {
1.4 ! millert 377: CCHR('@'), CCHR('H'), fund_at, (KEYMAP *)NULL
1.3 millert 378: },
1.4 ! millert 379: #endif /* !NO_HELP */
1.3 millert 380: {
381: CCHR('J'), CCHR('Z'), fund_CJ, (KEYMAP *) & cXmap
382: },
383: {
384: CCHR('['), CCHR('_'), fund_esc, (KEYMAP *) & metamap
385: },
386: {
1.4 ! millert 387: CCHR('?'), CCHR('?'), fund_del, (KEYMAP *)NULL
1.3 millert 388: },
1.4 ! millert 389: #ifdef FUND_XMAPS
1.1 deraadt 390: FUND_XMAPS,
1.4 ! millert 391: #endif /* FUND_XMAPS */
1.1 deraadt 392: }
393: };
394:
1.4 ! millert 395: static PF fill_sp[] = {
1.3 millert 396: fillword, /* ' ' */
1.1 deraadt 397: };
1.4 ! millert 398:
1.3 millert 399: static struct KEYMAPE (1 + IMAPEXT) fillmap = {
1.1 deraadt 400: 1,
1.3 millert 401: 1 + IMAPEXT,
1.1 deraadt 402: rescan,
403: {
1.3 millert 404: {
1.4 ! millert 405: ' ', ' ', fill_sp, (KEYMAP *)NULL
1.3 millert 406: },
1.1 deraadt 407: }
408: };
409:
1.4 ! millert 410: static PF indent_lf[] = {
1.3 millert 411: newline, /* ^J */
412: rescan, /* ^K */
413: rescan, /* ^L */
414: indent, /* ^M */
1.1 deraadt 415: };
1.4 ! millert 416:
1.3 millert 417: static struct KEYMAPE (1 + IMAPEXT) indntmap = {
1.1 deraadt 418: 1,
1.3 millert 419: 1 + IMAPEXT,
1.1 deraadt 420: rescan,
421: {
1.3 millert 422: {
1.4 ! millert 423: CCHR('J'), CCHR('M'), indent_lf, (KEYMAP *)NULL
1.3 millert 424: },
1.1 deraadt 425: }
426: };
1.4 ! millert 427:
! 428: static PF blink_rp[] = {
1.3 millert 429: showmatch, /* ) */
1.1 deraadt 430: };
1.4 ! millert 431:
1.3 millert 432: static struct KEYMAPE (1 + IMAPEXT) blinkmap = {
1.1 deraadt 433: 1,
1.3 millert 434: 1 + IMAPEXT,
1.1 deraadt 435: rescan,
436: {
1.3 millert 437: {
1.4 ! millert 438: ')', ')', blink_rp, (KEYMAP *)NULL
1.3 millert 439: },
1.1 deraadt 440: }
441: };
442:
1.4 ! millert 443: #ifdef NOTAB
! 444: static PF notab_tab[] = {
1.1 deraadt 445: space_to_tabstop, /* ^I */
446: };
1.4 ! millert 447:
1.3 millert 448: static struct KEYMAPE (1 + IMAPEXT) notabmap = {
1.1 deraadt 449: 1,
1.3 millert 450: 1 + IMAPEXT,
1.1 deraadt 451: rescan,
452: {
1.3 millert 453: {
1.4 ! millert 454: CCHR('I'), CCHR('I'), notab_tab, (KEYMAP *)NULL
1.3 millert 455: },
1.1 deraadt 456: }
457: };
1.4 ! millert 458: #endif /* NOTAB */
1.1 deraadt 459:
1.3 millert 460: static struct KEYMAPE (1 + IMAPEXT) overwmap = {
1.1 deraadt 461: 0,
1.3 millert 462: 1 + IMAPEXT, /* 1 to avoid 0 sized array */
1.1 deraadt 463: rescan,
464: {
465: /* unused dummy entry for VMS C */
1.3 millert 466: {
1.4 ! millert 467: (KCHAR)0, (KCHAR)0, (PF *)NULL, (KEYMAP *)NULL
1.3 millert 468: },
1.1 deraadt 469: }
470: };
471:
472: #ifndef NO_DIRED
1.4 ! millert 473: static PF dirednul[] = {
1.3 millert 474: setmark, /* ^@ */
475: gotobol, /* ^A */
476: backchar, /* ^B */
477: rescan, /* ^C */
478: d_del, /* ^D */
479: gotoeol, /* ^E */
480: forwchar, /* ^F */
481: ctrlg, /* ^G */
1.1 deraadt 482: #ifndef NO_HELP
1.3 millert 483: prefix, /* ^H */
1.4 ! millert 484: #endif /* !NO_HELP */
1.1 deraadt 485: };
1.4 ! millert 486:
! 487: static PF diredcl[] = {
1.3 millert 488: reposition, /* ^L */
489: forwline, /* ^M */
490: forwline, /* ^N */
491: rescan, /* ^O */
492: backline, /* ^P */
493: rescan, /* ^Q */
494: backisearch, /* ^R */
495: forwisearch, /* ^S */
496: rescan, /* ^T */
497: universal_argument, /* ^U */
498: forwpage, /* ^V */
499: rescan, /* ^W */
500: prefix, /* ^X */
1.1 deraadt 501: };
1.4 ! millert 502:
! 503: static PF diredcz[] = {
1.3 millert 504: spawncli, /* ^Z */
505: prefix, /* esc */
506: rescan, /* ^\ */
507: rescan, /* ^] */
508: rescan, /* ^^ */
509: rescan, /* ^_ */
510: forwline, /* SP */
511: };
1.4 ! millert 512:
! 513: static PF diredc[] = {
1.3 millert 514: d_copy, /* c */
515: d_del, /* d */
516: d_findfile, /* e */
517: d_findfile, /* f */
518: };
1.4 ! millert 519:
! 520: static PF diredn[] = {
1.3 millert 521: forwline, /* n */
522: d_ffotherwindow, /* o */
523: backline, /* p */
524: rescan, /* q */
525: d_rename, /* r */
526: rescan, /* s */
527: rescan, /* t */
528: d_undel, /* u */
529: rescan, /* v */
530: rescan, /* w */
531: d_expunge, /* x */
1.1 deraadt 532: };
1.4 ! millert 533:
! 534: static PF direddl[] = {
1.3 millert 535: d_undelbak, /* del */
1.1 deraadt 536: };
537:
538: #ifndef DIRED_XMAPS
539: #define NDIRED_XMAPS 0 /* number of extra map sections */
1.4 ! millert 540: #endif /* DIRED_XMAPS */
1.1 deraadt 541:
1.3 millert 542: static struct KEYMAPE (6 + NDIRED_XMAPS + IMAPEXT) diredmap = {
1.1 deraadt 543: 6 + NDIRED_XMAPS,
544: 6 + NDIRED_XMAPS + IMAPEXT,
545: rescan,
546: {
547: #ifndef NO_HELP
1.3 millert 548: {
549: CCHR('@'), CCHR('H'), dirednul, (KEYMAP *) & helpmap
550: },
1.4 ! millert 551: #else /* !NO_HELP */
1.3 millert 552: {
1.4 ! millert 553: CCHR('@'), CCHR('G'), dirednul, (KEYMAP *)NULL
1.3 millert 554: },
1.4 ! millert 555: #endif /* !NO_HELP */
1.3 millert 556: {
557: CCHR('L'), CCHR('X'), diredcl, (KEYMAP *) & cXmap
558: },
559: {
560: CCHR('Z'), ' ', diredcz, (KEYMAP *) & metamap
561: },
562: {
1.4 ! millert 563: 'c', 'f', diredc, (KEYMAP *)NULL
1.3 millert 564: },
565: {
1.4 ! millert 566: 'n', 'x', diredn, (KEYMAP *)NULL
1.3 millert 567: },
568: {
1.4 ! millert 569: CCHR('?'), CCHR('?'), direddl, (KEYMAP *)NULL
1.3 millert 570: },
1.1 deraadt 571: #ifdef DIRED_XMAPS
1.3 millert 572: DIRED_XMAPS, /* map sections for dired mode keys */
1.4 ! millert 573: #endif /* DIRED_XMAPS */
1.1 deraadt 574: }
575: };
1.4 ! millert 576: #endif /* !NO_DIRED */
1.1 deraadt 577:
1.3 millert 578: /*
579: * give names to the maps, for use by help etc. If the map is to be bindable,
580: * it must also be listed in the function name table below with the same
581: * name. Maps created dynamicly currently don't get added here, thus are
582: * unnamed. Modes are just named keymaps with functions to add/subtract them
583: * from a buffer's list of modes. If you change a mode name, change it in
1.1 deraadt 584: * modes.c also.
585: */
586:
1.4 ! millert 587: MAPS map_table[] = {
1.1 deraadt 588: /* fundamental map MUST be first entry */
1.3 millert 589: {(KEYMAP *) & fundmap, "fundamental"},
590: {(KEYMAP *) & fillmap, "fill"},
591: {(KEYMAP *) & indntmap, "indent"},
592: {(KEYMAP *) & blinkmap, "blink"},
1.4 ! millert 593: #ifdef NOTAB
1.3 millert 594: {(KEYMAP *) & notabmap, "notab"},
1.4 ! millert 595: #endif /* NOTAB */
1.3 millert 596: {(KEYMAP *) & overwmap, "overwrite"},
597: {(KEYMAP *) & metamap, "esc prefix"},
598: {(KEYMAP *) & cXmap, "c-x prefix"},
599: {(KEYMAP *) & cX4map, "c-x 4 prefix"},
600: {(KEYMAP *) & extramap1, "extra prefix 1"},
601: {(KEYMAP *) & extramap2, "extra prefix 2"},
602: {(KEYMAP *) & extramap3, "extra prefix 3"},
603: {(KEYMAP *) & extramap4, "extra prefix 4"},
604: {(KEYMAP *) & extramap5, "extra prefix 5"},
1.1 deraadt 605: #ifndef NO_HELP
1.3 millert 606: {(KEYMAP *) & helpmap, "help"},
1.1 deraadt 607: #endif
608: #ifndef NO_DIRED
1.3 millert 609: {(KEYMAP *) & diredmap, "dired"},
1.1 deraadt 610: #endif
611: };
612:
613: #define NMAPS (sizeof map_table/sizeof(MAPS))
1.4 ! millert 614: int nmaps = NMAPS; /* for use by rebind in extend.c */
1.1 deraadt 615:
1.4 ! millert 616: char *
1.3 millert 617: map_name(map)
1.4 ! millert 618: KEYMAP *map;
1.1 deraadt 619: {
1.4 ! millert 620: MAPS *mp = &map_table[0];
1.1 deraadt 621:
622: do {
1.3 millert 623: if (mp->p_map == map)
624: return mp->p_name;
625: } while (++mp < &map_table[NMAPS]);
1.4 ! millert 626: return (char *)NULL;
1.1 deraadt 627: }
628:
1.4 ! millert 629: MAPS *
1.3 millert 630: name_mode(name)
1.4 ! millert 631: char *name;
1.1 deraadt 632: {
1.4 ! millert 633: MAPS *mp = &map_table[0];
1.1 deraadt 634:
635: do {
1.3 millert 636: if (strcmp(mp->p_name, name) == 0)
637: return mp;
638: } while (++mp < &map_table[NMAPS]);
1.4 ! millert 639: return (MAPS *)NULL;
1.1 deraadt 640: }
641:
1.4 ! millert 642: KEYMAP *
1.3 millert 643: name_map(name)
1.4 ! millert 644: char *name;
1.1 deraadt 645: {
1.4 ! millert 646: MAPS *mp;
! 647: return (mp = name_mode(name)) == NULL ? (KEYMAP *)NULL : mp->p_map;
1.1 deraadt 648: }
649:
1.3 millert 650: /*
651: * Warning: functnames MUST be in alphabetical order! (due to binary search
652: * in name_function.) If the function is prefix, it must be listed with the
653: * same name in the map_table above.
1.1 deraadt 654: */
1.4 ! millert 655: FUNCTNAMES functnames[] = {
1.1 deraadt 656: #ifndef NO_HELP
657: {apropos_command, "apropos"},
1.4 ! millert 658: #endif /* !NO_HELP */
1.3 millert 659: {fillmode, "auto-fill-mode"},
660: {indentmode, "auto-indent-mode"},
661: {backchar, "backward-char"},
662: {delbword, "backward-kill-word"},
663: {gotobop, "backward-paragraph"},
664: {backword, "backward-word"},
665: {gotobob, "beginning-of-buffer"},
666: {gotobol, "beginning-of-line"},
667: {blinkparen, "blink-matching-paren"},
668: {showmatch, "blink-matching-paren-hack"},
1.4 ! millert 669: #ifdef BSMAP
1.3 millert 670: {bsmap, "bsmap-mode"},
1.4 ! millert 671: #endif /* BSMAP */
1.3 millert 672: {prefix, "c-x 4 prefix"},
673: {prefix, "c-x prefix"},
1.1 deraadt 674: #ifndef NO_MACRO
1.3 millert 675: {executemacro, "call-last-kbd-macro"},
1.4 ! millert 676: #endif /* !NO_MACRO */
1.3 millert 677: {capword, "capitalize-word"},
1.1 deraadt 678: #ifndef NO_DIR
1.3 millert 679: {changedir, "cd"},
1.4 ! millert 680: #endif /* !NO_DIR */
1.3 millert 681: {copyregion, "copy-region-as-kill"},
1.1 deraadt 682: #ifdef REGEX
683: {cntmatchlines, "count-matches"},
1.3 millert 684: {cntnonmatchlines, "count-non-matches"},
1.4 ! millert 685: #endif /* REGEX */
1.3 millert 686: {define_key, "define-key"},
687: {backdel, "delete-backward-char"},
688: {deblank, "delete-blank-lines"},
689: {forwdel, "delete-char"},
690: {delwhite, "delete-horizontal-space"},
1.1 deraadt 691: #ifdef REGEX
692: {delmatchlines, "delete-matching-lines"},
1.3 millert 693: {delnonmatchlines, "delete-non-matching-lines"},
1.4 ! millert 694: #endif /* REGEX */
1.3 millert 695: {onlywind, "delete-other-windows"},
696: {delwind, "delete-window"},
1.1 deraadt 697: #ifndef NO_HELP
1.3 millert 698: {wallchart, "describe-bindings"},
699: {desckey, "describe-key-briefly"},
1.4 ! millert 700: #endif /* !NO_HELP */
1.3 millert 701: {digit_argument, "digit-argument"},
1.1 deraadt 702: #ifndef NO_DIRED
1.3 millert 703: {dired, "dired"},
704: {d_undelbak, "dired-backup-unflag"},
705: {d_copy, "dired-copy-file"},
706: {d_expunge, "dired-do-deletions"},
707: {d_findfile, "dired-find-file"},
1.1 deraadt 708: {d_ffotherwindow, "dired-find-file-other-window"},
1.3 millert 709: {d_del, "dired-flag-file-deleted"},
1.1 deraadt 710: {d_otherwindow, "dired-other-window"},
1.3 millert 711: {d_rename, "dired-rename-file"},
712: {d_undel, "dired-unflag"},
1.4 ! millert 713: #endif /* !NO_DIRED */
1.3 millert 714: {lowerregion, "downcase-region"},
715: {lowerword, "downcase-word"},
716: {showversion, "emacs-version"},
1.1 deraadt 717: #ifndef NO_MACRO
1.3 millert 718: {finishmacro, "end-kbd-macro"},
1.4 ! millert 719: #endif /* !NO_MACRO */
1.3 millert 720: {gotoeob, "end-of-buffer"},
721: {gotoeol, "end-of-line"},
722: {enlargewind, "enlarge-window"},
723: {prefix, "esc prefix"},
1.1 deraadt 724: #ifndef NO_STARTUP
1.3 millert 725: {evalbuffer, "eval-current-buffer"},
726: {evalexpr, "eval-expression"},
1.4 ! millert 727: #endif /* !NO_STARTUP */
1.3 millert 728: {swapmark, "exchange-point-and-mark"},
729: {extend, "execute-extended-command"},
730: {prefix, "extra prefix 1"},
731: {prefix, "extra prefix 2"},
732: {prefix, "extra prefix 3"},
733: {prefix, "extra prefix 4"},
734: {prefix, "extra prefix 5"},
735: {fillpara, "fill-paragraph"},
736: {filevisit, "find-file"},
737: {poptofile, "find-file-other-window"},
738: {forwchar, "forward-char"},
739: {gotoeop, "forward-paragraph"},
740: {forwword, "forward-word"},
741: {bindtokey, "global-set-key"},
742: {unbindtokey, "global-unset-key"},
743: {gotoline, "goto-line"},
1.1 deraadt 744: #ifndef NO_HELP
1.3 millert 745: {prefix, "help"},
746: {help_help, "help-help"},
1.4 ! millert 747: #endif /* !NO_HELP */
1.3 millert 748: {insert, "insert"},
749: {bufferinsert, "insert-buffer"},
750: {fileinsert, "insert-file"},
751: {fillword, "insert-with-wrap"},
752: {backisearch, "isearch-backward"},
753: {forwisearch, "isearch-forward"},
754: {justone, "just-one-space"},
755: {ctrlg, "keyboard-quit"},
756: {killbuffer, "kill-buffer"},
757: {killline, "kill-line"},
758: {killpara, "kill-paragraph"},
759: {killregion, "kill-region"},
760: {delfword, "kill-word"},
761: {listbuffers, "list-buffers"},
1.1 deraadt 762: #ifndef NO_STARTUP
1.3 millert 763: {evalfile, "load"},
1.4 ! millert 764: #endif /* !NO_STARTUP */
1.3 millert 765: {localbind, "local-set-key"},
766: {localunbind, "local-unset-key"},
1.1 deraadt 767: #ifndef NO_BACKUP
1.3 millert 768: {makebkfile, "make-backup-files"},
1.4 ! millert 769: #endif /* !NO_BACKUP */
! 770: #ifdef DO_METAKEY
1.3 millert 771: {do_meta, "meta-key-mode"}, /* better name, anyone? */
1.4 ! millert 772: #endif /* DO_METAKEY */
1.1 deraadt 773: {negative_argument, "negative-argument"},
1.3 millert 774: {newline, "newline"},
775: {indent, "newline-and-indent"},
776: {forwline, "next-line"},
1.4 ! millert 777: #ifdef NOTAB
1.3 millert 778: {notabmode, "no-tab-mode"},
1.4 ! millert 779: #endif /* NOTAB */
1.3 millert 780: {notmodified, "not-modified"},
781: {openline, "open-line"},
782: {nextwind, "other-window"},
783: {overwrite, "overwrite-mode"},
1.4 ! millert 784: #ifdef PREFIXREGION
1.3 millert 785: {prefixregion, "prefix-region"},
1.4 ! millert 786: #endif /* PREFIXREGION */
1.3 millert 787: {backline, "previous-line"},
1.4 ! millert 788: #ifdef GOSMACS
1.3 millert 789: {prevwind, "previous-window"},
1.4 ! millert 790: #endif /* GOSEMACS */
1.3 millert 791: {spawncli, "push-shell"},
1.1 deraadt 792: #ifndef NO_DIR
1.3 millert 793: {showcwdir, "pwd"},
1.4 ! millert 794: #endif /* !NO_DIR */
1.3 millert 795: {queryrepl, "query-replace"},
1.4 ! millert 796: #ifdef REGEX
1.3 millert 797: {re_queryrepl, "query-replace-regexp"},
1.4 ! millert 798: #endif /* REGEX */
1.3 millert 799: {quote, "quoted-insert"},
1.4 ! millert 800: #ifdef REGEX
1.3 millert 801: {re_searchagain, "re-search-again"},
1.1 deraadt 802: {re_backsearch, "re-search-backward"},
803: {re_forwsearch, "re-search-forward"},
1.4 ! millert 804: #endif /* REGEX */
1.3 millert 805: {reposition, "recenter"},
806: {refresh, "redraw-display"},
807: {filesave, "save-buffer"},
808: {quit, "save-buffers-kill-emacs"},
809: {savebuffers, "save-some-buffers"},
810: {backpage, "scroll-down"},
1.4 ! millert 811: #ifdef GOSMACS
1.3 millert 812: {back1page, "scroll-one-line-down"},
813: {forw1page, "scroll-one-line-up"},
1.4 ! millert 814: #endif /* GOSMACS */
1.3 millert 815: {pagenext, "scroll-other-window"},
816: {forwpage, "scroll-up"},
817: {searchagain, "search-again"},
818: {backsearch, "search-backward"},
819: {forwsearch, "search-forward"},
820: {selfinsert, "self-insert-command"},
1.4 ! millert 821: #ifdef REGEX
1.3 millert 822: {setcasefold, "set-case-fold-search"},
1.4 ! millert 823: #endif /* REGEX */
1.1 deraadt 824: {set_default_mode, "set-default-mode"},
1.3 millert 825: {setfillcol, "set-fill-column"},
826: {setmark, "set-mark-command"},
1.4 ! millert 827: #ifdef PREFIXREGION
1.3 millert 828: {setprefix, "set-prefix-string"},
1.4 ! millert 829: #endif /* PREFIXREGION */
1.3 millert 830: {shrinkwind, "shrink-window"},
1.4 ! millert 831: #ifdef NOTAB
1.1 deraadt 832: {space_to_tabstop, "space-to-tabstop"},
1.4 ! millert 833: #endif /* NOTAB */
1.3 millert 834: {splitwind, "split-window-vertically"},
1.1 deraadt 835: #ifndef NO_MACRO
1.3 millert 836: {definemacro, "start-kbd-macro"},
1.4 ! millert 837: #endif /* !NO_MACRO */
1.3 millert 838: {spawncli, "suspend-emacs"},
839: {usebuffer, "switch-to-buffer"},
840: {poptobuffer, "switch-to-buffer-other-window"},
841: {twiddle, "transpose-chars"},
1.1 deraadt 842: {universal_argument, "universal-argument"},
1.3 millert 843: {upperregion, "upcase-region"},
844: {upperword, "upcase-word"},
845: {showcpos, "what-cursor-position"},
846: {filewrite, "write-file"},
847: {yank, "yank"},
1.1 deraadt 848: };
849:
850: #define NFUNCT (sizeof(functnames)/sizeof(FUNCTNAMES))
851:
1.4 ! millert 852: int nfunct = NFUNCT; /* used by help.c */
1.1 deraadt 853:
854: /*
855: * The general-purpose version of ROUND2 blows osk C (2.0) out of the water.
856: * (reboot required) If you need to build a version of mg with less than 32
857: * or more than 511 functions, something better must be done.
858: * The version that should work, but doesn't is:
859: * #define ROUND2(x) (1+((x>>1)|(x>>2)|(x>>3)|(x>>4)|(x>>5)|(x>>6)|(x>>7)|\
860: * (x>>8)|(x>>9)|(x>>10)|(x>>11)|(x>>12)|(x>>13)|(x>>14)|(x>>15)))
861: */
862: #define ROUND2(x) (x<128?(x<64?32:64):(x<256?128:256))
863:
1.4 ! millert 864: static int
1.3 millert 865: name_fent(fname, flag)
1.4 ! millert 866: char *fname;
! 867: int flag;
1.1 deraadt 868: {
1.4 ! millert 869: int try, notit;
! 870: int x = ROUND2(NFUNCT);
! 871: int base = 0;
1.1 deraadt 872:
873: do {
1.3 millert 874: /* + can be used instead of | here if more efficent. */
875: if ((try = base | x) < NFUNCT) {
1.4 ! millert 876: if ((notit = strcmp(fname, functnames[try].n_name))
! 877: >= 0) {
1.3 millert 878: if (!notit)
879: return try;
880: base = try;
881: }
1.1 deraadt 882: }
1.4 ! millert 883: /* try 0 once if needed */
! 884: } while ((x >>= 1) || (try == 1 && base == 0));
1.1 deraadt 885: return flag ? base : -1;
886: }
887:
888: /*
889: * Translate from function name to function pointer, using binary search.
890: */
891:
1.3 millert 892: PF
893: name_function(fname)
1.4 ! millert 894: char *fname;
1.1 deraadt 895: {
1.4 ! millert 896: int i;
1.3 millert 897: if ((i = name_fent(fname, FALSE)) >= 0)
898: return functnames[i].n_funct;
1.4 ! millert 899: return (PF)NULL;
1.1 deraadt 900: }
901:
1.4 ! millert 902: /*
! 903: * complete function name
! 904: */
1.3 millert 905: int
1.1 deraadt 906: complete_function(fname, c)
1.4 ! millert 907: char *fname;
! 908: int c;
1.1 deraadt 909: {
1.4 ! millert 910: int i, j, k, l, oj;
1.1 deraadt 911:
912: i = name_fent(fname, TRUE);
1.3 millert 913: for (j = 0; (l = fname[j]) && functnames[i].n_name[j] == l; j++) {
1.1 deraadt 914: }
1.3 millert 915: if (fname[j] != '\0') {
916: if (++i >= NFUNCT)
1.4 ! millert 917: /* no match */
! 918: return -2;
! 919: for (j = 0; (l = fname[j]) && functnames[i].n_name[j] == l;
! 920: j++);
1.3 millert 921: if (fname[j] != '\0')
1.4 ! millert 922: /* no match */
! 923: return -2;
1.3 millert 924: }
925: if (c == CCHR('M') && functnames[i].n_name[j] == '\0')
926: return -1;
1.4 ! millert 927: /* find last match */
! 928: for (k = i + 1; k < NFUNCT; k++) {
! 929: for (l = 0; functnames[k].n_name[l] == fname[l]; l++);
1.3 millert 930: if (l < j)
931: break;
1.1 deraadt 932: }
933: k--;
934: oj = j;
1.4 ! millert 935:
! 936: if (k > i) {
! 937: /* multiple matches */
! 938: while ((l = functnames[i].n_name[j]) ==
! 939: functnames[k].n_name[j]) {
1.3 millert 940: fname[j++] = l;
941: if (l == '-' && c == ' ')
942: break;
943: }
944: if (j == oj)
1.4 ! millert 945: /* ambiguous */
! 946: return -3;
! 947: } else {
! 948: /* single match */
! 949: while ((l = functnames[i].n_name[j])) {
1.3 millert 950: fname[j++] = l;
951: if (l == '-' && c == ' ')
952: break;
953: }
1.1 deraadt 954: }
955: fname[j] = '\0';
956: return j - oj;
957: }
958:
1.4 ! millert 959: /*
! 960: * list possible function name completions.
! 961: */
! 962: LIST *
1.3 millert 963: complete_function_list(fname, c)
1.4 ! millert 964: char *fname;
! 965: int c;
1.1 deraadt 966: {
1.4 ! millert 967: int i, j, k, l;
! 968: LIST *current, *last;
1.1 deraadt 969:
970: i = name_fent(fname, TRUE);
1.4 ! millert 971: for (j = 0; (l = fname[j]) && functnames[i].n_name[j] == l; j++);
1.3 millert 972: if (fname[j] != '\0') {
973: if (++i >= NFUNCT)
1.4 ! millert 974: /* no match */
! 975: return NULL;
! 976: for (j = 0; (l = fname[j]) && functnames[i].n_name[j] == l;
! 977: j++);
1.3 millert 978: if (fname[j] != '\0')
1.4 ! millert 979: /* no match */
! 980: return NULL;
1.1 deraadt 981: }
1.3 millert 982: /*
1.4 ! millert 983: * if(c==CCHR('M') && functnames[i].n_name[j]=='\0') return -1;
1.3 millert 984: */
1.4 ! millert 985: /* find last match */
! 986: for (k = i + 1; k < NFUNCT; k++) {
! 987: for (l = 0; functnames[k].n_name[l] == fname[l]; l++);
1.3 millert 988: if (l < j)
989: break;
1.1 deraadt 990: }
991: k--;
992: last = NULL;
993: for (; k >= i; k--) {
1.4 ! millert 994: current = (LIST *)malloc(sizeof(LIST));
1.3 millert 995: current->l_next = last;
996: current->l_name = functnames[k].n_name;
997: last = current;
1.1 deraadt 998: }
1.3 millert 999: return (last);
1.1 deraadt 1000: }
1001:
1.4 ! millert 1002: /*
! 1003: * translate from function pointer to function name.
! 1004: */
! 1005: char *
1.3 millert 1006: function_name(fpoint)
1.4 ! millert 1007: PF fpoint;
1.1 deraadt 1008: {
1.4 ! millert 1009: FUNCTNAMES *fnp = &functnames[0];
1.1 deraadt 1010:
1.3 millert 1011: if (fpoint == prefix)
1.4 ! millert 1012: /* ambiguous */
! 1013: return (char *)NULL;
1.1 deraadt 1014: do {
1.3 millert 1015: if (fnp->n_funct == fpoint)
1016: return fnp->n_name;
1017: } while (++fnp < &functnames[NFUNCT]);
1.4 ! millert 1018: return (char *)NULL;
1.1 deraadt 1019: }