[BACK]Return to fep_vi.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / fep

Annotation of OpenXM_contrib2/fep/fep_vi.c, Revision 1.3

1.1       noro        1: /*     Copyright (c) 1987, 1988 by Software Research Associates, Inc.  */
                      2:
                      3: #ifndef lint
                      4: static char rcsid[]=
                      5: "$Header: fep_vi.c,v 4.7 91/05/29 14:31:10 utashiro Exp $ (SRA)";
                      6: #endif /* lint */
                      7:
                      8: #include <stdio.h>
                      9: #include <sys/ioctl.h>
                     10: #ifdef TERMIOS
                     11: #include <termios.h>
                     12: #if defined(__linux__) || defined(__CYGWIN__)
                     13: #ifndef _POSIX_VDISABLE
                     14: #define _POSIX_VDISABLE '\0'
                     15: #endif
                     16: #endif
                     17: #else
                     18: #include <sgtty.h>
                     19: #endif
                     20: #include <ctype.h>
                     21: #include "fep_defs.h"
                     22: #include "fep_glob.h"
                     23: #include "fep_funcs.h"
                     24:
                     25: enum {INSERTMODE, COMMANDMODE} vi_mode = COMMANDMODE;
                     26: int vi_count;
                     27:
                     28: extern char *CommandLine;
                     29: extern int CurrentPosition;
                     30:
                     31: /*
                     32:  * Default binding table
                     33:  */
                     34: BINDENT viComBindings[] = {
                     35:        /* 1       */   {"1",           vi_num},
                     36:        /* 2       */   {"2",           vi_num},
                     37:        /* 3       */   {"3",           vi_num},
                     38:        /* 4       */   {"4",           vi_num},
                     39:        /* 5       */   {"5",           vi_num},
                     40:        /* 6       */   {"6",           vi_num},
                     41:        /* 7       */   {"7",           vi_num},
                     42:        /* 8       */   {"8",           vi_num},
                     43:        /* 9       */   {"9",           vi_num},
                     44:
                     45:        /* ~       */   {"~",           vi_edit},
                     46:        /* A       */   {"A",           vi_edit},
                     47:        /* C       */   {"C",           vi_edit},
                     48:        /* D       */   {"D",           vi_edit},
                     49:        /* P       */   {"P",           vi_edit},
                     50:        /* S       */   {"S",           vi_edit},
                     51:        /* I       */   {"I",           vi_edit},
                     52:        /* a       */   {"a",           vi_edit},
                     53:        /* i       */   {"i",           vi_edit},
                     54:        /* p       */   {"p",           vi_edit},
                     55:        /* r       */   {"r",           vi_edit},
                     56:        /* s       */   {"s",           vi_edit},
                     57:        /* x       */   {"x",           vi_edit},
                     58:        /* X       */   {"X",           vi_edit},
                     59:        /* ^U      */   {"\\^U",        vi_edit},
                     60:
                     61:        /*         */   {" ",           vi_motion},
                     62:        /* ^H      */   {"\b",          vi_motion},
                     63:        /* l       */   {"l",           vi_motion},
                     64:        /* h       */   {"h",           vi_motion},
                     65:        /* k       */   {"k",           vi_motion},
                     66:        /* j       */   {"j",           vi_motion},
                     67:        /* b       */   {"b",           vi_motion},
                     68:        /* B       */   {"B",           vi_motion},
                     69:        /* e       */   {"e",           vi_motion},
                     70:        /* E       */   {"E",           vi_motion},
                     71:        /* w       */   {"w",           vi_motion},
                     72:        /* W       */   {"W",           vi_motion},
                     73:        /* n       */   {"n",           vi_motion},
                     74:        /* N       */   {"N",           vi_motion},
                     75:        /* 0       */   {"0",           vi_motion},
                     76:        /* ^       */   {"^",           vi_motion},
                     77:        /* $       */   {"$",           vi_motion},
                     78:        /* |       */   {"|",           vi_motion},
                     79:        /* -       */   {"-",           vi_motion},
                     80:        /* +       */   {"+",           vi_motion},
                     81:
                     82:        /* cb      */   {"cb",          vi_c},
                     83:        /* cB      */   {"cb",          vi_c},
                     84:        /* cw      */   {"cw",          vi_c},
                     85:        /* cW      */   {"cW",          vi_c},
                     86:        /* c0      */   {"c0",          vi_c},
                     87:        /* c^      */   {"c^",          vi_c},
                     88:        /* c$      */   {"c$",          vi_c},
                     89:        /* cc      */   {"cc",          vi_c},
                     90:
                     91:        /* db      */   {"db",          vi_d},
                     92:        /* dB      */   {"dB",          vi_d},
                     93:        /* dw      */   {"dw",          vi_d},
                     94:        /* dW      */   {"dW",          vi_d},
                     95:        /* d0      */   {"d0",          vi_d},
                     96:        /* d^      */   {"d^",          vi_d},
                     97:        /* d$      */   {"d$",          vi_d},
                     98:        /* dd      */   {"dd",          vi_d},
                     99:
                    100:        /* ^E      */   {"\\^E",        expand_file_name},
                    101:        /* ^J      */   {"\\^J",        vi_new_line},
                    102:        /* ^L      */   {"\\^L",        list_file_name},
                    103:        /* ^M      */   {"\\^M",        vi_new_line},
                    104:        /* ^P      */   {"\\^P",        previous_history},
                    105:        /* ^N      */   {"\\^N",        next_history},
                    106:        /* ^R      */   {"\\^R",        reprint},
                    107:        /* ^^      */   {"\\^^",        toggle_through},
                    108:        /* ^X-^B   */   {"\\^X\\^B",    show_bindings},
                    109:        /* ^X-B    */   {"\\^XB",       show_bindings},
                    110:        /* ^X-b    */   {"\\^Xb",       show_bindings},
                    111:        /* ^X-^H   */   {"\\^X\\^H",    show_history},
                    112:        /* ^X-h    */   {"\\^Xh",       show_history},
                    113:        /* ^X-H    */   {"\\^XH",       show_history},
                    114:        /* ^X-l    */   {"\\^Xl",       list_file_name},
                    115:        /* ^X-L    */   {"\\^XL",       list_file_name},
                    116:        /* ^X-^L   */   {"\\^X\\^L",    fep_repaint},
                    117:        /* ^X-^V   */   {"\\^X\\^V",    view_buffer},
                    118:        /* ^X-^X   */   {"\\^X\\^X",    expand_file_name},
                    119:        /* ^X-?    */   {"\\^X?",       show_bindings},
                    120:        /* ^X-^C   */   {"\\^X\\^C",    (FUNC)terminate},
                    121:        /* ^X-^D   */   {"\\^X\\^D",    send_eof},
                    122:        /* ^X-(    */   {"\\^X(",       fep_start_script},
                    123:        /* ^X-)    */   {"\\^X)",       fep_end_script},
                    124:        /*         */   {NULL,          NULL}
                    125: };
                    126:
                    127: BINDENT viInsertBindings[] = {
                    128:        /* ^H      */   {"\\^H",        vi_ins_edit},
                    129:        /* ^W      */   {"\\^W",        vi_ins_edit},
                    130:        /* ^U      */   {"\\^U",        vi_ins_edit},
                    131:        /* ^V      */   {"\\^V",        vi_ins_edit},
                    132:        /* ^J      */   {"\\^J",        vi_new_line},
                    133:        /* ^L      */   {"\\^L",        list_file_name},
                    134:        /* ^M      */   {"\\^M",        vi_new_line},
                    135:        /* ^P      */   {"\\^P",        previous_history},
                    136:        /* ^N      */   {"\\^N",        next_history},
                    137:        /* ESC     */   {"\\^[",        vi_ins_edit},
                    138:        /* ^E      */   {"\\^E",        expand_file_name},
                    139:        /* ^^      */   {"\\^^",        toggle_through},
                    140:        /* ^X-^B   */   {"\\^X\\^B",    show_bindings},
                    141:        /* ^X-B    */   {"\\^XB",       show_bindings},
                    142:        /* ^X-b    */   {"\\^Xb",       show_bindings},
                    143:        /* ^X-^H   */   {"\\^X\\^H",    show_history},
                    144:        /* ^X-h    */   {"\\^Xh",       show_history},
                    145:        /* ^X-H    */   {"\\^XH",       show_history},
                    146:        /* ^X-l    */   {"\\^Xl",       list_file_name},
                    147:        /* ^X-L    */   {"\\^XL",       list_file_name},
                    148:        /* ^X-^L   */   {"\\^X\\^L",    fep_repaint},
                    149:        /* ^X-^X   */   {"\\^X\\^X",    expand_file_name},
                    150:        /* ^X-?    */   {"\\^X?",       show_bindings},
                    151:        /* ^X-^C   */   {"\\^X\\^C",    (FUNC)terminate},
                    152:        /* ^X-^D   */   {"\\^X\\^D",    send_eof},
                    153:        /* ^X-^V   */   {"\\^X\\^V",    view_buffer},
                    154:        /* ^X-(    */   {"\\^X(",       fep_start_script},
                    155:        /* ^X-)    */   {"\\^X)",       fep_end_script},
                    156:        /*         */   {NULL,          NULL}
                    157: };
                    158:
                    159: FUNC *viComTable;
                    160: FUNC *viInsTable;
                    161:
