home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume24 / mced / part01 / emacs_edit.c < prev    next >
C/C++ Source or Header  |  1991-10-26  |  8KB  |  353 lines

  1. /*
  2.  * This software is Copyright (c) 1991 by Andy Knight
  3.  *
  4.  * Permission is hereby granted to copy, distribute or otherwise
  5.  * use any part of this package as long as you do not try to make
  6.  * money from it or pretend that you wrote it.  This copyright
  7.  * notice must be maintained in any copy made.
  8.  *
  9.  * Use of this software constitutes acceptance for use in an AS IS
  10.  * condition. There are NO warranties with regard to this software.
  11.  * In no event shall the author be liable for any damages whatsoever
  12.  * arising out of or in connection with the use or performance of this
  13.  * software.  Any use of this software is at the user's own risk.
  14.  *
  15.  * If you make modifications to this software that you feel
  16.  * increases it usefulness for the rest of the community, please
  17.  * email the changes, enhancements, bug fixes as well as any and
  18.  * all ideas to me. This software is going to be maintained and
  19.  * enhanced as deemed necessary by the community.
  20.  *
  21.  * " ... Freely you have recieved, freely give"  <Matthew 10:8> 
  22.  *
  23.  *        Andy Knight
  24.  *        aknight@ourgang.prime.com
  25.  */
  26.  
  27. #include "config.h"
  28.  
  29. extern char *hist[], cstr[];
  30. extern int xbeg, cur_cmd, last_hline, pwolfe_getch();
  31. extern int edit_mode, x_pos, savex_pos, xend;
  32.  
  33. extern void my_wmove(), add_hline(), cmd_to_win(), win_to_cmd();
  34. extern void my_waddstr(), my_winsch(), case_upper();
  35. extern void my_wdelch(), case_lower(), eat_white();
  36. extern SIGTYPE die_curses(), die_normal();
  37. extern WINDOW *win;
  38.  
  39. #ifdef SYSVcurses
  40.     extern struct termio tio, tin;
  41. #else
  42.     extern struct tchars tco, tcn;
  43. #endif
  44.  
  45.  
  46. edit_cmd()
  47. {
  48.     int edch, tch, i, tmp_cmd;
  49.     fprintf(stdout,"\n");
  50.     if(initscr() == ERR)
  51.     {
  52.     fprintf(stderr, "Curses won't initialize - help!\n");
  53.     die_normal();
  54.     }
  55.     signal(SIGINT,die_curses);      /* die cleanly */
  56.     CBREAKF();
  57.     noecho();
  58. #ifdef SYSVcurses
  59.     win = newwin(2,COLS,0,0);
  60. #else
  61.     clearok(curscr, FALSE);    /* SYSV curses clears it anyway ;-( */
  62.     win = newwin(2,COLS,LINES-2,0);
  63. #endif
  64.  
  65.     cmd_to_win();
  66.     wrefresh(win);
  67.  
  68. #ifdef SYSVcurses        /* disable STOP/START (CTRL-S) */
  69.     if(ioctl(0, TCGETA, &tio) != 0)
  70.     perror("ioctl");
  71.     tin = tio;
  72.     tin.c_iflag &= ~IXON;
  73.     if(ioctl(0, TCSETA, &tin) != 0)
  74.     perror("ioctl");
  75. #else
  76.     if(ioctl(0, TIOCGETC, &tco) != 0)
  77.     perror("ioctl");
  78.     tcn = tco;
  79.     tcn.t_stopc = -1;
  80.     if(ioctl(0, TIOCSETC, &tcn) != 0)
  81.     perror("ioctl");
  82. #endif
  83.     edit_mode = EMACS_MODE;
  84.     for (; (edch = pwolfe_getch(win)) != '\n';)
  85.     {
  86.     switch (edch)
  87.     {
  88.         case ControlU:
  89.         case Sun_R3:
  90.         wclear(win);
  91.         wrefresh(win);
  92.         die_curses();
  93.         break;
  94.         case ControlW:    /*Delete word backwards*/
  95.         case EscapeDEL:
  96.         case Sun_R1:
  97.         if(x_pos > xbeg)
  98.         {
  99.             my_wmove(--x_pos);
  100.             eat_white(-1,YES);
  101.             for(;!(isspace(winch(win))) && (x_pos >= xbeg);)
  102.             {
  103.             my_wdelch();
  104.             if(x_pos == xbeg)
  105.                 break;
  106.             else
  107.                 my_wmove(--x_pos);
  108.             }
  109.             if(x_pos > xbeg)
  110.                 my_wmove(++x_pos);
  111.         }
  112.         else
  113.             beep();
  114.         break;
  115.         case EscapeB:    /*move back to beginning of previous word*/
  116.         case Sun_R4:
  117.         if(x_pos > xbeg)
  118.         {
  119.             my_wmove(--x_pos);
  120.             eat_white(-1,NO);
  121.             for(;!(isspace(winch(win))) && (x_pos > xbeg);)
  122.             {
  123.                 my_wmove(--x_pos);
  124.             }
  125.             if(x_pos > xbeg)
  126.                 my_wmove(++x_pos);
  127.         }
  128.         else
  129.             beep();
  130.         break;
  131.         case EscapeD:    /*delete forward to beginning of next word*/
  132.         if(x_pos < xend)
  133.         {
  134.             eat_white(1,YES);
  135.             for(;!(isspace(winch(win))) && (x_pos < xend);)
  136.             {
  137.             my_wdelch();
  138.             }
  139.         }
  140.         else
  141.             add_hline();
  142.         break;
  143.         case EscapeF:    /*move forward to beginning of next word*/
  144.         case Sun_R6:
  145.         if(x_pos < xend)
  146.         {
  147.             eat_white(1,NO);
  148.             for(;!(isspace(winch(win))) && (x_pos < xend);)
  149.             {
  150.                 my_wmove(++x_pos);
  151.             }
  152.         }
  153.         else
  154.             beep();
  155.         break;
  156.         case ControlL:    /* redraw win */
  157.         savex_pos = x_pos;
  158.         win_to_cmd();
  159.         wclear(win);
  160.         wrefresh(win);
  161.         cmd_to_win();
  162.         x_pos = savex_pos;
  163.         my_wmove(x_pos);
  164.         break;
  165.         case BackSpace:
  166.         case KEY_LEFT:
  167.         case ControlB:
  168.         case KEY_BACKSPACE:
  169.         case Sun_R10:
  170.         if(x_pos > xbeg)
  171.             my_wmove(--x_pos);
  172.         else
  173.             beep();
  174.         break;
  175.         case EscapeM:    /* move cursor to middle */
  176.         case Sun_R11:
  177.         x_pos = xbeg + (xend-xbeg)/2;
  178.         my_wmove(x_pos);
  179.         break;
  180.         case ControlF:
  181.         case KEY_RIGHT:
  182.         case Sun_R12:
  183.         if(x_pos < xend)
  184.             my_wmove(++x_pos);
  185.         else
  186.             beep();
  187.         break;
  188.         case KEY_UP:    /* move upward in history list */
  189.         case ControlP:
  190.         case Sun_R8:
  191.         if(cur_cmd > 0)
  192.         {
  193.             --cur_cmd;
  194.             strcpy(cstr, hist[cur_cmd]);
  195.             wclear(win);
  196.             cmd_to_win();
  197.             my_wmove(x_pos);
  198.         }
  199.         else
  200.             beep();
  201.         break;
  202.         case KEY_DOWN:    /* move downward in history list */
  203.         case ControlN:
  204.         case Sun_R14:
  205.         if(cur_cmd < last_hline)
  206.         {
  207.             ++cur_cmd;
  208.             strcpy(cstr, hist[cur_cmd]);
  209.             wclear(win);
  210.             cmd_to_win();
  211.             my_wmove(x_pos);
  212.         }
  213.         else
  214.             beep();
  215.         break;
  216.         case ControlR:    /*search history list backwards*/
  217.         if((tmp_cmd = index_cmd(cur_cmd - 1,-1)) != cur_cmd)
  218.         {
  219.             cur_cmd = tmp_cmd;
  220.             strcpy(cstr, hist[cur_cmd]);
  221.             wclear(win);
  222.             cmd_to_win();
  223.             my_wmove(x_pos);
  224.         }
  225.         else
  226.             beep();
  227.         break;
  228.         case ControlS:    /*search history list forwards*/
  229.         if((tmp_cmd = index_cmd(cur_cmd + 1,1)) != cur_cmd)
  230.         {
  231.             cur_cmd = tmp_cmd;
  232.             strcpy(cstr, hist[cur_cmd]);
  233.             wclear(win);
  234.             cmd_to_win();
  235.             my_wmove(x_pos);
  236.         }
  237.         else
  238.             beep();
  239.         break;
  240.         case ControlA:
  241.         case Sun_R7:
  242.         my_wmove(xbeg);
  243.         x_pos = xbeg;
  244.         break;
  245.         case ControlE:
  246.         case Sun_R13:
  247.         case Sun_R9:
  248.         my_wmove(xend);
  249.         x_pos = xend;
  250.         break;
  251.         case ControlK:    /*delete to end of line*/
  252.         if(x_pos < xend)
  253.         {
  254.             for(i = xend; i > x_pos; i--)
  255.             {
  256.             my_wdelch();
  257.             }
  258.         }
  259.         else
  260.                     add_hline();
  261.         break;
  262.         case Delete:    /*delete character before cursor*/
  263.         if(x_pos > xbeg)
  264.         {
  265.             my_wmove(--x_pos);
  266.             my_wdelch();
  267.         }
  268.         else
  269.             beep();
  270.         break;
  271.         case ControlD:    /*delete current character*/
  272.         if(x_pos < xend)
  273.         {
  274.             my_wdelch();
  275.         }
  276.         else
  277.             add_hline();
  278.         break;
  279.         case EscapeL:    /*lower case whole command*/
  280.         case Sun_R2:
  281.         savex_pos = x_pos;
  282.         win_to_cmd();
  283.         case_lower();
  284.         cmd_to_win();
  285.         x_pos = savex_pos;
  286.         my_wmove(x_pos);
  287.         break;
  288.         case EscapeU:    /*upper case whole command*/
  289.         savex_pos = x_pos;
  290.         win_to_cmd();
  291.         case_upper();
  292.         cmd_to_win();
  293.         x_pos = savex_pos;
  294.         my_wmove(x_pos);
  295.         break;
  296.         case EscapeC:    /* toggle case of current character */
  297.         case Sun_R5:
  298.         tch = winch(win);
  299.         if(isupper(tch))
  300.         {
  301.             wdelch(win);
  302.             winsch(win,tolower(tch));
  303.         }
  304.         else if(islower(tch))
  305.         {
  306.             wdelch(win);
  307.             winsch(win,toupper(tch));
  308.         }
  309.         if(x_pos < xend)
  310.             my_wmove(++x_pos);
  311.         break;
  312.         case ControlT:    /* transpose characters */
  313.         if(x_pos > xbeg && x_pos != COLS)
  314.         {
  315.             if(x_pos == xend)
  316.                 my_wmove(--x_pos);
  317.             my_wmove(--x_pos);
  318.             tch = winch(win);
  319.             wdelch(win);
  320.             my_wmove(++x_pos);
  321.             winsch(win,tch);
  322.             my_wmove(++x_pos);
  323.         }
  324.         else
  325.             beep();
  326.         break;
  327.         default:        /* insert character */
  328.         if(isprint(edch))
  329.         {
  330.             my_winsch(edch);
  331.         }
  332.         else
  333.             beep();
  334.         break;
  335.     }
  336.     wrefresh(win);
  337.     if (xend == xbeg)
  338.         die_curses();
  339.     }
  340.     win_to_cmd();
  341. #ifdef SYSVcurses    /* reset tty */
  342.     if(ioctl(0, TCSETA, &tio) != 0)
  343.     perror("ioctl");
  344. #else
  345.     if(ioctl(0, TIOCSETC, &tco) != 0)
  346.     perror("ioctl");
  347. #endif
  348.     NOCBREAKF();
  349.     echo();
  350.     endwin();
  351.     return;    /* finished, execute command */
  352. }
  353.