* Bill Joy UCB September 1977
int delete(), join(), vshift();
char hadcnt
, first
, *oglobp
;
extern char Peekkey
, *genindent();
int (*OP
)(), ind
, vmunddot
, *addr
;
wcursor
= vfindcol(vmovcol
);
if (digit(peekkey()) && peekkey() != '0') {
if (HSTR
&& HSTR
[0] == c
&& HSTR
[1] == 0)
if (UPLINE
&& UPLINE
[0] == c
&& UPLINE
[1] == 0)
case ESCAPE
: /* cancel command */
case '.': /* repeat change */
vglobp
= vscandir
[0] == '/' ? "?" : "/";
case 'n': /* next line matching */
case 'H': /* home cursor */
case '-': /* back up (to first white) */
case 'k': /* up line same column */
vmovcol
= column(cursor
);
if (cnt
> vcline
|| !visual
) {
else if (c
!= letter(c
)) {
for (addr
= one
; addr
<= dol
; addr
++)
if (names
[c
-'a'] == (*addr
&~ 01))
if (cnt
< 1 || cnt
> dol
- zero
) {
names
[c
-'a'] = (*dot
&~ 01);
case CTRL(d
): /* scroll half-screen */
case '+': /* next line, first non-white */
case 'j': /* down line respecting position */
vmovcol
= column(cursor
);
ind
=- cnt
- (dol
- dot
);
if (c
!= CTRL(d
) && cnt
<= i
) {
if (!visual
|| vfit(cnt
, dot
) > LINES
) {
if (c
== CTRL(d
) && VLINES
!= LINES
) {
if (!visual
&& cnt
<= TUBELINES
)
if (cnt
> vcnt
- vcline
) {
case '\\': /* delete line */
if (cnt
> vcnt
- vcline
) {
for (i
= 0; i
< cnt
; i
++)
error("No lines in buffer");
c
= vcline
? vliny
[vcline
- 1] : ZERO
;
case 'J': /* join lines */
if (cnt
> TUBELINES
|| dot
== dol
||
copy(vulines
, dot
, cnt
* sizeof vulines
[0]);
cursor
= strend(linebuf
);
velide(cnt
- 1, vcline
+ 1);
if (!*cursor
&& cursor
> linebuf
)
if (cnt
> vcnt
- vcline
) {
copy(vulines
, dot
, cnt
* sizeof vulines
[0]);
case 'S': /* replace lines */
if (cnt
> vcnt
- vcline
) {
for (i
= 0; i
< cnt
; i
++)
case 'O': /* open new lines above */
case 'o': /* open new lines below */
c
= vcline
< 0 ? ZERO
: vliny
[vcline
] + vdepth();
i
= vliny
[vcline
+ 1] - c
;
vgotoCL(column(cursor
- 1));
case FS
: /* quit gets you out like a q */
c = vreopen(vliny[vcline], dot - zero);
vsync(vliny[vcline] + c);
ungetkey(c
== 'p' ? 'a' : 'i');
copy(vulines
, vylines
, vyancnt
* sizeof vylines
[0]);
append(vrestore
, vresaddr
- 1);
dot
= vresaddr
+ vrescnt
;
copy(vulines
, dot
, vdelcnt
* sizeof vulines
[0]);
vremote(vdelcnt
, delete);
/* buffer can't be empty */
if (!visual
|| cnt
< 0 || cnt
> vcnt
) {
vlast
= vliny
[vcline
] + vdepth();
error("Internal error: vmain undo@- please tell someone");
c
= vreopen(vliny
[vcline
], dot
- zero
);
vsync(vliny
[vcline
] + c
);
i
= LINES
- 1 - vliny
[vcnt
];
if (!INS
[0] || INS
[0] == OVERBUF
) {
vgetline(0, genbuf
+ 1, &hadcnt
);
if (genbuf
[0] == 0 || Peekkey
== DELETE
||
if (genbuf[0] != '/' && genbuf[0] != '?')
error("Search delimiter must be / or ?");
if (!visual
|| c
!= 'v' && c
!= 'z')
error("Extra chars|Extra characters after search pattern");
addr
= scanfor(genbuf
[0]);
c
= vcline
+ (addr
- dot
);
if (vch
== -1 && CA
&& c
>= 0 && c
< vcnt
) {
copy(vylines
, dot
, cnt
* sizeof vylines
[0]);
cnt
=* 10, cnt
=+ c
- '0';
for (cp
= linebuf
; *cp
&& vcntcol
< i
; cp
++)
if (strcmp(linebuf
, genbuf
) == 0)
for (lp
= linebuf
, gp
= genbuf
; *lp
&& *gp
&& *lp
== *gp
; lp
++, gp
++)
return (lp
> linebuf
? lp
- 1 : lp
);
return (vskipwh(linebuf
));
getline(vulines
[vresCNT
]);