/* * Delete operator. * * Hard case of deleting a range where both wcursor and wdot * are specified is treated as a special case of change and handled * by vchange (although vchange may pass it back if it degenerates * to a full line range delete.) */ void vdelete(int c) { register char *cp; register int i; if (wdot) { if (wcursor) { vchange(EOF); return; } if ((i = xdw()) < 0) return; if (state != VISUAL) { vgoto(LINE(0), 0); vputchar('@'); } wdot = dot; vremote(i, delete, 0); notenam = "delete"; DEL[0] = 0; killU(); vreplace(vcline, i, 0); if (wdot > dol) vcline--; vrepaint(NOSTR); return; } if (wcursor < linebuf) wcursor = linebuf; if (cursor == wcursor) { beep(); return; } i = vdcMID(); cp = cursor; setDEL(); CP(cp, wcursor); if (cp > linebuf && (cp[0] == 0 || c == '#')) cp--; if (state == HARDOPEN) { bleep(i, cp); cursor = cp; return; } physdc(column(cursor + skipleft(linebuf, cursor)), i); DEPTH(vcline) = 0; vreopen(LINE(vcline), lineDOT(), vcline); vsyncCL(); vsetcurs(cp); }
/*ARGSUSED*/ void vmove(int unused) { register int cnt; if (wdot) { if (wdot < one || wdot > dol) { beep(); return; } cnt = wdot - dot; wdot = NOLINE; if (cnt) killU(); vupdown(cnt, wcursor); return; } /* * When we move onto a new line, save information for U undo. */ if (vUNDdot != dot) { vUNDsav = *dot; vUNDcurs = wcursor; vUNDdot = dot; } /* * In hardcopy open, type characters to left of cursor * on new line, or back cursor up if its to left of where we are. * In any case if the current line is ``rubbled'' i.e. has trashy * looking overstrikes on it or \'s from deletes, we reprint * so it is more comprehensible (and also because we can't work * if we let it get more out of sync since column() won't work right. */ if (state == HARDOPEN) { register char *cp; if (rubble) { register int c; int oldhold = hold; sethard(); cp = wcursor; c = *cp; *cp = 0; hold |= HOLDDOL; vreopen(WTOP, lineDOT(), vcline); hold = oldhold; *cp = c; } else if (wcursor > cursor) { vfixcurs(); for (cp = cursor; *cp && cp < wcursor;) { int c, n; nextc(c, cp, n); cp += n; c &= TRIM; putchar(c ? c : ' '); } } } vsetcurs(wcursor); }
/* * Fix the cursor to be positioned in the correct place * to accept a command. */ void vfixcurs(void) { vsetcurs(cursor); }