c_colon() { char oldterse = terse; char buf[512]; setterse(0); wwputc(':', cmdwin); wwgets(buf, wwncol - 3, cmdwin); wwputc('\n', cmdwin); wwcurtowin(cmdwin); setterse(oldterse); if (dolongcmd(buf, (struct value *)0, 0) < 0) error("Out of memory."); }
struct ww * getwin(void) { int c; struct ww *w = 0; if (!terse) wwputs("Which window? ", cmdwin); wwcurtowin(cmdwin); while ((c = wwgetc()) < 0) wwiomux(); if (debug && c == 'c') w = cmdwin; else if (debug && c == 'f') w = framewin; else if (debug && c == 'b') w = boxwin; else if (c >= '1' && c < NWINDOW + '1') w = window[c - '1']; else if (c == '+') w = selwin; else if (c == '-') w = lastselwin; if (w == 0) wwbell(); if (!terse) wwputc('\n', cmdwin); return w; }
void c_quit(void) { char oldterse = terse; setterse(0); wwputs("Really quit [yn]? ", cmdwin); wwcurtowin(cmdwin); while (wwpeekc() < 0) wwiomux(); if (wwgetc() == 'y') { wwputs("Yes", cmdwin); quit++; } else wwputc('\n', cmdwin); setterse(!quit && oldterse); }
int help_print(struct ww *w, const char *name, const char **list) { wwprintf(w, "%s:\n\n", name); while (*list) switch (more(w, 0)) { case 0: wwputs(*list++, w); wwputc('\n', w); break; case 1: wwprintf(w, "%s: (continued)\n\n", name); break; case 2: return -1; } return more(w, 1) == 2 ? -1 : 0; }
/* * Window size. */ void c_size(struct ww *w) { int col, row; if (!terse) wwputs("New window size (lower right corner): ", cmdwin); col = MIN(w->ww_w.r, wwncol) - 1; row = MIN(w->ww_w.b, wwnrow) - 1; wwadd(boxwin, framewin->ww_back); for (;;) { wwbox(boxwin, w->ww_w.t - 1, w->ww_w.l - 1, row - w->ww_w.t + 3, col - w->ww_w.l + 3); wwsetcursor(row, col); while (wwpeekc() < 0) wwiomux(); switch (getpos(&row, &col, w->ww_w.t, w->ww_w.l, wwnrow - 1, wwncol - 1)) { case 3: wwunbox(boxwin); wwdelete(boxwin); return; case 2: wwunbox(boxwin); break; case 1: wwunbox(boxwin); case 0: continue; } break; } wwdelete(boxwin); if (!terse) wwputc('\n', cmdwin); wwcurtowin(cmdwin); sizewin(w, row - w->ww_w.t + 1, col - w->ww_w.l + 1); }
void verror(const char *fmt, va_list ap) { struct context *x; struct ww *w; for (x = &cx; x != 0 && x->x_type != X_FILE; x = x->x_link) ; if (x == 0) { if (terse) wwbell(); else { wwvprintf(cmdwin, fmt, ap); wwputs(" ", cmdwin); } return; } if (x->x_noerr) return; if ((w = x->x_errwin) == 0) { char buf[512]; (void) snprintf(buf, sizeof(buf), "Errors from %s", x->x_filename); if ((w = x->x_errwin = openiwin(ERRLINES, buf)) == 0) { wwputs("Can't open error window. ", cmdwin); x->x_noerr = 1; return; } } if (more(w, 0) == 2) { x->x_noerr = 1; return; } wwprintf(w, "line %d: ", x->x_lineno); wwvprintf(w, fmt, ap); wwputc('\n', w); }
c_debug() { register struct ww *w; if (!terse) wwputs("[m(smap) n(ns) o(os) s(string) v(nvis) w(win)]? ", cmdwin); wwcurtowin(cmdwin); while (wwpeekc() < 0) wwiomux(); if (!terse) wwputc('\n', cmdwin); switch (wwgetc()) { case 'm': wwdumpsmap(); break; case 'n': wwdumpns(); break; case 'o': wwdumpos(); break; case 's': debug_str(); break; case 'v': if ((w = getwin()) != 0) wwdumpnvis(w); break; case 'w': if ((w = getwin()) != 0) wwdumpwin(w); break; default: wwbell(); } }
void c_yank(void) { struct ww *w = selwin; int col1, row1; int col2, row2; int r, c; if (!terse) wwputs("Yank starting position: ", cmdwin); wwcursor(w, 0); row1 = w->ww_cur.r; col1 = w->ww_cur.c; for (;;) { wwsetcursor(row1, col1); while (wwpeekc() < 0) wwiomux(); switch (getpos(&row1, &col1, w->ww_i.t, w->ww_i.l, w->ww_i.b - 1, w->ww_i.r - 1)) { case 3: goto out; case 2: break; case 1: case 0: continue; } break; } if (!terse) wwputs("\nYank ending position: ", cmdwin); row2 = row1; col2 = col1; for (;;) { wwsetcursor(row2, col2); while (wwpeekc() < 0) wwiomux(); r = row2; c = col2; switch (getpos(&row2, &col2, w->ww_i.t, w->ww_i.l, w->ww_i.b - 1, w->ww_i.r - 1)) { case 3: yank_highlight(row1, col1, r, c); goto out; case 2: break; case 1: yank_highlight(row1, col1, r, c); yank_highlight(row1, col1, row2, col2); case 0: continue; } break; } if (row2 < row1 || (row2 == row1 && col2 < col1)) { r = row1; c = col1; row1 = row2; col1 = col2; row2 = r; col2 = c; } unyank(); c = col1; for (r = row1; r < row2; r++) { yank_line(r, c, w->ww_b.r); c = w->ww_b.l; } yank_line(r, c, col2); yank_highlight(row1, col1, row2, col2); if (!terse) wwputc('\n', cmdwin); out: wwcursor(w, 1); }
void docmd(void) { int c; struct ww *w; char out = 0; while (!out && !quit) { if ((c = wwgetc()) < 0) { if (terse) wwsetcursor(0, 0); else { wwputs("Command: ", cmdwin); wwcurtowin(cmdwin); } do wwiomux(); while ((c = wwgetc()) < 0); } if (!terse) wwputc('\n', cmdwin); switch (c) { default: if (c != escapec) break; case 'h': case 'j': case 'k': case 'l': case 'y': case 'p': case ctrl('y'): case ctrl('e'): case ctrl('u'): case ctrl('d'): case ctrl('b'): case ctrl('f'): case ctrl('s'): case ctrl('q'): case ctrl('['): if (selwin == 0) { error("No window."); continue; } } switch (c) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if ((w = window[c - '1']) == 0) { error("%c: No such window.", c); break; } setselwin(w); if (checkproc(selwin) >= 0) out = 1; break; case '%': if ((w = getwin()) != 0) setselwin(w); break; case ctrl('^'): if (lastselwin != 0) { setselwin(lastselwin); if (checkproc(selwin) >= 0) out = 1; } else error("No previous window."); break; case 'c': if ((w = getwin()) != 0) closewin(w); break; case 'w': c_window(); break; case 'm': if ((w = getwin()) != 0) c_move(w); break; case 'M': if ((w = getwin()) != 0) movewin(w, w->ww_alt.t, w->ww_alt.l); break; case 's': if ((w = getwin()) != 0) c_size(w); break; case 'S': if ((w = getwin()) != 0) sizewin(w, w->ww_alt.nr, w->ww_alt.nc); break; case 'y': c_yank(); break; case 'p': c_put(); break; case ':': c_colon(); break; case 'h': (void) wwwrite(selwin, "\b", 1); break; case 'j': (void) wwwrite(selwin, "\n", 1); break; case 'k': (void) wwwrite(selwin, "\033A", 2); break; case 'l': (void) wwwrite(selwin, "\033C", 2); break; case ctrl('e'): wwscroll(selwin, 1); break; case ctrl('y'): wwscroll(selwin, -1); break; case ctrl('d'): wwscroll(selwin, selwin->ww_w.nr / 2); break; case ctrl('u'): wwscroll(selwin, - selwin->ww_w.nr / 2); break; case ctrl('f'): wwscroll(selwin, selwin->ww_w.nr); break; case ctrl('b'): wwscroll(selwin, - selwin->ww_w.nr); break; case ctrl('s'): stopwin(selwin); break; case ctrl('q'): startwin(selwin); break; case ctrl('l'): wwredraw(); break; case '?': c_help(); break; case ctrl('['): if (checkproc(selwin) >= 0) out = 1; break; case ctrl('z'): wwsuspend(); break; case 'q': c_quit(); break; /* debugging stuff */ case '&': if (debug) { c_debug(); break; } default: if (c == escapec) { if (checkproc(selwin) >= 0) { (void) write(selwin->ww_pty, &escapec, 1); out = 1; } } else { if (!terse) wwbell(); error("Type ? for help."); } } } if (!quit) setcmd(0); }
c_window() { int col, row, xcol, xrow; int id; if ((id = findid()) < 0) return; if (!terse) wwputs("New window (upper left corner): ", cmdwin); col = 0; row = 1; wwadd(boxwin, framewin->ww_back); for (;;) { wwbox(boxwin, row - 1, col - 1, 3, 3); wwsetcursor(row, col); while (wwpeekc() < 0) wwiomux(); switch (getpos(&row, &col, row > 1, 0, wwnrow - 1, wwncol - 1)) { case 3: wwunbox(boxwin); wwdelete(boxwin); return; case 2: wwunbox(boxwin); break; case 1: wwunbox(boxwin); case 0: continue; } break; } if (!terse) wwputs("\nNew window (lower right corner): ", cmdwin); xcol = col; xrow = row; for (;;) { wwbox(boxwin, row - 1, col - 1, xrow - row + 3, xcol - col + 3); wwsetcursor(xrow, xcol); wwflush(); while (wwpeekc() < 0) wwiomux(); switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1)) { case 3: wwunbox(boxwin); wwdelete(boxwin); return; case 2: wwunbox(boxwin); break; case 1: wwunbox(boxwin); case 0: continue; } break; } wwdelete(boxwin); if (!terse) wwputc('\n', cmdwin); wwcurtowin(cmdwin); (void) openwin(id, row, col, xrow-row+1, xcol-col+1, nbufline, (char *) 0, 1, 1, shellfile, shell); }