📄 ttyansi.c
字号:
} if (do_linefeed(textsw)) { (void)ttysw_setopt((caddr_t)ttysw, TTYOPT_TEXT, 0); return (0); } break; } case CTRL(K): /* explicitly NOT HANDLED */ case '\t': /* let textsw handle tab */print_char: default: if (!(!iscntrl(*addr)) && *addr != '\t' && *addr != '\n' || ttysw->ttysw_frozen) break; while ((!iscntrl(*addr) || *addr == '\t' || *addr == '\n') && len < len0 && !ttysw->ttysw_frozen) { *cp++ = *addr++; len++; if (cp == &buf[sizeof(buf) - 1]) { /* spit out what we have so far */ cp = from_pty_to_textsw(textsw, cp, buf); if (!cp) { (void)ttysw_setopt((caddr_t)ttysw, TTYOPT_TEXT, 0); return (0); } } } len--; addr--; break; } /* switch (*addr) */ } else { /* if (! TTYOPT_TEXT) */ switch (*addr) { case CTRL(G): (void)blinkscreen(); break; case '\b': pos(curscol-1, cursrow); break; case '\t': pos((curscol&-8)+8, cursrow); break; case '\n': /* linefeed */ if (ansi_lf(ttysw, addr, (len0-len)-1) == 0) goto ret; break; case CTRL(K): pos(curscol, cursrow-1); /* 4014 */ break; case '\f': if ((ttysw->ttysw_opt&(1<<TTYOPT_PAGEMODE)) && ttysw->ttysw_lpp > 1) { if (ttysw_freeze(ttysw, 1)) goto ret; }#ifdef TTYHIST if (ttysw->ttysw_opt&(1<<TTYOPT_HISTORY)) ttyhist_write(ttysw, bottom);#endif (void)ttysw_clear(ttysw); case '\r': /* pos(0,cursrow); */ curscol = 0; break; case CTRL([): state |= S_ESC; break; case DEL: /* ignored */ break; default: if (!iscntrl(*addr)) { int n; n = ansi_char(ttysw, addr, (len0-len)); addr += n; len += n; } } } /* if (TTYOPT_TEXT) */ } /* switch (state) */ } /* for (; *addr; addr++) */ret: if (ttysw_getopt((caddr_t) ttysw, TTYOPT_TEXT)) { cp = from_pty_to_textsw(textsw, cp, buf); if (!cp) { (void)ttysw_setopt((caddr_t)ttysw, TTYOPT_TEXT, 0); return (0); } } else { (void)drawCursor(cursrow, curscol); } return(len);}/* #ifndef CMDSW */voidttysw_lighten_cursor(){ (void)removeCursor(); tty_cursor |= LIGHTCURSOR; (void)restoreCursor();}ttysw_restore_cursor(){ (void)removeCursor(); tty_cursor &= ~LIGHTCURSOR; (void)restoreCursor();}static intansi_lf(ttysw, addr, len) register struct ttysubwindow *ttysw; char *addr; register int len;{ register int lfs = scrlins; extern int delaypainting; if (ttysw->ttysw_lpp >= bottom) { if (ttysw_freeze(ttysw, 1)) return (0); } if (cursrow < bottom-1) { /* pos(curscol, cursrow+1); */ cursrow++; if (ttysw->ttysw_opt&(1<<TTYOPT_PAGEMODE)) ttysw->ttysw_lpp++; if (!scrlins) /* ...clear line */ (void)deleteChar(left, right, cursrow); } else { if (delaypainting) (void)pdisplayscreen(1); if (!scrlins) { /* Just wrap to top of screen and clr line */ pos(curscol, 0); (void)deleteChar(left, right, cursrow); } else { if (lfs == 1) { /* Find pending LF's and do them all now */ register char *cp; register int left_end; for (cp = addr+1, left_end = len; left_end--; cp++) { if (*cp == '\n') lfs++; else if (*cp == '\r' || *cp >= ' ') continue; else if (*cp > '\n') break; } } if (lfs + ttysw->ttysw_lpp > bottom) lfs = bottom - ttysw->ttysw_lpp;#ifdef TTYHIST if (ttysw->ttysw_opt&(1<<TTYOPT_HISTORY)) ttyhist_write(ttysw, lfs);#endif (void)cim_scroll(lfs); if (ttysw->ttysw_opt&(1<<TTYOPT_PAGEMODE)) ttysw->ttysw_lpp++; if (lfs != 1) /* avoid upsetting <dcok> for nothing */ pos(curscol, cursrow+1-lfs); } } return (lfs);}static intansi_char(ttysw, addr, olen) struct ttysubwindow *ttysw; register unsigned char *addr; int olen;{ register int len = olen; char buf[300]; register char *cp = &buf[0]; int curscolstart = curscol; for (;;) { *cp++ = *addr; /* Update cursor position. Inline for speed. */ if (curscol < right-1) curscol++; else { /* Wrap to col 1 then pretend LF seen */ *cp = '\0'; (void)writePartialLine(buf, curscolstart); curscol = 0; (void) ansi_lf(ttysw, addr, len); return (olen - len); } if (len > 0) { if (!iscntrl(*(addr+1)) && cp < &buf[sizeof (buf) - 1]) { len--; addr++; continue; } else break; /* out of for loop */ } else break; /* out of for loop */ } *cp = '\0'; (void)writePartialLine(buf, curscolstart); return (olen - len);}/* #endif CMDSW */staticansi_escape(ttysw, c, ac, av) struct ttysubwindow *ttysw; register char c; register int ac, *av;{ register int av0, i, found = TRUE; Textsw textsw; if ((av0 = av[0]) <= 0) av0 = 1; if (!ttysw_getopt((caddr_t) ttysw, TTYOPT_TEXT)) switch (c) { case '@': (void)insertChar(curscol, curscol+av0, cursrow); break; case 'A': pos(curscol, cursrow-av0); break; case 'B': pos(curscol, cursrow+av0); break; case 'C': pos(curscol+av0, cursrow); break; case 'D': pos(curscol-av0, cursrow); break; case 'E': pos(left, cursrow+av0); break; case 'f': case 'H': if (av[1] <= 0) av[1] = 1; pos(av[1]-1, av0-1); av[1] = 1; break; case 'L': (void)insert_lines(cursrow, av0); break; case 'M': (void)delete_lines(cursrow, av0); break; case 'P': (void)deleteChar(curscol, curscol+av0, cursrow); break; case 'm': for (i = 0; i < ac; i++) { switch (av[i]) { case 0: clear_mode(); break; case 1: bold_mode(); break; case 4: underscore_mode(); break; case 7: inverse_mode(); break; case 2: case 3: case 5: case 6: case 8: case 9: { int ttysw_getboldstyle(); int boldstyle = ttysw_getboldstyle(); if (boldstyle & TTYSW_BOLD_NONE) inverse_mode(); else bold_mode(); break; } default: clear_mode(); break; } } break; case 'p': if (!fillfunc) { (void)screencomp(); fillfunc = 1-fillfunc; } break; case 'q': if (fillfunc) { (void)screencomp(); fillfunc = 1-fillfunc; } break; case 'r': scrlins = av0; break; case 's': scrlins = 1; (void)clear_mode();#ifdef TTYHIST ttyhist_flush(ttysw);#endif break; default: found = FALSE; break; } else { found = FALSE; } if (!found) switch(c) { case 'J': if (ttysw_getopt((caddr_t) ttysw, TTYOPT_TEXT)) { textsw = (Textsw)ttysw->ttysw_hist; if (erase_chars(textsw, textsw_find_mark(textsw, cmdsw->pty_mark), cmdsw->cmd_started ? textsw_find_mark(textsw, cmdsw->user_mark) - (Textsw_index) cmdsw->pty_owes_newline : (Textsw_index) textsw_get(textsw, TEXTSW_LENGTH))) { handle_escape_status = 1; } } else { (void)delete_lines(cursrow+1, bottom-(cursrow+1)); (void)deleteChar(curscol, right, cursrow); } break; case 'K': /* clear to end of line */ if (ttysw_getopt((caddr_t) ttysw, TTYOPT_TEXT)) { textsw = (Textsw)ttysw->ttysw_hist; if (erase_chars(textsw, textsw_find_mark(textsw, cmdsw->pty_mark), (Textsw_index) get_end_of_line(textsw))) { handle_escape_status = 1; } } else { (void)deleteChar(curscol, right, cursrow); } break; case 'h': { /* set mode */ int turn_on; for (i = 0; i < ac; i++) { if (av[i] > 0 && (av[i] & 0xff000000) == ('>' << 24)) { turn_on = (((av[i] & 0x00ffffff) == TTYOPT_TEXT) ? !scroll_disabled_from_menu : TRUE); if (!turn_on && scroll_disabled_from_menu) cmdsw->enable_scroll_stay_on = TRUE; (void)ttysw_setopt((caddr_t) ttysw, av[i] & 0x00ffffff, turn_on); } } } break; case 'k': /* report mode */ for (i = 0; i < ac; i++) if (av[i] > 0 && (av[i] & 0xff000000) == ('>' << 24)) { char buf[16]; (void) sprintf(buf, "\33[>%d%c", av[i] & 0x00ffffff, ttysw_getopt((caddr_t) ttysw, av[i] & 0x00ffffff) ? 'h' : 'l'); (void) ttysw_input((caddr_t) ttysw, buf, strlen(buf)); } break; case 'l': /* reset mode */ for (i = 0; i < ac; i++) if (av[i] > 0 && (av[i] & 0xff000000) == ('>' << 24)) (void)ttysw_setopt((caddr_t) ttysw, av[i] & 0x00ffffff, 0); break; default: /* X3.64 says ignore if we don't know */ return(TTY_OK); } return(TTY_DONE);}/* #ifndef CMDSW */extern voidpos(col, row) register int col, row;{ if (col >= right) col = right - 1; if (col < left) col = left; if (row >= bottom) row = bottom - 1; if (row < top) row = top; cursrow = row; curscol = col; (void)vpos(row, col);}/* #endif CMDSW *//* ARGSUSED */ttysw_clear(ttysw) Ttysw *ttysw;{ pos(left, top); (void)cim_clear(top, bottom);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -