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