1.3     ! noro      162: void initViBindings (FUNC cft[], FUNC aft[])
1.1       noro      163: {
                    164:     register int i;
                    165:     BINDENT *ftp;
                    166:
                    167:     for (i = 0; i < 256; i++)
                    168:        aft[i] = fep_abort;
                    169:     for (i = 0; i < 256; i++)
                    170:        cft[i] = self_insert;
                    171:
                    172: #define import(table,key,fn) if((int)key>0)table[(int)key]=fn
                    173: #ifdef TERMIOS
                    174:     /* Now, using cbreak mode
                    175:     import (cft, initial_ttymode.c_cc[VSTART], ignore);
                    176:     import (cft, initial_ttymode.c_cc[VSTOP], ignore);
                    177:     */
                    178: #if 0
                    179:     import (cft, initial_ttymode.c_cc[VINTR], insert_and_flush);
                    180:     import (aft, initial_ttymode.c_cc[VINTR], insert_and_flush);
                    181: #else
                    182:        /* added by noro */
                    183:     import (cft, initial_ttymode.c_cc[VINTR], send_int_sig);
                    184:        /* XXX : this may not be necessary */
                    185:     import (aft, initial_ttymode.c_cc[VINTR], send_int_sig);
                    186: #endif
                    187:     import (cft, initial_ttymode.c_cc[VQUIT], insert_and_flush);
                    188:     import (cft, initial_ttymode.c_cc[VEOF], send_eof);
                    189: #ifdef VSWTC
                    190:     import (cft, initial_ttymode.c_cc[VSWTC], insert_and_flush);
                    191: #endif
                    192:     import (cft, initial_ttymode.c_cc[VSUSP], insert_and_flush);
                    193: #ifdef VDSUSP
                    194:     import (cft, initial_ttymode.c_cc[VDSUSP], self_insert);
                    195: #endif
                    196:     import (cft, initial_ttymode.c_cc[VREPRINT], reprint);
1.2       ohara     197: #ifdef VDISCARD
1.1       noro      198:     import (cft, initial_ttymode.c_cc[VDISCARD], self_insert);
1.2       ohara     199: #endif
1.1       noro      200:     import (cft, initial_ttymode.c_cc[VWERASE], delete_previous_word);
                    201:     import (cft, initial_ttymode.c_cc[VLNEXT], literal_next);
                    202:     import (cft, initial_ttymode.c_cc[VERASE], delete_previous_character);
                    203:     import (cft, initial_ttymode.c_cc[VKILL], delete_line);
                    204: #else
                    205:     /* Now, using cbreak mode
                    206:     import (cft, tchars_buf.t_startx, ignore);
                    207:     import (cft, tchars_buf.t_stopc, ignore);
                    208:     */
                    209: #if 0
                    210:     import (cft, tchars_buf.t_intrc, insert_and_flush);
                    211:     import (aft, tchars_buf.t_intrc, insert_and_flush);
                    212: #else
                    213:     import (cft, tchars_buf.t_intrc, send_int_sig);
                    214:     import (aft, tchars_buf.t_intrc, send_int_sig);
                    215: #endif
                    216:     import (cft, tchars_buf.t_quitc, insert_and_flush);
                    217:     import (cft, tchars_buf.t_eofc, send_eof);
                    218:     import (cft, tchars_buf.t_brkc, insert_and_flush);
                    219:     import (cft, ltchars_buf.t_suspc, insert_and_flush);
                    220:     import (cft, ltchars_buf.t_dsuspc, self_insert);
                    221:     import (cft, ltchars_buf.t_rprntc, reprint);
                    222:     import (cft, ltchars_buf.t_flushc, self_insert);
                    223:     import (cft, ltchars_buf.t_werasc, delete_previous_word);
                    224:     import (cft, ltchars_buf.t_lnextc, literal_next);
                    225:     import (cft, initial_ttymode.sg_erase, delete_previous_character);
                    226:     import (cft, initial_ttymode.sg_kill, delete_line);
                    227: #endif
                    228:
                    229: #undef import
                    230:
                    231:     for (ftp = viComBindings; ftp->bt_s; ftp++)
                    232:        bind_key (aft, ftp->bt_func, ftp->bt_s, fep_abort);
                    233:     for (ftp = viInsertBindings; ftp->bt_s; ftp++)
                    234:        bind_key (cft, ftp->bt_func, ftp->bt_s, fep_abort);
                    235:
                    236:     viInsTable = cft;
                    237:     viComTable = aft;
                    238:     vi_mode = INSERTMODE;
                    239: }
                    240:
