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

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