-/* Copyright (c) 1980 Regents of the University of California */
-static char *sccsid = "@(#)ex_vops2.c 4.2 %G%";
+/* Copyright (c) 1981 Regents of the University of California */
+static char *sccsid = "@(#)ex_vops2.c 6.5 %G%";
#include "ex.h"
#include "ex_tty.h"
#include "ex_vis.h"
* and mostly, insert mode (and a subroutine
* to read an input line, including in the echo area.)
*/
-char *vUA1, *vUA2;
-char *vUD1, *vUD2;
+extern char *vUA1, *vUA2; /* mjm: extern; also in ex_vops.c */
+extern char *vUD1, *vUD2; /* mjm: extern; also in ex_vops.c */
/*
* Obleeperate characters in hardcopy
char *ogcursor;
vappend(ch, cnt, indent)
- char ch;
+ int ch; /* mjm: char --> int */
int cnt, indent;
{
register int i;
register char *gcursor;
bool escape;
- int repcnt;
+ int repcnt, savedoomed;
short oldhold = hold;
/*
if (ch == 'r' && repcnt == 0)
escape = 0;
else {
- gcursor = vgetline(repcnt, gcursor, &escape);
+ gcursor = vgetline(repcnt, gcursor, &escape, ch);
/*
* After an append, stick information
*/
if (state != HARDOPEN) {
DEPTH(vcline) = 0;
+ savedoomed = doomed;
if (doomed > 0) {
register int cind = cindent();
doomed = 0;
}
i = vreopen(LINE(vcline), lineDOT(), vcline);
+#ifdef TRACE
+ if (trace)
+ fprintf(trace, "restoring doomed from %d to %d\n", doomed, savedoomed);
+#endif
+ if (ch == 'R')
+ doomed = savedoomed;
}
/*
* are careful about the way we do this so that it is
* repeatable. (I.e. so that your kill doesn't happen,
* when you repeat an insert if it was escaped with \ the
- * first time you did it.
+ * first time you did it. commch is the command character
+ * involved, including the prompt for readline.
*/
char *
-vgetline(cnt, gcursor, aescaped)
+vgetline(cnt, gcursor, aescaped, commch)
int cnt;
register char *gcursor;
bool *aescaped;
+ char commch;
{
register int c, ch;
register char *cp;
- int x, y, iwhite;
+ int x, y, iwhite, backsl=0;
char *iglobp;
char cstr[2];
int (*OO)() = Outchar;
vprepins();
}
for (;;) {
+ backsl = 0;
if (gobblebl)
gobblebl--;
if (cnt != 0) {
c &= (QUOTE|TRIM);
ch = c;
maphopcnt = 0;
- if (vglobp == 0 && Peekkey == 0)
+ if (vglobp == 0 && Peekkey == 0 && commch != 'r')
while ((ch = map(c, immacs)) != c) {
c = ch;
if (!value(REMAP))
vcsync();
c = getkey();
#ifndef USG3TTY
- if (c == tty.sg_erase || c == tty.sg_kill) {
+ if (c == tty.sg_erase || c == tty.sg_kill)
#else
if (c == tty.c_cc[VERASE]
- || c == tty.c_cc[VKILL]) {
+ || c == tty.c_cc[VKILL])
#endif
+ {
vgoto(y, x);
if (doomed >= 0)
doomed++;
goto def;
}
ungetkey(c), c = '\\';
- goto noput;
+ backsl = 1;
+ break;
/*
* ^Q Super quote following character
gobbled = 1;
continue;
}
- if (/* c <= ' ' && */ value(WRAPMARGIN) &&
- outcol >= OCOLUMNS - value(WRAPMARGIN)) {
+ if (value(WRAPMARGIN) &&
+ (outcol >= OCOLUMNS - value(WRAPMARGIN) ||
+ backsl && outcol==0) &&
+ commch != 'r') {
/*
* At end of word and hit wrapmargin.
* Move the word to next line and keep going.
*/
wdkind = 1;
*gcursor++ = c;
+ if (backsl)
+ *gcursor++ = getkey();
*gcursor = 0;
/*
* Find end of previous word if we are past it.
*/
for (cp=gcursor; cp>ogcursor && isspace(cp[-1]); cp--)
;
- if (outcol - (gcursor-cp) >= OCOLUMNS - value(WRAPMARGIN)) {
+ if (outcol+(backsl?OCOLUMNS:0) - (gcursor-cp) >= OCOLUMNS - value(WRAPMARGIN)) {
/*
* Find beginning of previous word.
*/
continue;
}
def:
- putchar(c);
- flush();
-noput:
+ if (!backsl) {
+ int cnt;
+ putchar(c);
+ flush();
+ }
if (gcursor > &genbuf[LBSIZE - 2])
error("Line too long");
*gcursor++ = c & TRIM;