1.3     ! noro      241: int vi_edit (int c)
1.1       noro      242: {
                    243:     int count = vi_count ? vi_count : 1;
                    244:
                    245:     switch (c) {
                    246:        case '~':
                    247:            {
                    248:                char c = CommandLine [CurrentPosition];
                    249:
                    250:                if (isalpha (c)) {
                    251:                    (void) delete_next_character (c);
                    252:                    c ^= 0040;
                    253:                    (void) self_insert (c);
                    254:                }
                    255:                else
                    256:                    (void) forward_character (c);
                    257:            }
                    258:            break;
                    259:
                    260:        case 'a':
                    261:            if (!is_eol())
                    262:                (void) forward_character (c);
                    263:        case 'i':
                    264:            (void) altenateEditmode (c);
                    265:            break;
                    266:
                    267:        case 'A':
                    268:            (void) end_of_line (c);
                    269:            (void) altenateEditmode ();
                    270:            break;
                    271:
                    272:        case 'I':
                    273:            (void) beginning_of_line (c);
                    274:            (void) altenateEditmode ();
                    275:            break;
                    276:
                    277:        case 'C':
                    278:            (void) kill_to_end_of_line (c);
                    279:            (void) altenateEditmode (c);
                    280:            break;
                    281:
                    282:        case 'D':
                    283:            (void) kill_to_end_of_line (c);
                    284:            break;
                    285:
                    286:        case 'S':
                    287:            (void) delete_line (c);
                    288:            (void) altenateEditmode ();
                    289:            break;
                    290:
                    291:        case 'r':
                    292:            (void) delete_next_character (c);
                    293:            (void) self_insert (getcharacter ());
                    294:            break;
                    295:
                    296:        case 's':
                    297:            (void) delete_next_n_character (count);
                    298:            (void) altenateEditmode ();
                    299:            break;
                    300:
                    301:        case 'x':
                    302:            (void) delete_next_n_character (count);
                    303:            break;
                    304:
                    305:        case 'X':
                    306:            (void) delete_previous_n_character (count);
                    307:            break;
                    308:
                    309:        case 'p':
                    310:            (void) forward_character ();
                    311:        case 'P':
                    312:            (void) yank_from_kill_buffer ();
                    313:            (void) backward_character ();
                    314:            break;
                    315:
                    316:        case ctrl('U'):
                    317:            (void) delete_line (c);
                    318:            (void) altenateEditmode ();
                    319:            break;
                    320:     }
                    321:     vi_count = 0;
                    322:     return (0);
                    323: }
                    324:
