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

1.46    ! lum         1: /*     $OpenBSD: keymap.c,v 1.45 2011/01/18 16:25:40 kjell Exp $       */
1.30      kjell       2:
                      3: /* This file is in the public domain. */
1.5       niklas      4:
1.1       deraadt     5: /*
1.11      mickey      6:  * Keyboard maps.  This is character set dependent.  The terminal specific
1.4       millert     7:  * parts of building the keymap has been moved to a better place.
1.1       deraadt     8:  */
1.4       millert     9:
1.28      db         10: #include "def.h"
                     11: #include "kbd.h"
1.1       deraadt    12:
                     13: /*
1.11      mickey     14:  * initial keymap declarations, deepest first
1.1       deraadt    15:  */
                     16:
                     17: #ifndef NO_HELP
1.4       millert    18: static PF cHcG[] = {
1.3       millert    19:        ctrlg,                  /* ^G */
1.28      db         20:        help_help               /* ^H */
1.3       millert    21: };
1.4       millert    22:
                     23: static PF cHa[] = {
1.3       millert    24:        apropos_command,        /* a */
                     25:        wallchart,              /* b */
1.28      db         26:        desckey                 /* c */
1.1       deraadt    27: };
1.4       millert    28:
1.33      kjell      29: struct KEYMAPE (2 + IMAPEXT) helpmap = {
1.1       deraadt    30:        2,
1.3       millert    31:        2 + IMAPEXT,
1.1       deraadt    32:        rescan,
                     33:        {
1.3       millert    34:                {
1.10      art        35:                        CCHR('G'), CCHR('H'), cHcG, NULL
1.3       millert    36:                },
                     37:                {
1.10      art        38:                        'a', 'c', cHa, NULL
1.28      db         39:                }
1.1       deraadt    40:        }
                     41: };
1.4       millert    42: #endif /* !NO_HELP */
1.1       deraadt    43:
1.43      kjell      44: struct KEYMAPE (1 + IMAPEXT) ccmap = {
                     45:        1,
                     46:        1 + IMAPEXT,
                     47:        rescan,
                     48:        {
                     49:                {
                     50:                        CCHR('@'), CCHR('@'), (PF[]){ rescan }, NULL
                     51:                }
                     52:        }
                     53: };
                     54:
                     55:
1.4       millert    56: static PF cX4cF[] = {
1.3       millert    57:        poptofile,              /* ^f */
1.28      db         58:        ctrlg                   /* ^g */
1.3       millert    59: };
1.4       millert    60: static PF cX4b[] = {
1.3       millert    61:        poptobuffer,            /* b */
                     62:        rescan,                 /* c */
                     63:        rescan,                 /* d */
                     64:        rescan,                 /* e */
1.28      db         65:        poptofile               /* f */
1.1       deraadt    66: };
1.3       millert    67: static struct KEYMAPE (2 + IMAPEXT) cX4map = {
1.1       deraadt    68:        2,
1.3       millert    69:        2 + IMAPEXT,
1.1       deraadt    70:        rescan,
                     71:        {
1.3       millert    72:                {
1.10      art        73:                        CCHR('F'), CCHR('G'), cX4cF, NULL
1.3       millert    74:                },
                     75:                {
1.10      art        76:                        'b', 'f', cX4b, NULL
1.28      db         77:                }
1.1       deraadt    78:        }
                     79: };
                     80:
