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