1.3     ! noro      325: int altenateEditmode ()
1.1       noro      326: {
                    327:     FUNC *tmp;
                    328:
                    329:     tmp = curFuncTab;
                    330:     curFuncTab = altFuncTab;
                    331:     altFuncTab = tmp;
                    332:     vi_mode = (vi_mode == INSERTMODE) ? COMMANDMODE : INSERTMODE;
                    333:
                    334:     return (0);
                    335: }
                    336:
1.3     ! noro      337: int vi_num (int c)
1.1       noro      338: {
                    339:     vi_count = vi_count * 10 + ((int)c - (int)'0');
                    340:     return (0);
                    341: }
                    342:
1.3     ! noro      343: int vi_motion (int c)
1.1       noro      344: {
                    345:     int count = vi_count ? vi_count : 1;
                    346:
                    347:     switch (c) {
                    348:
                    349:        case 'w':
                    350:            (void) forward_n_word (count);
                    351:            break;
                    352:
                    353:        case 'W':
                    354:            (void) forward_n_Word (count);
                    355:            break;
                    356:
                    357:        case 'e':
                    358:            (void) forward_to_end_of_n_word (count);
                    359:            break;
                    360:
                    361:        case 'E':
                    362:            (void) forward_to_end_of_n_Word (count);
                    363:            break;
                    364:
                    365:        case 'b':
                    366:            (void) backward_n_word (count);
                    367:            break;
                    368:
                    369:        case 'B':
                    370:            (void) backward_n_Word (count);
                    371:            break;
                    372:
                    373:        case 'l':
                    374:        case ' ':
                    375:            (void) forward_n_character (count);
                    376:            break;
                    377:
                    378:        case 'h':
                    379:        case '\b':
                    380:            (void) backward_n_character (count);
                    381:            break;
                    382:
                    383:        case 'k':
                    384:        case '-':
                    385:            (void) previous_history (c);
                    386:            break;
                    387:
                    388:        case 'j':
                    389:        case '+':
                    390:            (void) next_history (c);
                    391:            break;
                    392:
                    393:        case 'n':
                    394:            (void) search_reverse (c);
                    395:            break;
                    396:
                    397:        case 'N':
                    398:            (void) search_forward (c);
                    399:            break;
                    400:
                    401:        case '0':
                    402:            if (vi_count)
                    403:                return (vi_num (c));
                    404:            /* falling down */
                    405:
                    406:        case '^':
                    407:            (void) beginning_of_line (c);
                    408:            break;
                    409:
                    410:        case '$':
                    411:            (void) end_of_line (c);
                    412:            break;
                    413:
                    414:        case '|':
                    415:            (void) moveto (count - 1);
                    416:            /***
                    417:            if (strlen (CommandLine) >= count) {
                    418:                (void) beginning_of_line (c);
                    419:                (void) forward_n_character (count - 1);
                    420:            }
                    421:            else
                    422:                (void) end_of_line (c);
                    423:            ***/
                    424:            break;
                    425:
                    426:        default:
                    427:            (void) fep_abort (c);
                    428:            break;
                    429:     }
                    430:     vi_count = 0;
                    431:     return (0);
                    432: }
                    433:
