home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Distributions / ucb / spencer_2bsd.tar.gz / 2bsd.tar / src / ex / ex_vis.h < prev    next >
C/C++ Source or Header  |  1980-02-17  |  8KB  |  250 lines

  1. /* Copyright (c) 1979 Regents of the University of California */
  2. /*
  3.  * Ex version 2
  4.  * Bill Joy UCB
  5.  * February, 1979
  6.  *
  7.  * Open and visual mode definitions.
  8.  * 
  9.  * There are actually 4 major states in open/visual modes.  These
  10.  * are visual, crt open (where the cursor can move about the screen and
  11.  * the screen can scroll and be erased), one line open (on dumb glass-crt's
  12.  * like the adm3), and hardcopy open (for everything else).
  13.  *
  14.  * The basic state is given by bastate, and the current state by state,
  15.  * since we can be in pseudo-hardcopy mode if we are on an adm3 and the
  16.  * line is longer than 80.
  17.  */
  18.  
  19. short    bastate;
  20. short    state;
  21.  
  22. #define    VISUAL        0
  23. #define    CRTOPEN        1
  24. #define    ONEOPEN        2
  25. #define    HARDOPEN    3
  26.  
  27. /*
  28.  * The screen in visual and crtopen is of varying size; the basic
  29.  * window has top basWTOP and basWLINES lines are thereby implied.
  30.  * The current window (which may have grown from the basic size)
  31.  * has top WTOP and WLINES lines.  The top line of the window is WTOP,
  32.  * and the bottom line WBOT.  The line WECHO is used for messages,
  33.  * search strings and the like.  If WBOT==WECHO then we are in ONEOPEN
  34.  * or HARDOPEN and there is no way back to the line we were on if we
  35.  * go to WECHO (i.e. we will have to scroll before we go there, and
  36.  * we can't get back).  There are WCOLS columns per line.
  37.  * If WBOT!=WECHO then WECHO will be the last line on the screen
  38.  * and WBOT is the line before it.
  39.  */
  40. short    basWTOP;
  41. short    basWLINES;
  42. short    WTOP;
  43. short    WBOT;
  44. short    WLINES;
  45. short    WCOLS;
  46. short    WECHO;
  47.  
  48. /*
  49.  * When we are dealing with the echo area we consider the window
  50.  * to be "split" and set the variable splitw.  Otherwise, moving
  51.  * off the bottom of the screen into WECHO causes a screen rollup.
  52.  */
  53. bool    splitw;
  54.  
  55. /*
  56.  * Information about each line currently on the screen includes
  57.  * the y coordinate associated with the line, the printing depth
  58.  * of the line (0 indicates unknown), and a mask which indicates
  59.  * whether the line is "unclean", i.e. whether we should check
  60.  * to make sure the line is displayed correctly at the next
  61.  * appropriate juncture.
  62.  */
  63. struct vlinfo {
  64.     char    vliny;        /* Y coordinate */
  65.     char    vdepth;        /* Depth of displayed line */
  66.     short    vflags;        /* Is line potentially dirty ? */
  67. } vlinfo[TUBELINES + 2];
  68.  
  69. #define    DEPTH(c)    (vlinfo[c].vdepth)
  70. #define    LINE(c)        (vlinfo[c].vliny)
  71. #define    FLAGS(c)    (vlinfo[c].vflags)
  72.  
  73. #define    VDIRT    1
  74.  
  75. /*
  76.  * Hacks to copy vlinfo structures around
  77.  */
  78. #ifdef    V6
  79.     /* Kludge to make up for no structure assignment */
  80.     struct {
  81.         long    longi;
  82.     };
  83. #    define    vlcopy(i, j)    i.longi = j.longi
  84. #else
  85. #    define    vlcopy(i, j)    i = j;
  86. #endif
  87.  
  88. /*
  89.  * The current line on the screen is represented by vcline.
  90.  * There are vcnt lines on the screen, the last being "vcnt - 1".
  91.  * Vcline is intimately tied to the current value of dot,
  92.  * and when command mode is used as a subroutine fancy footwork occurs.
  93.  */
  94. short    vcline;
  95. short    vcnt;
  96.  
  97. /*
  98.  * To allow many optimizations on output, an exact image of the terminal
  99.  * screen is maintained in the space addressed by vtube0.  The vtube
  100.  * array indexes this space as lines, and is shuffled on scrolls, insert+delete
  101.  * lines and the like rather than (more expensively) shuffling the screen
  102.  * data itself.  It is also rearranged during insert mode across line
  103.  * boundaries to make incore work easier.
  104.  */
  105. char    *vtube[TUBELINES];
  106. char    *vtube0;
  107.  
  108. /*
  109.  * The current cursor position within the current line is kept in
  110.  * cursor.  The current line is kept in linebuf.  During insertions
  111.  * we use the auxiliary array genbuf as scratch area.
  112.  * The cursor wcursor and wdot are used in operations within/spanning
  113.  * lines to mark the other end of the affected area, or the target
  114.  * for a motion.
  115.  */
  116. char    *cursor;
  117. char    *wcursor;
  118. line    *wdot;
  119.  
  120. /*
  121.  * Undo information is saved in a LBSIZE buffer at "vutmp" for changes
  122.  * within the current line, or as for command mode for multi-line changes
  123.  * or changes on lines no longer the current line.
  124.  * The change kind "VCAPU" is used immediately after a U undo to prevent
  125.  * two successive U undo's from destroying the previous state.
  126.  */
  127. #define    VNONE    0
  128. #define    VCHNG    1
  129. #define    VMANY    2
  130. #define    VCAPU    3
  131. #define    VMCHNG    4
  132. #define    VMANYINS 5
  133.  
  134. short    vundkind;    /* Which kind of undo - from above */
  135. char    *vutmp;        /* Prev line image when "VCHNG" */
  136.  
  137. /*
  138.  * For U undo's the line is grabbed by "vmove" after it first appears
  139.  * on that line.  The "vUNDdot" which specifies which line has been
  140.  * saved is selectively cleared when changes involving other lines
  141.  * are made, i.e. after a 'J' join.  This is because a 'JU' would
  142.  * lose completely the text of the line just joined on.
  143.  */
  144. char    *vUNDcurs;    /* Cursor just before 'U' */
  145. line    *vUNDdot;    /* The line address of line saved in vUNDsav */
  146. line    vUNDsav;    /* Grabbed initial "*dot" */
  147.  
  148. #define    killU()        vUNDdot = NOLINE
  149.  
  150. /*
  151.  * There are a number of cases where special behaviour is needed
  152.  * from deeply nested routines.  This is accomplished by setting
  153.  * the bits of hold, which acts to change the state of the general
  154.  * visual editing behaviour in specific ways.
  155.  *
  156.  * HOLDAT prevents the clreol (clear to end of line) routines from
  157.  * putting out @'s or ~'s on empty lines.
  158.  *
  159.  * HOLDDOL prevents the reopen routine from putting a '$' at the
  160.  * end of a reopened line in list mode (for hardcopy mode, e.g.).
  161.  *
  162.  * HOLDROL prevents spurious blank lines when scrolling in hardcopy
  163.  * open mode.
  164.  *
  165.  * HOLDQIK prevents the fake insert mode during repeated commands.
  166.  *
  167.  * HOLDPUPD prevents updating of the physical screen image when
  168.  * mucking around while in insert mode.
  169.  *
  170.  * HOLDECH prevents clearing of the echo area while rolling the screen
  171.  * backwards (e.g.) in deference to the clearing of the area at the
  172.  * end of the scroll (1 time instead of n times).  The fact that this
  173.  * is actually needed is recorded in heldech, which says that a clear
  174.  * of the echo area was actually held off.
  175.  */
  176. short    hold;
  177. short    holdupd;        /* Hold off update when echo line is too long */
  178.  
  179. #define    HOLDAT    1
  180. #define    HOLDDOL    2
  181. #define    HOLDROL 4
  182. #define    HOLDQIK    8
  183. #define    HOLDPUPD 16
  184. #define    HOLDECH    32
  185. #define HOLDWIG 64
  186.  
  187. /*
  188.  * Miscellaneous variables
  189.  */
  190. short    CDCNT;            /* Count of ^D's in insert on this line */
  191. char    DEL[VBSIZE];        /* Last deleted text */
  192. bool    HADUP;            /* This insert line started with ^ then ^D */
  193. bool    HADZERO;        /* This insert line started with 0 then ^D */
  194. char    INS[VBSIZE];        /* Last inserted text */
  195. short    Vlines;            /* Number of file lines "before" vi command */
  196. short    Xcnt;            /* External variable holding last cmd's count */
  197. bool    Xhadcnt;        /* Last command had explicit count? */
  198. short    ZERO;
  199. short    dir;            /* Direction for search (+1 or -1) */
  200. short    doomed;            /* Disply chars right of cursor to be killed */
  201. bool    gobblebl;        /* Wrapmargin space generated nl, eat a space */
  202. bool    hadcnt;            /* (Almost) internal to vmain() */
  203. bool    heldech;        /* We owe a clear of echo area */
  204. bool    insmode;        /* Are in character insert mode */
  205. char    lastcmd[5];        /* Chars in last command */
  206. short    lastcnt;        /* Count for last command */
  207. char    *lastcp;        /* Save current command here to repeat */
  208. bool    lasthad;        /* Last command had a count? */
  209. short    lastreg;        /* Register with last command */
  210. char    *ncols['z'-'a'+1];    /* Cursor positions of marks */
  211. char    *notenam;        /* Name to be noted with change count */
  212. char    *notesgn;        /* Change count from last command */
  213. char    op;            /* Operation of current command */
  214. short    Peekkey;        /* Peek ahead key */
  215. bool    rubble;            /* Line is filthy (in hardcopy open), redraw! */
  216. short    vSCROLL;        /* Number lines to scroll on ^D/^U */
  217. char    *vglobp;        /* Untyped input (e.g. repeat insert text) */
  218. char    *vmcurs;        /* Cursor for restore after undo d), e.g. */
  219. short    vmovcol;        /* Column to try to keep on arrow keys */
  220. bool    vmoving;        /* Are trying to keep vmovcol */
  221. char    vreg;            /* Register for this command */
  222. short    wdkind;            /* Liberal/conservative words? */
  223. char    workcmd[5];        /* Temporary for lastcmd */
  224.  
  225.  
  226. /*
  227.  * Macros
  228.  */
  229. #define    INF        30000
  230. #define    LASTLINE    LINE(vcnt)
  231. #define    OVERBUF        QUOTE
  232. #define    beep        obeep
  233. #define    cindent()    ((outline - vlinfo[vcline].vliny) * WCOLS + outcol)
  234. #define    vputp(cp, cnt)    tputs(cp, cnt, vputch)
  235. #define    vputc(c)    putch(c)
  236.  
  237. /*
  238.  * Function types
  239.  */
  240. int    beep();
  241. int    qcount();
  242. int    vchange();
  243. int    vdelete();
  244. int    vgrabit();
  245. int    vinschar();
  246. int    vmove();
  247. int    vputchar();
  248. int    vshift();
  249. int    vyankit();
  250.