/* Copyright (c) 1979 Regents of the University of California */
* Entry points to open and visual from command mode processor.
* The open/visual code breaks down roughly as follows:
* ex_v.c entry points, checking of terminal characteristics
* ex_vadj.c logical screen control, use of intelligent operations
* insert/delete line and coordination with screen image;
* updating of screen after changes.
* ex_vget.c input of single keys and reading of input lines
* from the echo area, handling of \ escapes on input for
* uppercase only terminals, handling of memory for repeated
* commands and small saved texts from inserts and partline
* deletes, notification of multi line changes in the echo
* ex_vmain.c main command decoding, some command processing.
* ex_voperate.c decoding of operator/operand sequences and
* contextual scans, implementation of word motions.
* ex_vops.c major operator interfaces, undos, motions, deletes,
* changes, opening new lines, shifts, replacements and yanks
* coordinating logical and physical changes.
* ex_vops2.c subroutines for operator interfaces in ex_vops.c,
* insert mode, read input line processing at lowest level.
* ex_vops3.c structured motion definitions of ( ) { } and [ ] operators,
* indent for lisp routines, () and {} balancing.
* ex_vput.c output routines, clearing, physical mapping of logical cursor
* positioning, cursor motions, handling of insert character
* and delete character functions of intelligent and unintelligent
* terminals, visual mode tracing routines (for debugging),
* control of screen image and its updating.
* ex_vwind.c window level control of display, forward and backward rolls,
* absolute motions, contextual displays, line depth determination
char atube
[TUBESIZE
+ LBSIZE
];
ignore(compile(getchar(), 1));
if (execute(0, dot
) == 0)
error("Fail|Pattern not found on addressed line");
if (ic
> linebuf
&& *ic
== 0)
* If overstrike then have to HARDOPEN
* else if can move cursor up off current line can use CRTOPEN (~~vi1)
* otherwise (ugh) have to use ONEOPEN (like adm3)
* To avoid bombing on glass-crt's when the line is too long
* pretend that such terminals are 160 columns wide.
* If a line is too wide for display, we will dynamically
* switch to hardcopy open mode.
outline
= destline
= WBOT
;
error("Can't use open/visual unless open option is set");
error("Recursive open/visual not allowed");
char atube
[TUBESIZE
+ LBSIZE
];
if (!CA
&& UP
== NOSTR
) {
merror("[Using open mode]");
error("Visual needs addressible cursor or upline capability");
error("Can't use visual on a terminal which overstrikes");
error("Visual requires clear screen capability");
if (any(peekchar(), "+-^."))
vsetsiz(isdigit(peekchar()) ? getnum() : value(WINDOW
));
* Hack to allow entry to visual with
* empty buffer since routines internally
* demand at least one line.
register bool ochng
= chng
;
} else if (addr2
== zero
)
* Save lines before visual between unddol and truedol.
* Accomplish this by throwing away current [unddol,truedol]
* and then saving all the lines in the buffer and moving
* unddol back to dol. Don't do this if in a global.
* at some point, and then quit from the visual and undo
* you get the old file back. Somewhat weird.
* Restore a sensible state after a visual/open, moving the saved
* stuff back to [unddol,dol], and killing the partial line kill indicators.
* Set the window parameters based on the base state bastate
* and the available buffer space.
basWTOP
= WTOP
= WBOT
= WECHO
= 0;
ZERO
= LINES
- TUBESIZE
/ WCOLS
;
error("Screen too large for internal buffer");
WTOP
= basWTOP
; WBOT
= LINES
- 2; WECHO
= LINES
- 1;
basWLINES
= WLINES
= WBOT
- WTOP
+ 1;
* Can we hack an open/visual on this terminal?
* If so, then divide the screen buffer up into lines,
* and initialize a bunch of state variables before we start.
serror("Don't know enough about your terminal to use %s", Command
);
error("Terminal too wide");
if (WLINES
>= TUBELINES
|| WCOLS
* (WECHO
- ZERO
+ 1) > TUBESIZE
)
error("Screen too large");
vclrbyte(atube
, WCOLS
* (WECHO
- ZERO
+ 1));
for (i
= 0; i
< ZERO
; i
++)
vtube
[i
] = (char *) -20000;
vtube
[i
] = atube
, atube
+= WCOLS
;
for (; i
< TUBELINES
; i
++)
vtube
[i
] = (char *) -20000;
* Set the size of the screen to size lines, to take effect the
* next time the screen is redrawn.
basWLINES
= WBOT
- b
+ 1;