home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / most423.zip / keym.c < prev    next >
C/C++ Source or Header  |  1997-03-07  |  33KB  |  1,480 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. #include "externs.h"
  5. #include "keym.h"
  6. #include "sysdep.h"
  7. #include "display.h"
  8. #include "buffer.h"
  9. #include "window.h"
  10. #include "search.h"
  11. #include "file.h"
  12.  
  13. #ifdef __EMX__
  14. #include <sys/kbdscan.h>
  15. #endif
  16.  
  17. int *DIGIT_ARG;
  18. char LAST_CHAR;
  19. int EDT_DIRECTION = 1;
  20.  
  21. void prev_line_cmd()
  22. {
  23.     find_next_cmd();
  24. }
  25.  
  26.  
  27. void (*root_map[128])() =
  28.   {
  29. #ifdef __EMX__
  30.       zero_map_cmd,         /* ^@ */
  31. #else
  32.       beep,                 /* ^@ */
  33. #endif
  34.       beep,                 /* ^A */
  35.       beep,                 /* ^B */
  36.       beep,                 /* ^C */
  37.       page_down_cmd,            /* ^D */
  38.       beep, /* ^E */
  39.       search_cmd,               /* ^F */
  40.       beep, /* ^G */
  41.       help_cmd,                 /* ^H */
  42.       page_right_cmd,           /* ^I */
  43.       next_line_cmd,            /* ^J */
  44.       ctrl_k_map_cmd,           /* ^K */
  45.       beep, /* ^L */
  46.       next_line_cmd,            /* ^M */
  47.       next_line_cmd,            /* ^N */
  48.       beep, /* ^O */
  49.       previous_line_cmd,        /* ^P */
  50.       beep, /* ^Q */
  51.       redraw_cmd,               /* ^R */
  52.       beep, /* ^S */
  53.       time_cmd,                 /* ^T */
  54.       page_up_cmd,              /* ^U */
  55.       page_down_cmd,            /* ^V */
  56.       ctrl_w_map_cmd,           /* ^W */
  57.       ctrl_x_map_cmd,           /* ^X */
  58.       beep, /* ^Y */
  59.       sys_spawn_cmd,            /* ^Z */
  60.       esc_map_cmd,              /* ^[ */
  61.       beep, /* ^\ */
  62.       beep, /* ^] */
  63.       beep, /* ^^ */
  64.       beep, /* ^_ */
  65.       page_down_cmd,            /*   */
  66.       beep, /* ! */
  67.       beep, /* " */
  68.       beep, /* # */
  69.       sys_spawn_cmd,            /* $ */
  70.       goto_percent_cmd,         /* % */
  71.       beep, /* & */
  72.       beep, /* ' */
  73.       beep, /* ( */
  74.       beep, /* ) */
  75.       beep, /* * */
  76.       beep, /* + */
  77.       goto_mark_cmd,            /* , */
  78.       digit_arg_cmd,            /* - */
  79.       beep, /* . */
  80.       search_cmd,               /* / */
  81.       digit_arg_cmd,            /* 0 */
  82.       digit_arg_cmd,            /* 1 */
  83.       digit_arg_cmd,            /* 2 */
  84.       digit_arg_cmd,            /* 3 */
  85.       digit_arg_cmd,            /* 4 */
  86.       digit_arg_cmd,            /* 5 */
  87.       digit_arg_cmd,            /* 6 */
  88.       digit_arg_cmd,            /* 7 */
  89.       digit_arg_cmd,            /* 8 */
  90.       digit_arg_cmd,            /* 9 */
  91.       extended_key_cmd,         /* : */
  92.       beep, /* ; */
  93.       page_left_cmd,            /* < */
  94.       beep, /* = */
  95.       page_right_cmd,           /* > */
  96.       search_back_cmd,          /* ? */
  97.       beep, /* @ */
  98.       beep, /* A */
  99.       end_of_buffer_cmd,        /* B */
  100.       beep, /* C */
  101.       page_down_cmd,            /* D */
  102.       edit_cmd, /* E */
  103.       search_cmd,               /* F */
  104.       goto_line_cmd,            /* G */
  105.       help_cmd,                 /* H */
  106.       beep, /* I */
  107.       goto_line_cmd,            /* J */
  108.       beep, /* K */
  109.       toggle_lock,              /* L */
  110.       set_mark_cmd,             /* M */
  111.       find_next_cmd,            /* N */
  112.       other_window_cmd,         /* O */
  113.       beep, /* P */
  114.       exit_cmd,                 /* Q */
  115.       redraw_cmd,               /* R */
  116.       search_cmd,                      /* S */
  117.       top_of_buffer_cmd,        /* T */
  118.       page_up_cmd,              /* U */
  119.       next_line_cmd,            /* V */
  120.       toggle_width_cmd,         /* W */
  121.       exit_cmd, /* X */
  122.       beep, /* Y */
  123.       beep, /* Z */
  124.       beep, /* [ */
  125.       beep, /* \ */
  126.       beep, /* ] */
  127.       prev_line_cmd, /* ^ */
  128.       beep, /* _ */
  129.       beep, /* ` */
  130.       beep, /* a */
  131.       end_of_buffer_cmd,        /* b */
  132.       beep, /* c */
  133.       page_down_cmd,            /* d */
  134.       edit_cmd, /* e */
  135.       search_cmd,               /* f */
  136.       goto_line_cmd,            /* g */
  137.       help_cmd,                 /* h */
  138.       beep, /* i */
  139.       goto_line_cmd,            /* j */
  140.       beep, /* k */
  141.       toggle_lock,              /* l */
  142.       set_mark_cmd,             /* m */
  143.       find_next_cmd,            /* n */
  144.       other_window_cmd,         /* o */
  145.       beep, /* p */
  146.       exit_cmd,                 /* q */
  147.       redraw_cmd,               /* r */
  148.       search_cmd,                      /* s */
  149.       top_of_buffer_cmd,        /* t */
  150.       page_up_cmd,              /* u */
  151.       next_line_cmd,            /* v */
  152.       toggle_width_cmd,         /* w */
  153.       exit_cmd, /* x */
  154.       beep, /* y */
  155.       beep, /* z */
  156.       beep, /* { */
  157.       beep, /* | */
  158.       beep, /* } */
  159.       beep, /* ~ */
  160.       page_up_cmd               /* ^? */
  161.     };
  162.  
  163. /*  escape map  */
  164. void (*escape_map[128])() =
  165.   {
  166.       beep, /* ^@ */
  167.       beep, /* ^A */
  168.       beep, /* ^B */
  169.       beep, /* ^C */
  170.       beep, /* ^D */
  171.       beep, /* ^E */
  172.       beep, /* ^F */
  173.       beep, /* ^G */
  174.       beep, /* ^H */
  175.       beep, /* ^I */
  176.       beep, /* ^J */
  177.       beep, /* ^K */
  178.       beep, /* ^L */
  179.       beep, /* ^M */
  180.       beep, /* ^N */
  181.       beep, /* ^O */
  182.       beep, /* ^P */
  183.       beep, /* ^Q */
  184.       beep, /* ^R */
  185.       beep, /* ^S */
  186.       beep, /* ^T */
  187.       beep, /* ^U */
  188.       beep, /* ^V */
  189.       beep, /* ^W */
  190.       beep, /* ^X */
  191.       beep, /* ^Y */
  192.       beep, /* ^Z */
  193.       beep, /* ^[ */
  194.       beep, /* ^\ */
  195.       beep, /* ^] */
  196.       beep, /* ^^ */
  197.       beep, /* ^_ */
  198.       beep, /*   */
  199.       beep, /* ! */
  200.       beep, /* " */
  201.       beep, /* # */
  202.       sys_spawn_cmd,            /* $ */
  203.       beep, /* % */
  204.       beep, /* & */
  205.       beep, /* ' */
  206.       beep, /* ( */
  207.       beep, /* ) */
  208.       beep, /* * */
  209.       beep, /* + */
  210.       beep, /* , */
  211.       digit_arg_cmd,            /* - */
  212.       beep, /* . */
  213.       beep, /* / */
  214.       beep, /* 0 */
  215.       digit_arg_cmd,            /* 1 */
  216.       digit_arg_cmd,            /* 2 */
  217.       digit_arg_cmd,            /* 3 */
  218.       digit_arg_cmd,            /* 4 */
  219.       digit_arg_cmd,            /* 5 */
  220.       digit_arg_cmd,            /* 6 */
  221.       digit_arg_cmd,            /* 7 */
  222.       digit_arg_cmd,            /* 8 */
  223.       digit_arg_cmd,            /* 9 */
  224.       beep, /* : */
  225.       beep, /* ; */
  226.       top_of_buffer_cmd,        /* < */
  227.       beep, /* = */
  228.       end_of_buffer_cmd,        /* > */
  229.       beep, /* ? */
  230.       beep, /* @ */
  231.       beep, /* A */
  232.       beep, /* B */
  233.       beep, /* C */
  234.       beep, /* D */
  235.       beep, /* E */
  236.       beep, /* F */
  237.       beep, /* G */
  238.       beep, /* H */
  239.       beep, /* I */
  240.       beep, /* J */
  241.       beep, /* K */
  242.       beep, /* L */
  243.       beep, /* M */
  244.       beep, /* N */
  245.       O_map_cmd,                /* O */
  246.       beep, /* P */
  247.       beep, /* Q */
  248.       beep, /* R */
  249.       beep, /* S */
  250.       beep, /* T */
  251.       beep, /* U */
  252.       beep, /* V */
  253.       beep, /* W */
  254.       extended_cmd_cmd,         /* X */
  255.       beep, /* Y */
  256.       beep, /* Z */
  257.       O_map_cmd,                /* [ */
  258.       beep, /* \ */
  259.       beep, /* ] */
  260.       beep, /* ^ */
  261.       beep, /* _ */
  262.       beep, /* ` */
  263.       beep, /* a */
  264.       beep, /* b */
  265.       beep, /* c */
  266.       beep, /* d */
  267.       beep, /* e */
  268.       beep, /* f */
  269.       beep, /* g */
  270.       beep, /* h */
  271.       beep, /* i */
  272.       beep, /* j */
  273.       beep, /* k */
  274.       beep, /* l */
  275.       beep, /* m */
  276.       beep, /* n */
  277.       beep, /* o */
  278.       beep, /* p */
  279.       beep, /* q */
  280.       beep, /* r */
  281.       beep, /* s */
  282.       beep, /* t */
  283.       beep, /* u */
  284.       beep, /* v */
  285.       beep, /* w */
  286.       extended_cmd_cmd,         /* x */
  287.       beep, /* y */
  288.       beep, /* z */
  289.       beep, /* { */
  290.       beep, /* | */
  291.       beep, /* } */
  292.       beep, /* ~ */
  293.       beep  /* ^? */
  294.   };
  295.  
  296. void (*ctrl_x_map[128])() =
  297.   {
  298.       beep, /* ^@ */
  299.       beep, /* ^A */
  300.       beep, /* ^B */
  301.       exit_cmd, /* ^C */
  302.       beep, /* ^D */
  303.       beep, /* ^E */
  304.       find_file_cmd,            /* ^F */
  305.       beep, /* ^G */
  306.       beep, /* ^H */
  307.       beep, /* ^I */
  308.       beep, /* ^J */
  309.       beep, /* ^K */
  310.       beep, /* ^L */
  311.       beep, /* ^M */
  312.       beep, /* ^N */
  313.       beep, /* ^O */
  314.       beep, /* ^P */
  315.       beep, /* ^Q */
  316.       beep, /* ^R */
  317.       beep, /* ^S */
  318.       beep, /* ^T */
  319.       beep, /* ^U */
  320.       beep, /* ^V */
  321.       beep, /* ^W */
  322.       beep, /* ^X */
  323.       beep, /* ^Y */
  324.       beep, /* ^Z */
  325.       beep, /* ^[ */
  326.       beep, /* ^\ */
  327.       beep, /* ^] */
  328.       beep, /* ^^ */
  329.       beep, /* ^_ */
  330.       beep, /*   */
  331.       beep, /* ! */
  332.       beep, /* " */
  333.       beep, /* # */
  334.       beep, /* $ */
  335.       beep, /* % */
  336.       beep, /* & */
  337.       beep, /* ' */
  338.       beep, /* ( */
  339.       beep, /* ) */
  340.       beep, /* * */
  341.       beep, /* + */
  342.       beep, /* , */
  343.       beep, /* - */
  344.       beep, /* . */
  345.       beep, /* / */
  346.       del_window_cmd,           /* 0 */
  347.       one_window_cmd,           /* 1 */
  348.       two_window_cmd,           /* 2 */
  349.       beep, /* 3 */
  350.       beep, /* 4 */
  351.       beep, /* 5 */
  352.       beep, /* 6 */
  353.       beep, /* 7 */
  354.       beep, /* 8 */
  355.       beep, /* 9 */
  356.       beep, /* : */
  357.       beep, /* ; */
  358.       beep, /* < */
  359.       beep, /* = */
  360.       beep, /* > */
  361.       beep, /* ? */
  362.       beep, /* @ */
  363.       beep, /* A */
  364.       beep, /* B */
  365.       beep, /* C */
  366.       beep, /* D */
  367.       beep, /* E */
  368.       beep, /* F */
  369.       beep, /* G */
  370.       beep, /* H */
  371.       beep, /* I */
  372.       beep, /* J */
  373.       beep, /* K */
  374.       beep, /* L */
  375.       beep, /* M */
  376.       beep, /* N */
  377.       other_window_cmd,         /* O */
  378.       beep, /* P */
  379.       beep, /* Q */
  380.       beep, /* R */
  381.       beep, /* S */
  382.       beep, /* T */
  383.       beep, /* U */
  384.       beep, /* V */
  385.       beep, /* W */
  386.       beep, /* X */
  387.       beep, /* Y */
  388.       beep, /* Z */
  389.       beep, /* [ */
  390.       beep, /* \ */
  391.       beep, /* ] */
  392.       beep, /* ^ */
  393.       beep, /* _ */
  394.       beep, /* ` */
  395.       beep, /* a */
  396.       beep, /* b */
  397.       beep, /* c */
  398.       beep, /* d */
  399.       beep, /* e */
  400.       beep, /* f */
  401.       beep, /* g */
  402.       beep, /* h */
  403.       beep, /* i */
  404.       beep, /* j */
  405.       beep, /* k */
  406.       beep, /* l */
  407.       beep, /* m */
  408.       beep, /* n */
  409.       other_window_cmd,         /* o */
  410.       beep, /* p */
  411.       beep, /* q */
  412.       beep, /* r */
  413.       beep, /* s */
  414.       beep, /* t */
  415.       beep, /* u */
  416.       beep, /* v */
  417.       beep, /* w */
  418.       beep, /* x */
  419.       beep, /* y */
  420.       beep, /* z */
  421.       beep, /* { */
  422.       beep, /* | */
  423.       beep, /* } */
  424.       beep, /* ~ */
  425.       beep  /* ^? */
  426.   };
  427.  
  428. void (*ctrl_w_map[128])() =
  429.   {
  430.       beep, /* ^@ */
  431.       beep, /* ^A */
  432.       beep, /* ^B */
  433.       beep, /* ^C */
  434.       beep, /* ^D */
  435.       beep, /* ^E */
  436.       beep, /* ^F */
  437.       beep, /* ^G */
  438.       beep, /* ^H */
  439.       beep, /* ^I */
  440.       beep, /* ^J */
  441.       beep, /* ^K */
  442.       beep, /* ^L */
  443.       beep, /* ^M */
  444.       beep, /* ^N */
  445.       beep, /* ^O */
  446.       beep, /* ^P */
  447.       beep, /* ^Q */
  448.       beep, /* ^R */
  449.       beep, /* ^S */
  450.       beep, /* ^T */
  451.       beep, /* ^U */
  452.       beep, /* ^V */
  453.       beep, /* ^W */
  454.       beep, /* ^X */
  455.       beep, /* ^Y */
  456.       beep, /* ^Z */
  457.       beep, /* ^[ */
  458.       beep, /* ^\ */
  459.       beep, /* ^] */
  460.       beep, /* ^^ */
  461.       beep, /* ^_ */
  462.       beep, /*   */
  463.       beep, /* ! */
  464.       beep, /* " */
  465.       beep, /* # */
  466.       beep, /* $ */
  467.       beep, /* % */
  468.       beep, /* & */
  469.       beep, /* ' */
  470.       beep, /* ( */
  471.       beep, /* ) */
  472.       beep, /* * */
  473.       beep, /* + */
  474.       beep, /* , */
  475.       beep, /* - */
  476.       beep, /* . */
  477.       beep, /* / */
  478.       del_window_cmd,           /* 0 */
  479.       one_window_cmd,           /* 1 */
  480.       two_window_cmd,           /* 2 */
  481.       beep, /* 3 */
  482.       beep, /* 4 */
  483.       beep, /* 5 */
  484.       beep, /* 6 */
  485.       beep, /* 7 */
  486.       beep, /* 8 */
  487.       beep, /* 9 */
  488.       beep, /* : */
  489.       beep, /* ; */
  490.       beep, /* < */
  491.       beep, /* = */
  492.       beep, /* > */
  493.       beep, /* ? */
  494.       beep, /* @ */
  495.       beep, /* A */
  496.       beep, /* B */
  497.       beep, /* C */
  498.       beep, /* D */
  499.       beep, /* E */
  500.       beep, /* F */
  501.       beep, /* G */
  502.       beep, /* H */
  503.       beep, /* I */
  504.       beep, /* J */
  505.       beep, /* K */
  506.       beep, /* L */
  507.       beep, /* M */
  508.       beep, /* N */
  509.       other_window_cmd,         /* O */
  510.       beep, /* P */
  511.       beep, /* Q */
  512.       beep, /* R */
  513.       beep, /* S */
  514.       beep, /* T */
  515.       beep, /* U */
  516.       beep, /* V */
  517.       beep, /* W */
  518.       beep, /* X */
  519.       beep, /* Y */
  520.       beep, /* Z */
  521.       beep, /* [ */
  522.       beep, /* \ */
  523.       beep, /* ] */
  524.       beep, /* ^ */
  525.       beep, /* _ */
  526.       beep, /* ` */
  527.       beep, /* a */
  528.       beep, /* b */
  529.       beep, /* c */
  530.       beep, /* d */
  531.       beep, /* e */
  532.       beep, /* f */
  533.       beep, /* g */
  534.       beep, /* h */
  535.       beep, /* i */
  536.       beep, /* j */
  537.       beep, /* k */
  538.       beep, /* l */
  539.       beep, /* m */
  540.       beep, /* n */
  541.       other_window_cmd, /* o */
  542.       beep, /* p */
  543.       beep, /* q */
  544.       beep, /* r */
  545.       beep, /* s */
  546.       beep, /* t */
  547.       beep, /* u */
  548.       beep, /* v */
  549.       beep, /* w */
  550.       beep, /* x */
  551.       beep, /* y */
  552.       beep, /* z */
  553.       beep, /* { */
  554.       beep, /* | */
  555.       beep, /* } */
  556.       beep, /* ~ */
  557.       beep  /* ^? */
  558.   };
  559.  
  560. void (*ctrl_k_map[128])() =
  561.   {
  562.       beep, /* ^@ */
  563.       beep, /* ^A */
  564.       set_mark_cmd,             /* ^B */
  565.       beep, /* ^C */
  566.       beep, /* ^D */
  567.       beep, /* ^E */
  568.       beep, /* ^F */
  569.       beep, /* ^G */
  570.       beep, /* ^H */
  571.       beep, /* ^I */
  572.       goto_mark_cmd,            /* ^J */
  573.       beep, /* ^K */
  574.       beep, /* ^L */
  575.       goto_mark_cmd,            /* ^M */
  576.       beep, /* ^N */
  577.       beep, /* ^O */
  578.       beep, /* ^P */
  579.       beep, /* ^Q */
  580.       beep, /* ^R */
  581.       beep, /* ^S */
  582.       beep, /* ^T */
  583.       beep, /* ^U */
  584.       beep, /* ^V */
  585.       beep, /* ^W */
  586.       beep, /* ^X */
  587.       beep, /* ^Y */
  588.       beep, /* ^Z */
  589.       beep, /* ^[ */
  590.       beep, /* ^\ */
  591.       beep, /* ^] */
  592.       beep, /* ^^ */
  593.       beep, /* ^_ */
  594.       beep, /*   */
  595.       beep, /* ! */
  596.       beep, /* " */
  597.       beep, /* # */
  598.       beep, /* $ */
  599.       beep, /* % */
  600.       beep, /* & */
  601.       beep, /* ' */
  602.       beep, /* ( */
  603.       beep, /* ) */
  604.       beep, /* * */
  605.       beep, /* + */
  606.       beep, /* , */
  607.       beep, /* - */
  608.       beep, /* . */
  609.       beep, /* / */
  610.       beep, /* 0 */
  611.       beep, /* 1 */
  612.       beep, /* 2 */
  613.       beep, /* 3 */
  614.       beep, /* 4 */
  615.       beep, /* 5 */
  616.       beep, /* 6 */
  617.       beep, /* 7 */
  618.       beep, /* 8 */
  619.       beep, /* 9 */
  620.       beep, /* : */
  621.       beep, /* ; */
  622.       beep, /* < */
  623.       beep, /* = */
  624.       beep, /* > */
  625.       beep, /* ? */
  626.       beep, /* @ */
  627.       beep, /* A */
  628.       beep, /* B */
  629.       beep, /* C */
  630.       extended_cmd_cmd,         /* D */
  631.       exit_cmd,                 /* E */
  632.       beep, /* F */
  633.       find_file_cmd,            /* G */
  634.       beep, /* H */
  635.       beep, /* I */
  636.       beep, /* J */
  637.       beep, /* K */
  638.       beep, /* L */
  639.       set_mark_cmd,             /* M */
  640.       beep, /* N */
  641.       beep, /* O */
  642.       beep, /* P */
  643.       beep, /* Q */
  644.       beep, /* R */
  645.       beep, /* S */
  646.       beep, /* T */
  647.       beep, /* U */
  648.       beep, /* V */
  649.       beep, /* W */
  650.       beep, /* X */
  651.       beep, /* Y */
  652.       beep, /* Z */
  653.       beep, /* [ */
  654.       beep, /* \ */
  655.       beep, /* ] */
  656.       beep, /* ^ */
  657.       beep, /* _ */
  658.       beep, /* ` */
  659.       beep, /* a */
  660.       beep, /* b */
  661.       beep, /* c */
  662.       extended_cmd_cmd,         /* d */
  663.       exit_cmd,                 /* e */
  664.       beep, /* f */
  665.       find_file_cmd,            /* g */
  666.       beep, /* h */
  667.       beep, /* i */
  668.       beep, /* j */
  669.       beep, /* k */
  670.       beep, /* l */
  671.       set_mark_cmd,             /* m */
  672.       beep, /* n */
  673.       beep, /* o */
  674.       beep, /* p */
  675.       beep, /* q */
  676.       beep, /* r */
  677.       beep, /* s */
  678.       beep, /* t */
  679.       beep, /* u */
  680.       beep, /* v */
  681.       beep, /* w */
  682.       beep, /* x */
  683.       beep, /* y */
  684.       beep, /* z */
  685.       beep, /* { */
  686.       beep, /* | */
  687.       beep, /* } */
  688.       beep, /* ~ */
  689.       beep  /* ^? */
  690.   };
  691.  
  692. void (*esc_O_map[128])() =
  693.   {
  694.       beep, /* ^@ */
  695.       beep, /* ^A */
  696.       beep, /* ^B */
  697.       beep, /* ^C */
  698.       beep, /* ^D */
  699.       beep, /* ^E */
  700.       beep, /* ^F */
  701.       beep, /* ^G */
  702.       beep, /* ^H */
  703.       beep, /* ^I */
  704.       beep, /* ^J */
  705.       beep, /* ^K */
  706.       beep, /* ^L */
  707.       beep, /* ^M */
  708.       beep, /* ^N */
  709.       beep, /* ^O */
  710.       beep, /* ^P */
  711.       beep, /* ^Q */
  712.       beep, /* ^R */
  713.       beep, /* ^S */
  714.       beep, /* ^T */
  715.       beep, /* ^U */
  716.       beep, /* ^V */
  717.       beep, /* ^W */
  718.       beep, /* ^X */
  719.       beep, /* ^Y */
  720.       beep, /* ^Z */
  721.       beep, /* ^[ */
  722.       beep, /* ^\ */
  723.       beep, /* ^] */
  724.       beep, /* ^^ */
  725.       beep, /* ^_ */
  726.       beep, /*   */
  727.       beep, /* ! */
  728.       beep, /* " */
  729.       beep, /* # */
  730.       beep, /* $ */
  731.       beep, /* % */
  732.       beep, /* & */
  733.       beep, /* ' */
  734.       beep, /* ( */
  735.       beep, /* ) */
  736.       beep, /* * */
  737.       beep, /* + */
  738.       beep, /* , */
  739.       beep, /* - */
  740.       beep, /* . */
  741.       beep, /* / */
  742.       dec_extended_map_cmd,     /* 0 */
  743.       dec_extended_map_cmd,     /* 1 */
  744.       dec_extended_map_cmd,     /* 2 */
  745.       dec_extended_map_cmd,     /* 3 */
  746.       dec_extended_map_cmd,     /* 4 */
  747.       dec_extended_map_cmd,     /* 5 */
  748.       dec_extended_map_cmd,     /* 6 */
  749.       dec_extended_map_cmd,     /* 7 */
  750.       dec_extended_map_cmd,     /* 8 */
  751.       dec_extended_map_cmd,     /* 9 */
  752.       beep, /* : */
  753.       beep, /* ; */
  754.       beep, /* < */
  755.       beep, /* = */
  756.       beep, /* > */
  757.       beep, /* ? */
  758.       beep, /* @ */
  759.       previous_line_cmd,        /* A */
  760.       next_line_cmd,            /* B */
  761.       page_right_cmd,           /* C */
  762.       page_left_cmd,            /* D */
  763.       beep, /* E */
  764.       beep, /* F */
  765.       beep, /* G */
  766.       beep, /* H */
  767.       beep, /* I */
  768.       beep, /* J */
  769.       beep, /* K */
  770.       beep, /* L */
  771.       next_line_cmd, /* M */
  772.       beep, /* N */
  773.       beep, /* O */
  774.       pf1_map_cmd, /* P */      /* PF1 */
  775.       help_cmd, /* Q */ /* PF2 */
  776.       edt_find_next_cmd, /* R */ /* PF3 */
  777.       beep, /* S */ /* PF4 */
  778.       beep, /* T */
  779.       beep, /* U */
  780.       beep, /* V */
  781.       beep, /* W */
  782.       beep, /* X */
  783.       beep, /* Y */
  784.       beep, /* Z */
  785.       beep, /* [ */
  786.       beep, /* \ */
  787.       beep, /* ] */
  788.       beep, /* ^ */
  789.       beep, /* _ */
  790.       beep, /* ` */
  791.       beep, /* a */
  792.       beep, /* b */
  793.       beep, /* c */
  794.       beep, /* d */
  795.       beep, /* e */
  796.       beep, /* f */
  797.       beep, /* g */
  798.       beep, /* h */
  799.       beep, /* i */
  800.       beep, /* j */
  801.       beep, /* k */
  802.       beep, /* l */
  803.       beep, /* m */
  804.       set_mark_cmd, /* n */
  805.       beep, /* o */
  806.       edt_line_cmd, /* p */ /* KP0 */
  807.       beep, /* q */ /* KP1 */
  808.       beep, /* r */ /* KP2 */
  809.       beep, /* s */ /* KP3 */
  810.       edt_forward_cmd, /* t */ /* KP4 */
  811.       edt_back_cmd, /* u */ /* KP5 */
  812.       beep, /* v */ /* KP6 */
  813.       beep, /* w */ /* KP7 */
  814.       edt_page_cmd, /* x */ /* KP8 */
  815.       beep, /* y */ /* KP9 */
  816.       beep, /* z */
  817.       beep, /* { */
  818.       beep, /* | */
  819.       beep, /* } */
  820.       beep, /* ~ */
  821.       beep  /* ^? */
  822.   };
  823.  
  824. void (*pf1_map[128])() =        /* Gold */
  825.   {
  826.       beep, /* ^@ */
  827.       beep, /* ^A */
  828.       beep, /* ^B */
  829.       beep, /* ^C */
  830.       beep, /* ^D */
  831.       beep, /* ^E */
  832.       beep, /* ^F */
  833.       beep, /* ^G */
  834.       beep, /* ^H */
  835.       beep, /* ^I */
  836.       beep, /* ^J */
  837.       beep, /* ^K */
  838.       beep, /* ^L */
  839.       beep, /* ^M */
  840.       beep, /* ^N */
  841.       beep, /* ^O */
  842.       beep, /* ^P */
  843.       beep, /* ^Q */
  844.       beep, /* ^R */
  845.       beep, /* ^S */
  846.       beep, /* ^T */
  847.       beep, /* ^U */
  848.       beep, /* ^V */
  849.       beep, /* ^W */
  850.       beep, /* ^X */
  851.       beep, /* ^Y */
  852.       beep, /* ^Z */
  853.       pf1_esc_map_cmd, /* ^[ */
  854.       beep, /* ^\ */
  855.       beep, /* ^] */
  856.       beep, /* ^^ */
  857.       beep, /* ^_ */
  858.       beep, /*   */
  859.       beep, /* ! */
  860.       beep, /* " */
  861.       beep, /* # */
  862.       beep, /* $ */
  863.       beep, /* % */
  864.       beep, /* & */
  865.       beep, /* ' */
  866.       beep, /* ( */
  867.       beep, /* ) */
  868.       beep, /* * */
  869.       beep, /* + */
  870.       beep, /* , */
  871.       beep, /* - */
  872.       beep, /* . */
  873.       beep, /* / */
  874.       digit_arg_cmd, /* 0 */
  875.       digit_arg_cmd, /* 1 */
  876.       digit_arg_cmd, /* 2 */
  877.       digit_arg_cmd, /* 3 */
  878.       digit_arg_cmd, /* 4 */
  879.       digit_arg_cmd, /* 5 */
  880.       digit_arg_cmd, /* 6 */
  881.       digit_arg_cmd, /* 7 */
  882.       digit_arg_cmd, /* 8 */
  883.       digit_arg_cmd, /* 9 */
  884.       beep, /* : */
  885.       beep, /* ; */
  886.       beep, /* < */
  887.       beep, /* = */
  888.       beep, /* > */
  889.       beep, /* ? */
  890.       beep, /* @ */
  891.       beep, /* A */
  892.       beep, /* B */
  893.       beep, /* C */
  894.       beep, /* D */
  895.       beep, /* E */
  896.       beep, /* F */
  897.       beep, /* G */
  898.       beep, /* H */
  899.       beep, /* I */
  900.       beep, /* J */
  901.       beep, /* K */
  902.       beep, /* L */
  903.       beep, /* M */
  904.       beep, /* N */
  905.       one_window_cmd, /* O */
  906.       beep, /* P */
  907.       exit_cmd, /* Q */
  908.       beep, /* R */
  909.       sys_spawn_cmd, /* S */
  910.       beep, /* T */
  911.       beep, /* U */
  912.       del_window_cmd, /* V */
  913.       beep, /* W */
  914.       two_window_cmd, /* X */
  915.       beep, /* Y */
  916.       beep, /* Z */
  917.       beep, /* [ */
  918.       beep, /* \ */
  919.       beep, /* ] */
  920.       beep, /* ^ */
  921.       beep, /* _ */
  922.       beep, /* ` */
  923.       beep, /* a */
  924.       beep, /* b */
  925.       beep, /* c */
  926.       beep, /* d */
  927.       beep, /* e */
  928.       beep, /* f */
  929.       beep, /* g */
  930.       beep, /* h */
  931.       beep, /* i */
  932.       beep, /* j */
  933.       beep, /* k */
  934.       beep, /* l */
  935.       beep, /* m */
  936.       beep, /* n */
  937.       one_window_cmd, /* o */
  938.       beep, /* p */
  939.       exit_cmd, /* q */
  940.       beep, /* r */
  941.       sys_spawn_cmd, /* s */
  942.       beep, /* t */
  943.       beep, /* u */
  944.       del_window_cmd, /* v */
  945.       beep, /* w */
  946.       two_window_cmd, /* x */
  947.       beep, /* y */
  948.       beep, /* z */
  949.       beep, /* { */
  950.       beep, /* | */
  951.       beep, /* } */
  952.       beep, /* ~ */
  953.       beep  /* ^? */
  954.   };
  955.  
  956. void execute_key()
  957. {
  958.     char ch;
  959.     int r,c;
  960.     c = CURS_COL - COLUMN + 1;
  961.     r = CURS_ROW;
  962.     if (MINI_BUF[0] != '\0') put_message();
  963.     if (r < 1) r = 1;
  964.     else if (r > (WIN->bot - WIN->top + 1))
  965.       r = WIN->bot - WIN->top + 1;
  966.     if (c > SCREEN_WIDTH) c = SCREEN_WIDTH;
  967.     else if (c < 1) c = 1;
  968.     goto_rc(r + WIN->top - 1,c);
  969.     fflush(stdout);
  970.     DIGIT_ARG = (int *) NULL;
  971.     ch = getkey();
  972.     if (MINI_BUF[0] != '\0') clear_minibuffer();
  973.     LAST_CHAR = ch;
  974.     (*root_map[ (int) ch ])();
  975. }
  976.  
  977. void ctrl_x_map_cmd()
  978. {
  979.     char ch;
  980.  
  981.     ch = getkey();
  982.     (*ctrl_x_map[ (int) ch ])();
  983. }
  984.  
  985. void ctrl_k_map_cmd()
  986. {
  987.     char ch;
  988.  
  989.     ch = getkey();
  990.     (*ctrl_k_map[ (int) ch ])();
  991. }
  992.  
  993. void ctrl_w_map_cmd()
  994. {
  995.     char ch;
  996.  
  997.     ch = getkey();
  998.     (*ctrl_w_map[ (int) ch ])();
  999. }
  1000.  
  1001. void O_map_cmd()
  1002. {
  1003.     char ch;
  1004.  
  1005.     ch = getkey();
  1006.     LAST_CHAR = ch;
  1007.     (*esc_O_map[ (int) ch ])();
  1008. }
  1009.  
  1010. void esc_map_cmd()
  1011. {
  1012.     char ch;
  1013.  
  1014.     ch = getkey();
  1015.     LAST_CHAR = ch;
  1016.     (*escape_map[ (int) ch ])();
  1017. }
  1018.  
  1019. /* weird sequences of form ^[[n~ where n is an integer */
  1020. void dec_extended_map_cmd()
  1021. {
  1022.     char ch, numstr[5];
  1023.     int i, num;
  1024.  
  1025.     ch = LAST_CHAR;  /* should be integer */
  1026.     i = 0;
  1027.     numstr[i++] = ch;
  1028.  
  1029.     while (ch = getkey(), isdigit(ch)) numstr[i++] = ch;
  1030.     if (ch == '~')
  1031.       {
  1032.           numstr[i++] =  '\0';
  1033.           sscanf(numstr,"%d",&num);
  1034.           switch (num)
  1035.             {
  1036.               case 5:
  1037.                 page_up_cmd(); break; /* prev screen */
  1038.               case 6:
  1039.                 page_down_cmd(); break; /* next screen */
  1040.               case 1:
  1041.                 search_cmd(); break; /* find */
  1042.               case 4:
  1043.                 set_mark_cmd(); break; /* select */
  1044.               case 2:
  1045.                 goto_mark_cmd(); break; /* insert here */
  1046.               case 28:
  1047.                 help_cmd(); break; /* Help */
  1048.               case 29:  /* do */
  1049.                 extended_cmd_cmd(); break;
  1050.               default:
  1051.                 beep(); break;
  1052.             }
  1053.       }
  1054.     else beep();
  1055. }
  1056.  
  1057. #ifdef __EMX__
  1058. void zero_map_cmd()
  1059. {
  1060.     char ch;
  1061.     LAST_CHAR = ch = getkey();
  1062.     switch (ch)
  1063.         {
  1064.         case K_LEFT:
  1065.             page_left_cmd(); break;
  1066.         case K_RIGHT:
  1067.             page_right_cmd(); break;
  1068.         case K_UP:
  1069.             previous_line_cmd(); break;
  1070.         case K_DOWN:
  1071.             next_line_cmd(); break;
  1072.         case K_PAGEUP:
  1073.             page_up_cmd(); break;
  1074.         case K_PAGEDOWN:
  1075.             page_down_cmd(); break;
  1076.         case K_HOME:
  1077.             top_of_buffer_cmd(); break;
  1078.         case K_END:
  1079.             end_of_buffer_cmd(); break;
  1080.         case K_INS:
  1081.             break;
  1082.         case K_DEL:
  1083.             break;
  1084.         default :
  1085.             beep(); break;
  1086.         }
  1087.  
  1088. }
  1089. #endif
  1090.  
  1091. /* weird sequences of form ^[[n~ where n is an integer */
  1092. void pf1_esc_map_cmd()
  1093. {
  1094.     char ch;
  1095.  
  1096.     LAST_CHAR = ch = getkey();
  1097.     switch (ch)
  1098.         {
  1099.         case 'O':
  1100.             LAST_CHAR = ch = getkey();
  1101.             switch (ch)
  1102.                 {
  1103.                 case 't': /* KP4 */
  1104.                     end_of_buffer_cmd(); break;
  1105.                 case 'u': /* KP5 */
  1106.                     top_of_buffer_cmd(); break;
  1107.                 case 'w': /* KP7 */
  1108.                     extended_cmd_cmd(); break;
  1109.                 case 'n': /* KP7 */
  1110.                     goto_mark_cmd(); break;
  1111.                 case 'R': /* PF3 */
  1112.                     edt_find_cmd(); break;
  1113.                 default :
  1114.                     beep(); break;
  1115.                 }
  1116.             break;
  1117.         case '[':
  1118.             LAST_CHAR = ch = getkey();
  1119.             switch (ch)
  1120.                 {
  1121.                 case 'A':
  1122.                     other_window_cmd(); break;
  1123.                 case 'B':
  1124.                     other_window_cmd(); break;
  1125.                 case 'C':
  1126.                     page_left_cmd(); break;
  1127.                 case 'D':
  1128.                     page_right_cmd(); break;
  1129.                 default :
  1130.                     beep(); break;
  1131.                 };
  1132.             break;
  1133.         default :
  1134.             beep(); break;
  1135.         }
  1136. }
  1137.  
  1138. void pf1_map_cmd()
  1139. {
  1140.     char ch;
  1141.  
  1142.     ch = getkey();
  1143.     LAST_CHAR = ch;
  1144.     (*pf1_map[ (int) ch ])();
  1145. }
  1146.  
  1147. void page_down_cmd()
  1148. {
  1149.    int n = 1;
  1150.  
  1151.    if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
  1152.    if (n < 0) n = 1;
  1153.    n = C_LINE + n * (WIN->bot - WIN->top + 1);
  1154.    while ((BUF->fd != -1) && (NUM_LINES < n + 50)) read_file_dsc(1);
  1155.    update_windows(n);
  1156. }
  1157.  
  1158. void page_up_cmd()
  1159. {
  1160.     int n = 1;
  1161.     if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
  1162.     update_windows(C_LINE - n * (WIN->bot - WIN->top + 1));
  1163. }
  1164.  
  1165. void page_right_cmd()
  1166. {
  1167.     int n = 1;
  1168.     if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
  1169.     COLUMN = COLUMN + n * 59;
  1170.     update_windows(C_LINE);
  1171. }
  1172.  
  1173. void page_left_cmd()
  1174. {
  1175.     int n = 1;
  1176.     if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
  1177.     COLUMN = COLUMN - n * 59;
  1178.     update_windows(C_LINE);
  1179. }
  1180.  
  1181. void next_line_cmd()
  1182. {
  1183.     int n = 1;
  1184.     if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
  1185.  
  1186.    while ((BUF->fd != -1) && (NUM_LINES < C_LINE + n + 50)) read_file_dsc(1);
  1187.    update_windows(C_LINE + n);
  1188. }
  1189.  
  1190. void previous_line_cmd()
  1191. {
  1192.    int n = 1;
  1193.    if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
  1194.  
  1195.     update_windows(C_LINE - n);
  1196. }
  1197.  
  1198.  
  1199. void top_of_buffer_cmd()
  1200. {
  1201.     update_windows(1);
  1202. }
  1203.  
  1204. void end_of_buffer_cmd()
  1205. {
  1206.    while (BUF->fd != -1) read_file_dsc(-1);
  1207.    update_windows(NUM_LINES);
  1208. }
  1209. #ifdef unix
  1210. #include <signal.h>
  1211. #endif
  1212. extern void sys_spawn_cmd()
  1213. {
  1214.     int update = 0;
  1215.     reset_tty();
  1216.     reset_display();
  1217.     fflush(stdout);
  1218. #ifdef VMS
  1219.     if (LAST_CHAR == '\032') exit(0);
  1220.     if (do_shell_command()) update = 1; /* scroll region reset by message facility */
  1221. #else
  1222. #ifndef __EMX__
  1223.    kill(0, SIGTSTP);
  1224.    update = 1;
  1225. #else
  1226.    system("");
  1227.    update = 1; /* scroll region reset by message facility */
  1228. #endif
  1229. #endif
  1230.    init_tty();
  1231.    if (update) redraw_display();
  1232. }
  1233.  
  1234. void redraw_cmd()
  1235. {
  1236.     redraw_display();
  1237. }
  1238.  
  1239. void goto_line_cmd()
  1240. {
  1241.     int n = C_LINE;
  1242.     if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
  1243.     else
  1244.       {
  1245.           MINI_BUF[0] = 0;
  1246.           if (!read_from_minibuffer("Line", (char *) MINI_BUF)) return;
  1247.           sscanf((char *) MINI_BUF,"%d",&n);
  1248.           MINI_BUF[0] = 0;
  1249.       }
  1250.     update_windows(n);
  1251. }
  1252.  
  1253. void goto_percent_cmd()
  1254. {
  1255.     unsigned char *pos;
  1256.     int n;
  1257.     if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
  1258.     else
  1259.       {
  1260.           MINI_BUF[0] = 0;
  1261.           if (!read_from_minibuffer("%", (char *) MINI_BUF)) return;
  1262.           sscanf((char *) MINI_BUF,"%d",&n);
  1263.           MINI_BUF[0] = 0;
  1264.       }
  1265.     if (n < 0) n = 0; else if (n > 100) n = 100;
  1266.    if (BUF->fd != -1) read_file_dsc(-1);
  1267.    pos = BEG + (n * (EOB - BEG))/100;
  1268.    n = what_line(pos);
  1269.    update_windows(n);
  1270. }
  1271.  
  1272. void extended_key_cmd()
  1273. {
  1274.     if (-1 == do_extended_key()) exit_cmd();
  1275. }
  1276.  
  1277. void extended_cmd_cmd()
  1278. {
  1279.     if (-1 == do_extended_cmd()) exit_cmd();
  1280. }
  1281.  
  1282. void set_mark_cmd()
  1283. {
  1284.     BUF->mark = C_LINE;
  1285.     message("Mark Set.",0);
  1286. }
  1287.  
  1288. void goto_mark_cmd()
  1289. {
  1290.     int mark = BUF->mark;
  1291.     BUF->mark = C_LINE;
  1292.     update_window(mark);
  1293.     message("Mark Set.",0);
  1294. }
  1295.  
  1296. void one_window_cmd()
  1297. {
  1298.     one_window();
  1299. }
  1300.  
  1301. void two_window_cmd()
  1302. {
  1303.     two_windows();
  1304. }
  1305.  
  1306. void del_window_cmd()
  1307. {
  1308.     delete_window();
  1309. }
  1310.  
  1311. void other_window_cmd()
  1312. {
  1313.     int n = 1;
  1314.     if (DIGIT_ARG != (int *) NULL) n = *DIGIT_ARG;
  1315.     other_window(n);
  1316. }
  1317.  
  1318.  
  1319. void find_next_cmd()
  1320. {
  1321.    int col, line, n = 1;
  1322.    int ofs;
  1323.  
  1324.     if (DIGIT_ARG != NULL) n = *DIGIT_ARG;
  1325.     line = search(CURS_POS + SEARCH_DIR, n, &col);
  1326.     if (line < 1) return;
  1327.  
  1328.    /* note that only offsets are meaningful!! (version 4) */
  1329.     ofs = CURS_POS - BEG;
  1330.     if ((line < WIN->beg_line) || (line > WIN->beg_line + WIN->bot - WIN->top))
  1331.       update_window(line);
  1332.     CURS_POS = BEG + ofs;
  1333.  
  1334.     CURS_ROW = line - C_LINE + 1;
  1335.     CURS_COL = col;
  1336. }
  1337.  
  1338. void search_cmd()
  1339. {
  1340.     SEARCH_DIR = 1;
  1341.     if (read_from_minibuffer("Search",SEARCH_STR) == -1)
  1342.       return;
  1343.     CURS_POS = C_POS;
  1344.     find_next_cmd();
  1345. }
  1346.  
  1347. void search_back_cmd()
  1348. {
  1349.     SEARCH_DIR = -1;
  1350.     if (read_from_minibuffer("Search",SEARCH_STR) == -1)
  1351.       return;
  1352.     find_next_cmd();
  1353. }
  1354.  
  1355. void help_cmd()
  1356. {
  1357.     do_help_command();
  1358. }
  1359.  
  1360. void find_file_cmd()
  1361. {
  1362.     user_get_file();
  1363. }
  1364.  
  1365. void time_cmd()
  1366. {
  1367.     message(get_time(),0);
  1368. }
  1369.  
  1370. void exit_cmd()
  1371. {
  1372.     reset_tty();
  1373.     reset_display();
  1374. #ifndef  VMS
  1375.     tt_putchar('\n');
  1376. #endif
  1377.     exit(0);
  1378. }
  1379.  
  1380. void digit_arg_cmd()
  1381. {
  1382.     char num[15], ch;
  1383.     int j = 0;
  1384.     static int digits;
  1385.  
  1386.     num[j++] = LAST_CHAR;
  1387.     ch = getkey();
  1388.     while ((ch >= '0') && (ch <= '9'))
  1389.       {
  1390.           num[j++] = ch;
  1391.           ch = getkey();
  1392.       }
  1393.  
  1394.     if (((j == 1) && (LAST_CHAR != '-')) || (j > 1))
  1395.       {
  1396.           num[j] = '\0';
  1397.           sscanf(num,"%d",&digits);
  1398.           DIGIT_ARG = &digits;
  1399.       }
  1400.     LAST_CHAR = ch;
  1401.     (*root_map[ (int) ch ])();
  1402. }
  1403.  
  1404.  
  1405. void toggle_width_cmd()
  1406. {
  1407. #ifdef TIOCSWINSZ
  1408.     if (SCREEN_WIDTH == 80)
  1409.       {
  1410.           if (!RESTORE_WIDTH_TO) RESTORE_WIDTH_TO = 80;
  1411.           set_width(132, 1);
  1412.       }
  1413.     else if (SCREEN_WIDTH == 132)
  1414.       {
  1415.           if (!RESTORE_WIDTH_TO) RESTORE_WIDTH_TO = 132;
  1416.           set_width(80, 1);
  1417.       }
  1418. #endif
  1419. }
  1420.  
  1421. void edt_forward_cmd()
  1422. {
  1423.     EDT_DIRECTION = 1;
  1424. }
  1425.  
  1426. void edt_back_cmd()
  1427. {
  1428.     EDT_DIRECTION = 0;
  1429. }
  1430.  
  1431. void edt_page_cmd()
  1432. {
  1433.     if (EDT_DIRECTION == 0)
  1434.         {
  1435.             page_up_cmd();
  1436.         }
  1437.     else
  1438.         {
  1439.             page_down_cmd();
  1440.         }
  1441. }
  1442.  
  1443. void edt_line_cmd()
  1444. {
  1445.     if (EDT_DIRECTION == 0)
  1446.         {
  1447.             previous_line_cmd();
  1448.         }
  1449.     else
  1450.         {
  1451.             next_line_cmd();
  1452.         }
  1453. }
  1454.  
  1455. void edt_find_cmd()
  1456. {
  1457.     if (EDT_DIRECTION == 0)
  1458.         {
  1459.             search_back_cmd();
  1460.         }
  1461.     else
  1462.         {
  1463.             search_cmd();
  1464.         }
  1465. }
  1466.  
  1467. void edt_find_next_cmd()
  1468. {
  1469.     if (EDT_DIRECTION == 0)
  1470.         {
  1471.             SEARCH_DIR = -1;
  1472.         }
  1473.     else
  1474.         {
  1475.             SEARCH_DIR = 1;
  1476.         }
  1477.     find_next_cmd();
  1478. }
  1479.  
  1480.