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

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:
                    162: initViBindings (cft, aft)
                    163: FUNC cft[], aft[];
                    164: {
                    165:     register int i;
                    166:     BINDENT *ftp;
                    167:
                    168:     for (i = 0; i < 256; i++)
                    169:        aft[i] = fep_abort;
                    170:     for (i = 0; i < 256; i++)
                    171:        cft[i] = self_insert;
                    172:
                    173: #define import(table,key,fn) if((int)key>0)table[(int)key]=fn
                    174: #ifdef TERMIOS
                    175:     /* Now, using cbreak mode
                    176:     import (cft, initial_ttymode.c_cc[VSTART], ignore);
                    177:     import (cft, initial_ttymode.c_cc[VSTOP], ignore);
                    178:     */
                    179: #if 0
                    180:     import (cft, initial_ttymode.c_cc[VINTR], insert_and_flush);
                    181:     import (aft, initial_ttymode.c_cc[VINTR], insert_and_flush);
                    182: #else
                    183:        /* added by noro */
                    184:     import (cft, initial_ttymode.c_cc[VINTR], send_int_sig);
                    185:        /* XXX : this may not be necessary */
                    186:     import (aft, initial_ttymode.c_cc[VINTR], send_int_sig);
                    187: #endif
                    188:     import (cft, initial_ttymode.c_cc[VQUIT], insert_and_flush);
                    189:     import (cft, initial_ttymode.c_cc[VEOF], send_eof);
                    190: #ifdef VSWTC
                    191:     import (cft, initial_ttymode.c_cc[VSWTC], insert_and_flush);
                    192: #endif
                    193:     import (cft, initial_ttymode.c_cc[VSUSP], insert_and_flush);
                    194: #ifdef VDSUSP
                    195:     import (cft, initial_ttymode.c_cc[VDSUSP], self_insert);
                    196: #endif
                    197:     import (cft, initial_ttymode.c_cc[VREPRINT], reprint);
1.2     ! ohara     198: #ifdef VDISCARD
1.1       noro      199:     import (cft, initial_ttymode.c_cc[VDISCARD], self_insert);
1.2     ! ohara     200: #endif
1.1       noro      201:     import (cft, initial_ttymode.c_cc[VWERASE], delete_previous_word);
                    202:     import (cft, initial_ttymode.c_cc[VLNEXT], literal_next);
                    203:     import (cft, initial_ttymode.c_cc[VERASE], delete_previous_character);
                    204:     import (cft, initial_ttymode.c_cc[VKILL], delete_line);
                    205: #else
                    206:     /* Now, using cbreak mode
                    207:     import (cft, tchars_buf.t_startx, ignore);
                    208:     import (cft, tchars_buf.t_stopc, ignore);
                    209:     */
                    210: #if 0
                    211:     import (cft, tchars_buf.t_intrc, insert_and_flush);
                    212:     import (aft, tchars_buf.t_intrc, insert_and_flush);
                    213: #else
                    214:     import (cft, tchars_buf.t_intrc, send_int_sig);
                    215:     import (aft, tchars_buf.t_intrc, send_int_sig);
                    216: #endif
                    217:     import (cft, tchars_buf.t_quitc, insert_and_flush);
                    218:     import (cft, tchars_buf.t_eofc, send_eof);
                    219:     import (cft, tchars_buf.t_brkc, insert_and_flush);
                    220:     import (cft, ltchars_buf.t_suspc, insert_and_flush);
                    221:     import (cft, ltchars_buf.t_dsuspc, self_insert);
                    222:     import (cft, ltchars_buf.t_rprntc, reprint);
                    223:     import (cft, ltchars_buf.t_flushc, self_insert);
                    224:     import (cft, ltchars_buf.t_werasc, delete_previous_word);
                    225:     import (cft, ltchars_buf.t_lnextc, literal_next);
                    226:     import (cft, initial_ttymode.sg_erase, delete_previous_character);
                    227:     import (cft, initial_ttymode.sg_kill, delete_line);
                    228: #endif
                    229:
                    230: #undef import
                    231:
                    232:     for (ftp = viComBindings; ftp->bt_s; ftp++)
                    233:        bind_key (aft, ftp->bt_func, ftp->bt_s, fep_abort);
                    234:     for (ftp = viInsertBindings; ftp->bt_s; ftp++)
                    235:        bind_key (cft, ftp->bt_func, ftp->bt_s, fep_abort);
                    236:
                    237:     viInsTable = cft;
                    238:     viComTable = aft;
                    239:     vi_mode = INSERTMODE;
                    240: }
                    241:
                    242: vi_edit (c)
                    243:     int c;
                    244: {
                    245:     int count = vi_count ? vi_count : 1;
                    246:
                    247:     switch (c) {
                    248:        case '~':
                    249:            {
                    250:                char c = CommandLine [CurrentPosition];
                    251:
                    252:                if (isalpha (c)) {
                    253:                    (void) delete_next_character (c);
                    254:                    c ^= 0040;
                    255:                    (void) self_insert (c);
                    256:                }
                    257:                else
                    258:                    (void) forward_character (c);
                    259:            }
                    260:            break;
                    261:
                    262:        case 'a':
                    263:            if (!is_eol())
                    264:                (void) forward_character (c);
                    265:        case 'i':
                    266:            (void) altenateEditmode (c);
                    267:            break;
                    268:
                    269:        case 'A':
                    270:            (void) end_of_line (c);
                    271:            (void) altenateEditmode ();
                    272:            break;
                    273:
                    274:        case 'I':
                    275:            (void) beginning_of_line (c);
                    276:            (void) altenateEditmode ();
                    277:            break;
                    278:
                    279:        case 'C':
                    280:            (void) kill_to_end_of_line (c);
                    281:            (void) altenateEditmode (c);
                    282:            break;
                    283:
                    284:        case 'D':
                    285:            (void) kill_to_end_of_line (c);
                    286:            break;
                    287:
                    288:        case 'S':
                    289:            (void) delete_line (c);
                    290:            (void) altenateEditmode ();
                    291:            break;
                    292:
                    293:        case 'r':
                    294:            (void) delete_next_character (c);
                    295:            (void) self_insert (getcharacter ());
                    296:            break;
                    297:
                    298:        case 's':
                    299:            (void) delete_next_n_character (count);
                    300:            (void) altenateEditmode ();
                    301:            break;
                    302:
                    303:        case 'x':
                    304:            (void) delete_next_n_character (count);
                    305:            break;
                    306:
                    307:        case 'X':
                    308:            (void) delete_previous_n_character (count);
                    309:            break;
                    310:
                    311:        case 'p':
                    312:            (void) forward_character ();
                    313:        case 'P':
                    314:            (void) yank_from_kill_buffer ();
                    315:            (void) backward_character ();
                    316:            break;
                    317:
                    318:        case ctrl('U'):
                    319:            (void) delete_line (c);
                    320:            (void) altenateEditmode ();
                    321:            break;
                    322:     }
                    323:     vi_count = 0;
                    324:     return (0);
                    325: }
                    326:
                    327: altenateEditmode ()
                    328: {
                    329:     FUNC *tmp;
                    330:
                    331:     tmp = curFuncTab;
                    332:     curFuncTab = altFuncTab;
                    333:     altFuncTab = tmp;
                    334:     vi_mode = (vi_mode == INSERTMODE) ? COMMANDMODE : INSERTMODE;
                    335:
                    336:     return (0);
                    337: }
                    338:
                    339: vi_num (c)
                    340:     int c;
                    341: {
                    342:     vi_count = vi_count * 10 + ((int)c - (int)'0');
                    343:     return (0);
                    344: }
                    345:
                    346: vi_motion (c)
                    347:     int c;
                    348: {
                    349:     int count = vi_count ? vi_count : 1;
                    350:
                    351:     switch (c) {
                    352:
                    353:        case 'w':
                    354:            (void) forward_n_word (count);
                    355:            break;
                    356:
                    357:        case 'W':
                    358:            (void) forward_n_Word (count);
                    359:            break;
                    360:
                    361:        case 'e':
                    362:            (void) forward_to_end_of_n_word (count);
                    363:            break;
                    364:
                    365:        case 'E':
                    366:            (void) forward_to_end_of_n_Word (count);
                    367:            break;
                    368:
                    369:        case 'b':
                    370:            (void) backward_n_word (count);
                    371:            break;
                    372:
                    373:        case 'B':
                    374:            (void) backward_n_Word (count);
                    375:            break;
                    376:
                    377:        case 'l':
                    378:        case ' ':
                    379:            (void) forward_n_character (count);
                    380:            break;
                    381:
                    382:        case 'h':
                    383:        case '\b':
                    384:            (void) backward_n_character (count);
                    385:            break;
                    386:
                    387:        case 'k':
                    388:        case '-':
                    389:            (void) previous_history (c);
                    390:            break;
                    391:
                    392:        case 'j':
                    393:        case '+':
                    394:            (void) next_history (c);
                    395:            break;
                    396:
                    397:        case 'n':
                    398:            (void) search_reverse (c);
                    399:            break;
                    400:
                    401:        case 'N':
                    402:            (void) search_forward (c);
                    403:            break;
                    404:
                    405:        case '0':
                    406:            if (vi_count)
                    407:                return (vi_num (c));
                    408:            /* falling down */
                    409:
                    410:        case '^':
                    411:            (void) beginning_of_line (c);
                    412:            break;
                    413:
                    414:        case '$':
                    415:            (void) end_of_line (c);
                    416:            break;
                    417:
                    418:        case '|':
                    419:            (void) moveto (count - 1);
                    420:            /***
                    421:            if (strlen (CommandLine) >= count) {
                    422:                (void) beginning_of_line (c);
                    423:                (void) forward_n_character (count - 1);
                    424:            }
                    425:            else
                    426:                (void) end_of_line (c);
                    427:            ***/
                    428:            break;
                    429:
                    430:        default:
                    431:            (void) fep_abort (c);
                    432:            break;
                    433:     }
                    434:     vi_count = 0;
                    435:     return (0);
                    436: }
                    437:
                    438: vi_c (c)
                    439:     int c;
                    440: {
                    441:     int count = vi_count ? vi_count : 1;
                    442:
                    443:     switch (c) {
                    444:        case '0':
                    445:        case '^':
                    446:            (void) kill_to_top_of_line (c);
                    447:            break;
                    448:
                    449:        case 'c':
                    450:            delete_line(c);
                    451:            break;
                    452:
                    453:        case 'w':
                    454:            (void) delete_next_n_word (count);
                    455:            break;
                    456:
                    457:        case 'W':
                    458:            (void) delete_next_n_Word (count);
                    459:            break;
                    460:
                    461:        case 'b':
                    462:            (void) delete_previous_n_word (count);
                    463:            break;
                    464:
                    465:        case 'B':
                    466:            (void) delete_previous_n_Word (count);
                    467:            break;
                    468:
                    469:        case '$':
                    470:            (void) kill_to_end_of_line(c);
                    471:            break;
                    472:
                    473:        default:
                    474:            return (fep_abort (c));
                    475:     }
                    476:     vi_count = 0;
                    477:     altenateEditmode ();
                    478:     return (0);
                    479: }
                    480:
                    481: vi_d (c)
                    482:     int c;
                    483: {
                    484:     int count = vi_count ? vi_count : 1;
                    485:
                    486:     switch (c) {
                    487:        case '0':
                    488:        case '^':
                    489:            (void) kill_to_top_of_line (c);
                    490:            break;
                    491:
                    492:        case 'd':
                    493:            delete_line(c);
                    494:            break;
                    495:
                    496:        case 'w':
                    497:            (void) delete_next_n_word (count);
                    498:            break;
                    499:
                    500:        case 'W':
                    501:            (void) delete_next_n_Word (count);
                    502:            break;
                    503:
                    504:        case 'b':
                    505:            (void) delete_previous_n_word (count);
                    506:            break;
                    507:
                    508:        case 'B':
                    509:            (void) delete_previous_n_Word (count);
                    510:            break;
                    511:
                    512:        case '$':
                    513:            (void) kill_to_end_of_line(c);
                    514:            break;
                    515:
                    516:        default:
                    517:            return (fep_abort (c));
                    518:     }
                    519:     vi_count = 0;
                    520:     return (0);
                    521: }
                    522:
                    523: vi_new_line (c)
                    524:     int c;
                    525: {
                    526:     int count = vi_count ? vi_count : 1;
                    527:
                    528:     vi_count = 0;
                    529:
                    530:     (void) new_line (c);
                    531:     if (vi_mode == COMMANDMODE)
                    532:        altenateEditmode ();
                    533:
                    534:     return (1);
                    535: }
                    536:
                    537: vi_ins_edit (c)
                    538:     int c;
                    539: {
                    540:     switch (c) {
                    541:
                    542:        case ctrl('H'):
                    543:            (void) delete_previous_character (c);
                    544:            break;
                    545:
                    546:        case ctrl('W'):
                    547:            (void) delete_previous_word (c);
                    548:            break;
                    549:
                    550:        case ctrl('U'):
                    551:            (void) delete_line (c);
                    552:            break;
                    553:
                    554:        case ctrl('V'):
                    555:            (void) literal_next (c);
                    556:            break;
                    557:
                    558:        case '\033':
                    559:            (void) altenateEditmode ();
                    560:            (void) backward_character ();
                    561:            break;
                    562:     }
                    563:     return (0);
                    564: }

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