1.3     ! noro      434: int vi_c (int c)
1.1       noro      435: {
                    436:     int count = vi_count ? vi_count : 1;
                    437:
                    438:     switch (c) {
                    439:        case '0':
                    440:        case '^':
                    441:            (void) kill_to_top_of_line (c);
                    442:            break;
                    443:
                    444:        case 'c':
                    445:            delete_line(c);
                    446:            break;
                    447:
                    448:        case 'w':
                    449:            (void) delete_next_n_word (count);
                    450:            break;
                    451:
                    452:        case 'W':
                    453:            (void) delete_next_n_Word (count);
                    454:            break;
                    455:
                    456:        case 'b':
                    457:            (void) delete_previous_n_word (count);
                    458:            break;
                    459:
                    460:        case 'B':
                    461:            (void) delete_previous_n_Word (count);
                    462:            break;
                    463:
                    464:        case '$':
                    465:            (void) kill_to_end_of_line(c);
                    466:            break;
                    467:
                    468:        default:
                    469:            return (fep_abort (c));
                    470:     }
                    471:     vi_count = 0;
                    472:     altenateEditmode ();
                    473:     return (0);
                    474: }
                    475:
1.3     ! noro      476: int vi_d (int c)
1.1       noro      477: {
                    478:     int count = vi_count ? vi_count : 1;
                    479:
                    480:     switch (c) {
                    481:        case '0':
                    482:        case '^':
                    483:            (void) kill_to_top_of_line (c);
                    484:            break;
                    485:
                    486:        case 'd':
                    487:            delete_line(c);
                    488:            break;
                    489:
                    490:        case 'w':
                    491:            (void) delete_next_n_word (count);
                    492:            break;
                    493:
                    494:        case 'W':
                    495:            (void) delete_next_n_Word (count);
                    496:            break;
                    497:
                    498:        case 'b':
                    499:            (void) delete_previous_n_word (count);
                    500:            break;
                    501:
                    502:        case 'B':
                    503:            (void) delete_previous_n_Word (count);
                    504:            break;
                    505:
                    506:        case '$':
                    507:            (void) kill_to_end_of_line(c);
                    508:            break;
                    509:
                    510:        default:
                    511:            return (fep_abort (c));
                    512:     }
                    513:     vi_count = 0;
                    514:     return (0);
                    515: }
                    516:
1.3     ! noro      517: int vi_new_line (int c)
1.1       noro      518: {
                    519:     int count = vi_count ? vi_count : 1;
                    520:
                    521:     vi_count = 0;
                    522:
                    523:     (void) new_line (c);
                    524:     if (vi_mode == COMMANDMODE)
                    525:        altenateEditmode ();
                    526:
                    527:     return (1);
                    528: }
                    529:
1.3     ! noro      530: int vi_ins_edit (int c)
1.1       noro      531: {
                    532:     switch (c) {
                    533:
                    534:        case ctrl('H'):
                    535:            (void) delete_previous_character (c);
                    536:            break;
                    537:
                    538:        case ctrl('W'):
                    539:            (void) delete_previous_word (c);
                    540:            break;
                    541:
                    542:        case ctrl('U'):
                    543:            (void) delete_line (c);
                    544:            break;
                    545:
                    546:        case ctrl('V'):
                    547:            (void) literal_next (c);
                    548:            break;
                    549:
                    550:        case '\033':
                    551:            (void) altenateEditmode ();
                    552:            (void) backward_character ();
                    553:            break;
                    554:     }
                    555:     return (0);
                    556: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>