[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.3

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