1.4       millert    81: static PF cXcB[] = {
1.3       millert    82:        listbuffers,            /* ^B */
                     83:        quit,                   /* ^C */
                     84:        rescan,                 /* ^D */
                     85:        rescan,                 /* ^E */
                     86:        filevisit,              /* ^F */
1.28      db         87:        ctrlg                   /* ^G */
1.3       millert    88: };
1.4       millert    89:
                     90: static PF cXcL[] = {
1.3       millert    91:        lowerregion,            /* ^L */
                     92:        rescan,                 /* ^M */
                     93:        rescan,                 /* ^N */
                     94:        deblank,                /* ^O */
                     95:        rescan,                 /* ^P */
1.34      kjell      96:        togglereadonly,         /* ^Q */
1.31      kjell      97:        filevisitro,            /* ^R */
1.3       millert    98:        filesave,               /* ^S */
                     99:        rescan,                 /* ^T */
                    100:        upperregion,            /* ^U */
1.29      jason     101:        filevisitalt,           /* ^V */
1.3       millert   102:        filewrite,              /* ^W */
1.28      db        103:        swapmark                /* ^X */
1.1       deraadt   104: };
1.4       millert   105:
1.1       deraadt   106: #ifndef NO_MACRO
1.4       millert   107: static PF cXlp[] = {
1.3       millert   108:        definemacro,            /* ( */
1.28      db        109:        finishmacro             /* ) */
1.3       millert   110: };
1.4       millert   111: #endif /* !NO_MACRO */
                    112:
                    113: static PF cX0[] = {
1.3       millert   114:        delwind,                /* 0 */
                    115:        onlywind,               /* 1 */
                    116:        splitwind,              /* 2 */
                    117:        rescan,                 /* 3 */
1.28      db        118:        NULL                    /* 4 */
1.3       millert   119: };
1.4       millert   120:
                    121: static PF cXeq[] = {
1.28      db        122:        showcpos                /* = */
1.3       millert   123: };
1.4       millert   124:
                    125: static PF cXcar[] = {
1.3       millert   126:        enlargewind,            /* ^ */
                    127:        rescan,                 /* _ */
1.32      kjell     128:        next_error,             /* ` */
1.3       millert   129:        rescan,                 /* a */
                    130:        usebuffer,              /* b */
                    131:        rescan,                 /* c */
                    132:        rescan,                 /* d */
1.1       deraadt   133: #ifndef NO_MACRO
1.3       millert   134:        executemacro,           /* e */
1.4       millert   135: #else /* !NO_MACRO */
1.3       millert   136:        rescan,                 /* e */
1.4       millert   137: #endif /* !NO_MACRO */
1.3       millert   138:        setfillcol,             /* f */
1.26      deraadt   139:        gotoline,               /* g */
1.3       millert   140:        rescan,                 /* h */
                    141:        fileinsert,             /* i */
                    142:        rescan,                 /* j */
1.27      jfb       143:        killbuffer_cmd,         /* k */
1.3       millert   144:        rescan,                 /* l */
                    145:        rescan,                 /* m */
1.15      deraadt   146:        nextwind,               /* n */
1.3       millert   147:        nextwind,               /* o */
1.15      deraadt   148:        prevwind,               /* p */
1.3       millert   149:        rescan,                 /* q */
                    150:        rescan,                 /* r */
                    151:        savebuffers,            /* s */
1.25      deraadt   152:        rescan,                 /* t */
1.24      deraadt   153:        undo                    /* u */
1.1       deraadt   154: };
1.4       millert   155:
1.1       deraadt   156: #ifndef NO_MACRO
1.33      kjell     157: struct KEYMAPE (6 + IMAPEXT) cXmap = {
1.1       deraadt   158:        6,
1.3       millert   159:        6 + IMAPEXT,
1.4       millert   160: #else /* !NO_MACRO */
1.3       millert   161: static struct KEYMAPE (5 + IMAPEXT) cXmap = {
1.1       deraadt   162:        5,
1.3       millert   163:        5 + IMAPEXT,
1.4       millert   164: #endif /* !NO_MACRO */
1.1       deraadt   165:        rescan,
                    166:        {
1.3       millert   167:                {
1.10      art       168:                        CCHR('B'), CCHR('G'), cXcB, NULL
1.3       millert   169:                },
                    170:                {
1.10      art       171:                        CCHR('L'), CCHR('X'), cXcL, NULL
1.3       millert   172:                },
1.1       deraadt   173: #ifndef NO_MACRO
1.3       millert   174:                {
1.10      art       175:                        '(', ')', cXlp, NULL
1.3       millert   176:                },
1.4       millert   177: #endif /* !NO_MACRO */
1.3       millert   178:                {
                    179:                        '0', '4', cX0, (KEYMAP *) & cX4map
                    180:                },
                    181:                {
1.10      art       182:                        '=', '=', cXeq, NULL
1.3       millert   183:                },
                    184:                {
1.24      deraadt   185:                        '^', 'u', cXcar, NULL
1.28      db        186:                }
1.1       deraadt   187:        }
                    188: };
                    189:
1.4       millert   190: static PF metacG[] = {
1.28      db        191:        ctrlg                   /* ^G */
1.1       deraadt   192: };
1.4       millert   193:
                    194: static PF metacV[] = {
1.28      db        195:        pagenext                /* ^V */
1.1       deraadt   196: };
1.4       millert   197:
                    198: static PF metasp[] = {
1.28      db        199:        justone                 /* space */
1.1       deraadt   200: };
1.4       millert   201:
                    202: static PF metapct[] = {
1.28      db        203:        queryrepl               /* % */
1.1       deraadt   204: };
1.4       millert   205:
                    206: static PF metami[] = {
1.46    ! lum       207:        poptag,                 /* * */
        !           208:        rescan,                 /* + */
        !           209:        rescan,                 /* , */
1.1       deraadt   210:        negative_argument,      /* - */
1.46    ! lum       211:        findtag,                /* . */
1.3       millert   212:        rescan,                 /* / */
                    213:        digit_argument,         /* 0 */
                    214:        digit_argument,         /* 1 */
                    215:        digit_argument,         /* 2 */
                    216:        digit_argument,         /* 3 */
                    217:        digit_argument,         /* 4 */
                    218:        digit_argument,         /* 5 */
                    219:        digit_argument,         /* 6 */
                    220:        digit_argument,         /* 7 */
                    221:        digit_argument,         /* 8 */
                    222:        digit_argument,         /* 9 */
                    223:        rescan,                 /* : */
                    224:        rescan,                 /* ; */
                    225:        gotobob,                /* < */
                    226:        rescan,                 /* = */
1.28      db        227:        gotoeob                 /* > */
1.3       millert   228: };
1.4       millert   229:
1.42      kjell     230: static PF metasqf[] = {
                    231:        NULL,                   /* [ */
1.3       millert   232:        delwhite,               /* \ */
1.39      kjell     233:        rescan,                 /* ] */
1.45      kjell     234:        joinline,               /* ^ */
1.3       millert   235:        rescan,                 /* _ */
                    236:        rescan,                 /* ` */
                    237:        rescan,                 /* a */
                    238:        backword,               /* b */
                    239:        capword,                /* c */
                    240:        delfword,               /* d */
                    241:        rescan,                 /* e */
1.28      db        242:        forwword                /* f */
1.3       millert   243: };
1.4       millert   244:
                    245: static PF metal[] = {
1.3       millert   246:        lowerword,              /* l */
1.44      kjell     247:        backtoindent,           /* m */
1.3       millert   248:        rescan,                 /* n */
                    249:        rescan,                 /* o */
                    250:        rescan,                 /* p */
                    251:        fillpara,               /* q */
                    252:        backsearch,             /* r */
                    253:        forwsearch,             /* s */
                    254:        rescan,                 /* t */
                    255:        upperword,              /* u */
                    256:        backpage,               /* v */
                    257:        copyregion,             /* w */
1.39      kjell     258:        extend,                 /* x */
                    259:        rescan,                 /* y */
                    260:        rescan,                 /* z */
                    261:        gotobop,                /* { */
                    262:        rescan,                 /* | */
                    263:        gotoeop                 /* } */
1.3       millert   264: };
1.4       millert   265:
1.42      kjell     266: static PF metasqlZ[] = {
                    267:        rescan                  /* Z */
                    268: };
                    269:
1.4       millert   270: static PF metatilde[] = {
1.3       millert   271:        notmodified,            /* ~ */
1.28      db        272:        delbword                /* DEL */
1.1       deraadt   273: };
1.4       millert   274:
1.42      kjell     275: struct KEYMAPE (1 + IMAPEXT) metasqlmap = {
                    276:        1,
                    277:        1 + IMAPEXT,
                    278:        rescan,
                    279:        {
                    280:                {
                    281:                        'Z', 'Z', metasqlZ, NULL
                    282:                }
                    283:        }
                    284: };
                    285:
1.33      kjell     286: struct KEYMAPE (8 + IMAPEXT) metamap = {
1.1       deraadt   287:        8,
1.3       millert   288:        8 + IMAPEXT,
1.1       deraadt   289:        rescan,
                    290:        {
1.3       millert   291:                {
1.10      art       292:                        CCHR('G'), CCHR('G'), metacG, NULL
1.3       millert   293:                },
                    294:                {
1.10      art       295:                        CCHR('V'), CCHR('V'), metacV, NULL
1.3       millert   296:                },
                    297:                {
1.10      art       298:                        ' ', ' ', metasp, NULL
1.3       millert   299:                },
                    300:                {
1.10      art       301:                        '%', '%', metapct, NULL
1.3       millert   302:                },
                    303:                {
1.46    ! lum       304:                        '*', '>', metami, NULL
1.3       millert   305:                },
                    306:                {
1.42      kjell     307:                        '[', 'f', metasqf, (KEYMAP *) &metasqlmap
1.3       millert   308:                },
                    309:                {
1.39      kjell     310:                        'l', '}', metal, NULL
1.3       millert   311:                },
                    312:                {
1.10      art       313:                        '~', CCHR('?'), metatilde, NULL
1.28      db        314:                }
1.1       deraadt   315:        }
                    316: };
                    317:
1.4       millert   318: static PF fund_at[] = {
1.3       millert   319:        setmark,                /* ^@ */
                    320:        gotobol,                /* ^A */
                    321:        backchar,               /* ^B */
1.43      kjell     322:        NULL,                   /* ^C */
1.3       millert   323:        forwdel,                /* ^D */
                    324:        gotoeol,                /* ^E */
                    325:        forwchar,               /* ^F */
                    326:        ctrlg,                  /* ^G */
1.43      kjell     327: };
                    328:
                    329: static PF fund_h[] = {
1.1       deraadt   330: #ifndef NO_HELP
1.6       art       331:        NULL,                   /* ^H */
1.4       millert   332: #else /* !NO_HELP */
1.3       millert   333:        rescan,                 /* ^H */
1.4       millert   334: #endif /* !NO_HELP */
1.1       deraadt   335: };
1.4       millert   336:
1.43      kjell     337:
1.1       deraadt   338: /* ^I is selfinsert */
1.4       millert   339: static PF fund_CJ[] = {
1.40      kjell     340:        lfindent,               /* ^J */
1.3       millert   341:        killline,               /* ^K */
                    342:        reposition,             /* ^L */
                    343:        newline,                /* ^M */
                    344:        forwline,               /* ^N */
                    345:        openline,               /* ^O */
                    346:        backline,               /* ^P */
                    347:        quote,                  /* ^Q */
                    348:        backisearch,            /* ^R */
                    349:        forwisearch,            /* ^S */
                    350:        twiddle,                /* ^T */
1.1       deraadt   351:        universal_argument,     /* ^U */
1.3       millert   352:        forwpage,               /* ^V */
                    353:        killregion,             /* ^W */
1.6       art       354:        NULL,                   /* ^X */
1.3       millert   355:        yank,                   /* ^Y */
1.28      db        356:        spawncli                /* ^Z */
1.1       deraadt   357: };
1.4       millert   358:
                    359: static PF fund_esc[] = {
1.6       art       360:        NULL,                   /* esc */
1.4       millert   361:        rescan,                 /* ^\ selfinsert is default on fundamental */
1.3       millert   362:        rescan,                 /* ^] */
                    363:        rescan,                 /* ^^ */
1.28      db        364:        undo                    /* ^_ */
1.1       deraadt   365: };
1.4       millert   366:
                    367: static PF fund_del[] = {
1.28      db        368:        backdel                 /* DEL */
1.1       deraadt   369: };
                    370:
1.42      kjell     371: static PF fund_cb[] = {
                    372:        showmatch               /* )  */
                    373: };
                    374:
1.1       deraadt   375: #ifndef        FUND_XMAPS
                    376: #define NFUND_XMAPS    0       /* extra map sections after normal ones */
                    377: #endif
                    378:
1.43      kjell     379: static struct KEYMAPE (6 + NFUND_XMAPS + IMAPEXT) fundmap = {
                    380:        6 + NFUND_XMAPS,
                    381:        6 + NFUND_XMAPS + IMAPEXT,
1.1       deraadt   382:        selfinsert,
                    383:        {
1.43      kjell     384:                {
                    385:                        CCHR('@'), CCHR('G'), fund_at, (KEYMAP *) & ccmap
                    386:                },
1.1       deraadt   387: #ifndef NO_HELP
1.3       millert   388:                {
1.43      kjell     389:                        CCHR('H'), CCHR('H'), fund_h, (KEYMAP *) & helpmap
1.3       millert   390:                },
1.4       millert   391: #else /* !NO_HELP */
1.3       millert   392:                {
1.43      kjell     393:                        CCHR('@'), CCHR('H'), fund_h, NULL
1.3       millert   394:                },
1.4       millert   395: #endif /* !NO_HELP */
1.3       millert   396:                {
                    397:                        CCHR('J'), CCHR('Z'), fund_CJ, (KEYMAP *) & cXmap
                    398:                },
                    399:                {
                    400:                        CCHR('['), CCHR('_'), fund_esc, (KEYMAP *) & metamap
                    401:                },
                    402:                {
1.42      kjell     403:                        ')', ')', fund_cb, NULL
                    404:                },
                    405:                {
1.10      art       406:                        CCHR('?'), CCHR('?'), fund_del, NULL
1.3       millert   407:                },
1.4       millert   408: #ifdef FUND_XMAPS
1.1       deraadt   409:                FUND_XMAPS,
1.4       millert   410: #endif /* FUND_XMAPS */
1.1       deraadt   411:        }
                    412: };
                    413:
1.4       millert   414: static PF fill_sp[] = {
1.28      db        415:        fillword                /* ' ' */
1.1       deraadt   416: };
1.4       millert   417:
1.3       millert   418: static struct KEYMAPE (1 + IMAPEXT) fillmap = {
1.1       deraadt   419:        1,
1.3       millert   420:        1 + IMAPEXT,
1.1       deraadt   421:        rescan,
                    422:        {
1.41      kjell     423:                { ' ', ' ', fill_sp, NULL }
1.1       deraadt   424:        }
                    425: };
                    426:
1.4       millert   427: static PF indent_lf[] = {
1.3       millert   428:        newline,                /* ^J */
                    429:        rescan,                 /* ^K */
                    430:        rescan,                 /* ^L */
1.40      kjell     431:        lfindent                /* ^M */
1.1       deraadt   432: };
1.4       millert   433:
1.3       millert   434: static struct KEYMAPE (1 + IMAPEXT) indntmap = {
1.1       deraadt   435:        1,
1.3       millert   436:        1 + IMAPEXT,
1.1       deraadt   437:        rescan,
                    438:        {
1.3       millert   439:                {
1.10      art       440:                        CCHR('J'), CCHR('M'), indent_lf, NULL
1.28      db        441:                }
1.1       deraadt   442:        }
                    443: };
1.4       millert   444:
                    445: #ifdef NOTAB
                    446: static PF notab_tab[] = {
1.28      db        447:        space_to_tabstop        /* ^I */
1.1       deraadt   448: };
1.4       millert   449:
1.3       millert   450: static struct KEYMAPE (1 + IMAPEXT) notabmap = {
1.1       deraadt   451:        1,
1.3       millert   452:        1 + IMAPEXT,
1.1       deraadt   453:        rescan,
                    454:        {
1.3       millert   455:                {
1.10      art       456:                        CCHR('I'), CCHR('I'), notab_tab, NULL
1.28      db        457:                }
1.1       deraadt   458:        }
                    459: };
1.4       millert   460: #endif /* NOTAB */
1.1       deraadt   461:
1.3       millert   462: static struct KEYMAPE (1 + IMAPEXT) overwmap = {
1.1       deraadt   463:        0,
1.3       millert   464:        1 + IMAPEXT,            /* 1 to avoid 0 sized array */
1.1       deraadt   465:        rescan,
                    466:        {
                    467:                /* unused dummy entry for VMS C */
1.3       millert   468:                {
1.10      art       469:                        (KCHAR)0, (KCHAR)0, NULL, NULL
1.28      db        470:                }
1.1       deraadt   471:        }
                    472: };
                    473:
                    474:
1.33      kjell     475: /*
                    476:  * The basic (root) keyboard map
1.35      deraadt   477:  */
1.37      deraadt   478: struct maps_s  fundamental_mode = { (KEYMAP *)&fundmap, "fundamental" };
1.13      art       479:
1.3       millert   480: /*
                    481:  * give names to the maps, for use by help etc. If the map is to be bindable,
                    482:  * it must also be listed in the function name table below with the same
1.28      db        483:  * name. Maps created dynamically currently don't get added here, thus are
1.3       millert   484:  * unnamed. Modes are just named keymaps with functions to add/subtract them
                    485:  * from a buffer's list of modes.  If you change a mode name, change it in
1.1       deraadt   486:  * modes.c also.
                    487:  */
                    488:
1.37      deraadt   489: static struct maps_s map_table[] = {
1.13      art       490:        {(KEYMAP *) &fillmap, "fill",},
                    491:        {(KEYMAP *) &indntmap, "indent",},
1.4       millert   492: #ifdef NOTAB
1.13      art       493:        {(KEYMAP *) &notabmap, "notab",},
1.4       millert   494: #endif /* NOTAB */
1.13      art       495:        {(KEYMAP *) &overwmap, "overwrite",},
                    496:        {(KEYMAP *) &metamap, "esc prefix",},
                    497:        {(KEYMAP *) &cXmap, "c-x prefix",},
                    498:        {(KEYMAP *) &cX4map, "c-x 4 prefix",},
1.1       deraadt   499: #ifndef NO_HELP
1.13      art       500:        {(KEYMAP *) &helpmap, "help",},
1.1       deraadt   501: #endif
1.28      db        502:        {NULL, NULL}
1.1       deraadt   503: };
                    504:
1.37      deraadt   505: struct maps_s *maps;
1.13      art       506:
                    507: void
                    508: maps_init(void)
                    509: {
1.28      db        510:        int      i;
1.37      deraadt   511:        struct maps_s   *mp;
1.13      art       512:
                    513:        maps = &fundamental_mode;
                    514:        for (i = 0; map_table[i].p_name != NULL; i++) {
                    515:                mp = &map_table[i];
                    516:                mp->p_next = maps;
                    517:                maps = mp;
                    518:        }
                    519: }
1.9       art       520:
1.33      kjell     521: /*
                    522:  * Insert a new (named) keymap at the head of the keymap list.
                    523:  */
1.13      art       524: int
1.19      vincent   525: maps_add(KEYMAP *map, const char *name)
1.13      art       526: {
1.37      deraadt   527:        struct maps_s   *mp;
1.13      art       528:
                    529:        if ((mp = malloc(sizeof(*mp))) == NULL)
1.28      db        530:                return (FALSE);
1.13      art       531:
                    532:        mp->p_name = name;
                    533:        mp->p_map = map;
                    534:        mp->p_next = maps;
                    535:        maps = mp;
                    536:
1.28      db        537:        return (TRUE);
1.1       deraadt   538: }
                    539:
1.37      deraadt   540: struct maps_s *
1.19      vincent   541: name_mode(const char *name)
1.1       deraadt   542: {
1.37      deraadt   543:        struct maps_s   *mp;
1.1       deraadt   544:
1.13      art       545:        for (mp = maps; mp != NULL; mp = mp->p_next)
1.3       millert   546:                if (strcmp(mp->p_name, name) == 0)
1.28      db        547:                        return (mp);
                    548:        return (NULL);
1.1       deraadt   549: }
                    550:
1.4       millert   551: KEYMAP *
1.19      vincent   552: name_map(const char *name)
1.1       deraadt   553: {
1.37      deraadt   554:        struct maps_s   *mp;
                    555:
1.28      db        556:        return ((mp = name_mode(name)) == NULL ? NULL : mp->p_map);
1.1       deraadt   557: }