[BACK]Return to keymap.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / mg

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: }