📄 tty.c
字号:
/* tty__getchar(): * Get the tty characters */private voidtty__getchar(td, s) struct termios *td; unsigned char *s;{ # ifdef VINTR s[C_INTR] = td->c_cc[VINTR];# endif /* VINTR */# ifdef VQUIT s[C_QUIT] = td->c_cc[VQUIT];# endif /* VQUIT */# ifdef VERASE s[C_ERASE] = td->c_cc[VERASE];# endif /* VERASE */# ifdef VKILL s[C_KILL] = td->c_cc[VKILL];# endif /* VKILL */# ifdef VEOF s[C_EOF] = td->c_cc[VEOF];# endif /* VEOF */# ifdef VEOL s[C_EOL] = td->c_cc[VEOL];# endif /* VEOL */# ifdef VEOL2 s[C_EOL2] = td->c_cc[VEOL2];# endif /* VEOL2 */# ifdef VSWTCH s[C_SWTCH] = td->c_cc[VSWTCH];# endif /* VSWTCH */# ifdef VDSWTCH s[C_DSWTCH] = td->c_cc[VDSWTCH];# endif /* VDSWTCH */# ifdef VERASE2 s[C_ERASE2] = td->c_cc[VERASE2];# endif /* VERASE2 */# ifdef VSTART s[C_START] = td->c_cc[VSTART];# endif /* VSTART */# ifdef VSTOP s[C_STOP] = td->c_cc[VSTOP];# endif /* VSTOP */# ifdef VWERASE s[C_WERASE] = td->c_cc[VWERASE];# endif /* VWERASE */# ifdef VSUSP s[C_SUSP] = td->c_cc[VSUSP];# endif /* VSUSP */# ifdef VDSUSP s[C_DSUSP] = td->c_cc[VDSUSP];# endif /* VDSUSP */# ifdef VREPRINT s[C_REPRINT]= td->c_cc[VREPRINT];# endif /* VREPRINT */# ifdef VDISCARD s[C_DISCARD]= td->c_cc[VDISCARD];# endif /* VDISCARD */# ifdef VLNEXT s[C_LNEXT] = td->c_cc[VLNEXT];# endif /* VLNEXT */# ifdef VSTATUS s[C_STATUS] = td->c_cc[VSTATUS];# endif /* VSTATUS */# ifdef VPAGE s[C_PAGE] = td->c_cc[VPAGE];# endif /* VPAGE */# ifdef VPGOFF s[C_PGOFF] = td->c_cc[VPGOFF];# endif /* VPGOFF */# ifdef VKILL2 s[C_KILL2] = td->c_cc[VKILL2];# endif /* KILL2 */# ifdef VMIN s[C_MIN] = td->c_cc[VMIN];# endif /* VMIN */# ifdef VTIME s[C_TIME] = td->c_cc[VTIME];# endif /* VTIME */} /* tty__getchar *//* tty__setchar(): * Set the tty characters */private voidtty__setchar(td, s) struct termios *td; unsigned char *s;{ # ifdef VINTR td->c_cc[VINTR] = s[C_INTR];# endif /* VINTR */# ifdef VQUIT td->c_cc[VQUIT] = s[C_QUIT];# endif /* VQUIT */# ifdef VERASE td->c_cc[VERASE] = s[C_ERASE];# endif /* VERASE */# ifdef VKILL td->c_cc[VKILL] = s[C_KILL];# endif /* VKILL */# ifdef VEOF td->c_cc[VEOF] = s[C_EOF];# endif /* VEOF */# ifdef VEOL td->c_cc[VEOL] = s[C_EOL];# endif /* VEOL */# ifdef VEOL2 td->c_cc[VEOL2] = s[C_EOL2];# endif /* VEOL2 */# ifdef VSWTCH td->c_cc[VSWTCH] = s[C_SWTCH];# endif /* VSWTCH */# ifdef VDSWTCH td->c_cc[VDSWTCH] = s[C_DSWTCH];# endif /* VDSWTCH */# ifdef VERASE2 td->c_cc[VERASE2] = s[C_ERASE2];# endif /* VERASE2 */# ifdef VSTART td->c_cc[VSTART] = s[C_START];# endif /* VSTART */# ifdef VSTOP td->c_cc[VSTOP] = s[C_STOP];# endif /* VSTOP */# ifdef VWERASE td->c_cc[VWERASE] = s[C_WERASE];# endif /* VWERASE */# ifdef VSUSP td->c_cc[VSUSP] = s[C_SUSP];# endif /* VSUSP */# ifdef VDSUSP td->c_cc[VDSUSP] = s[C_DSUSP];# endif /* VDSUSP */# ifdef VREPRINT td->c_cc[VREPRINT] = s[C_REPRINT];# endif /* VREPRINT */# ifdef VDISCARD td->c_cc[VDISCARD] = s[C_DISCARD];# endif /* VDISCARD */# ifdef VLNEXT td->c_cc[VLNEXT] = s[C_LNEXT];# endif /* VLNEXT */# ifdef VSTATUS td->c_cc[VSTATUS] = s[C_STATUS];# endif /* VSTATUS */# ifdef VPAGE td->c_cc[VPAGE] = s[C_PAGE];# endif /* VPAGE */# ifdef VPGOFF td->c_cc[VPGOFF] = s[C_PGOFF];# endif /* VPGOFF */# ifdef VKILL2 td->c_cc[VKILL2] = s[C_KILL2];# endif /* VKILL2 */# ifdef VMIN td->c_cc[VMIN] = s[C_MIN];# endif /* VMIN */# ifdef VTIME td->c_cc[VTIME] = s[C_TIME];# endif /* VTIME */} /* tty__setchar *//* tty_bind_char(): * Rebind the editline functions */protected voidtty_bind_char(el, force) EditLine *el; int force;{ unsigned char *t_n = el->el_tty.t_c[ED_IO]; unsigned char *t_o = el->el_tty.t_ed.c_cc; char new[2], old[2]; ttymap_t *tp; el_action_t *dmap, *dalt, *map, *alt; new[1] = old[1] = '\0'; map = el->el_map.key; alt = el->el_map.alt; if (el->el_map.type == MAP_VI) { dmap = el->el_map.vii; dalt = el->el_map.vic; } else { dmap = el->el_map.emacs; dalt = NULL; } for (tp = tty_map; tp->nch != -1; tp++) { new[0] = t_n[tp->nch]; old[0] = t_o[tp->och]; if (new[0] == old[0] && !force) continue; /* Put the old default binding back, and set the new binding */ key_clear(el, map, old); map[old[0]] = dmap[old[0]]; key_clear(el, map, new); /* MAP_VI == 1, MAP_EMACS == 0... */ map[new[0]] = tp->bind[el->el_map.type]; if (dalt) { key_clear(el, alt, old); alt[old[0]] = dalt[old[0]]; key_clear(el, alt, new); alt[new[0]] = tp->bind[el->el_map.type+1]; } }}/* tty_rawmode(): * Set terminal into 1 character at a time mode. */protected inttty_rawmode(el) EditLine *el;{ if (el->el_tty.t_mode == ED_IO) return (0); if (tty_getty(el, &el->el_tty.t_ts) == -1) {#ifdef DEBUG_TTY (void) fprintf(el->el_errfile, "tty_rawmode: tty_getty: %s\n", strerror(errno));#endif /* DEBUG_TTY */ return(-1); } /* * We always keep up with the eight bit setting and the speed of the * tty. But only we only believe changes that are made to cooked mode! */ el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ts); el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ts); if (tty__getspeed(&el->el_tty.t_ex) != el->el_tty.t_speed || tty__getspeed(&el->el_tty.t_ed) != el->el_tty.t_speed) { (void) cfsetispeed(&el->el_tty.t_ex, el->el_tty.t_speed); (void) cfsetospeed(&el->el_tty.t_ex, el->el_tty.t_speed); (void) cfsetispeed(&el->el_tty.t_ed, el->el_tty.t_speed); (void) cfsetospeed(&el->el_tty.t_ed, el->el_tty.t_speed); } if (tty__cooked_mode(&el->el_tty.t_ts)) { if (el->el_tty.t_ts.c_cflag != el->el_tty.t_ex.c_cflag) { el->el_tty.t_ex.c_cflag = el->el_tty.t_ts.c_cflag; el->el_tty.t_ex.c_cflag &= ~el->el_tty.t_t[EX_IO][M_CTL].t_clrmask; el->el_tty.t_ex.c_cflag |= el->el_tty.t_t[EX_IO][M_CTL].t_setmask; el->el_tty.t_ed.c_cflag = el->el_tty.t_ts.c_cflag; el->el_tty.t_ed.c_cflag &= ~el->el_tty.t_t[ED_IO][M_CTL].t_clrmask; el->el_tty.t_ed.c_cflag |= el->el_tty.t_t[ED_IO][M_CTL].t_setmask; } if ((el->el_tty.t_ts.c_lflag != el->el_tty.t_ex.c_lflag) && (el->el_tty.t_ts.c_lflag != el->el_tty.t_ed.c_lflag)) { el->el_tty.t_ex.c_lflag = el->el_tty.t_ts.c_lflag; el->el_tty.t_ex.c_lflag &= ~el->el_tty.t_t[EX_IO][M_LIN].t_clrmask; el->el_tty.t_ex.c_lflag |= el->el_tty.t_t[EX_IO][M_LIN].t_setmask; el->el_tty.t_ed.c_lflag = el->el_tty.t_ts.c_lflag; el->el_tty.t_ed.c_lflag &= ~el->el_tty.t_t[ED_IO][M_LIN].t_clrmask; el->el_tty.t_ed.c_lflag |= el->el_tty.t_t[ED_IO][M_LIN].t_setmask; } if ((el->el_tty.t_ts.c_iflag != el->el_tty.t_ex.c_iflag) && (el->el_tty.t_ts.c_iflag != el->el_tty.t_ed.c_iflag)) { el->el_tty.t_ex.c_iflag = el->el_tty.t_ts.c_iflag; el->el_tty.t_ex.c_iflag &= ~el->el_tty.t_t[EX_IO][M_INP].t_clrmask; el->el_tty.t_ex.c_iflag |= el->el_tty.t_t[EX_IO][M_INP].t_setmask; el->el_tty.t_ed.c_iflag = el->el_tty.t_ts.c_iflag; el->el_tty.t_ed.c_iflag &= ~el->el_tty.t_t[ED_IO][M_INP].t_clrmask; el->el_tty.t_ed.c_iflag |= el->el_tty.t_t[ED_IO][M_INP].t_setmask; } if ((el->el_tty.t_ts.c_oflag != el->el_tty.t_ex.c_oflag) && (el->el_tty.t_ts.c_oflag != el->el_tty.t_ed.c_oflag)) { el->el_tty.t_ex.c_oflag = el->el_tty.t_ts.c_oflag; el->el_tty.t_ex.c_oflag &= ~el->el_tty.t_t[EX_IO][M_OUT].t_clrmask; el->el_tty.t_ex.c_oflag |= el->el_tty.t_t[EX_IO][M_OUT].t_setmask; el->el_tty.t_ed.c_oflag = el->el_tty.t_ts.c_oflag; el->el_tty.t_ed.c_oflag &= ~el->el_tty.t_t[ED_IO][M_OUT].t_clrmask; el->el_tty.t_ed.c_oflag |= el->el_tty.t_t[ED_IO][M_OUT].t_setmask; } if (tty__gettabs(&el->el_tty.t_ex) == 0) el->el_tty.t_tabs = 0; else el->el_tty.t_tabs = EL_CAN_TAB ? 1 : 0; { int i; tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]); /* * Check if the user made any changes. * If he did, then propagate the changes to the * edit and execute data structures. */ for (i = 0; i < C_NCC; i++) if (el->el_tty.t_c[TS_IO][i] != el->el_tty.t_c[EX_IO][i]) break; if (i != C_NCC) { /* * Propagate changes only to the unprotected chars * that have been modified just now. */ for (i = 0; i < C_NCC; i++) { if (!((el->el_tty.t_t[ED_IO][M_CHAR].t_setmask & C_SH(i))) && (el->el_tty.t_c[TS_IO][i] != el->el_tty.t_c[EX_IO][i])) el->el_tty.t_c[ED_IO][i] = el->el_tty.t_c[TS_IO][i]; if (el->el_tty.t_t[ED_IO][M_CHAR].t_clrmask & C_SH(i)) el->el_tty.t_c[ED_IO][i] = el->el_tty.t_vdisable; } tty_bind_char(el, 0); tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]); for (i = 0; i < C_NCC; i++) { if (!((el->el_tty.t_t[EX_IO][M_CHAR].t_setmask & C_SH(i))) && (el->el_tty.t_c[TS_IO][i] != el->el_tty.t_c[EX_IO][i])) el->el_tty.t_c[EX_IO][i] = el->el_tty.t_c[TS_IO][i]; if (el->el_tty.t_t[EX_IO][M_CHAR].t_clrmask & C_SH(i)) el->el_tty.t_c[EX_IO][i] = el->el_tty.t_vdisable; } tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); } } } if (tty_setty(el, &el->el_tty.t_ed) == -1) {#ifdef DEBUG_TTY (void) fprintf(el->el_errfile, "tty_rawmode: tty_setty: %s\n", strerror(errno));#endif /* DEBUG_TTY */ return -1; } el->el_tty.t_mode = ED_IO; return (0);} /* end tty_rawmode *//* tty_cookedmode(): * Set the tty back to normal mode */protected inttty_cookedmode(el) EditLine *el;{ /* set tty in normal setup */ if (el->el_tty.t_mode == EX_IO) return (0); if (tty_setty(el, &el->el_tty.t_ex) == -1) {#ifdef DEBUG_TTY (void) fprintf(el->el_errfile, "tty_cookedmode: tty_setty: %s\n", strerror(errno));#endif /* DEBUG_TTY */ return -1; } el->el_tty.t_mode = EX_IO; return (0);} /* end tty_cookedmode *//* tty_quotemode(): * Turn on quote mode */protected inttty_quotemode(el) EditLine *el;{ if (el->el_tty.t_mode == QU_IO) return 0; el->el_tty.t_qu = el->el_tty.t_ed; el->el_tty.t_qu.c_iflag &= ~el->el_tty.t_t[QU_IO][M_INP].t_clrmask; el->el_tty.t_qu.c_iflag |= el->el_tty.t_t[QU_IO][M_INP].t_setmask; el->el_tty.t_qu.c_oflag &= ~el->el_tty.t_t[QU_IO][M_OUT].t_clrmask; el->el_tty.t_qu.c_oflag |= el->el_tty.t_t[QU_IO][M_OUT].t_setmask; el->el_tty.t_qu.c_cflag &= ~el->el_tty.t_t[QU_IO][M_CTL].t_clrmask; el->el_tty.t_qu.c_cflag |= el->el_tty.t_t[QU_IO][M_CTL].t_setmask; el->el_tty.t_qu.c_lflag &= ~el->el_tty.t_t[QU_IO][M_LIN].t_clrmask; el->el_tty.t_qu.c_lflag |= el->el_tty.t_t[QU_IO][M_LIN].t_setmask; if (tty_setty(el, &el->el_tty.t_qu) == -1) {#ifdef DEBUG_TTY (void) fprintf(el->el_errfile, "QuoteModeOn: tty_setty: %s\n", strerror(errno));#endif /* DEBUG_TTY */ return -1; } el->el_tty.t_mode = QU_IO; return 0;} /* end tty_quotemode *//* tty_noquotemode(): * Turn off quote mode */protected inttty_noquotemode(el) EditLine *el;{ if (el->el_tty.t_mode != QU_IO) return 0; if (tty_setty(el, &el->el_tty.t_ed) == -1) {#ifdef DEBUG_TTY (void) fprintf(el->el_errfile, "QuoteModeOff: tty_setty: %s\n", strerror(errno));#endif /* DEBUG_TTY */ return -1; } el->el_tty.t_mode = ED_IO; return 0;}/* tty_stty(): * Stty builtin */protected int/*ARGSUSED*/tty_stty(el, argc, argv) EditLine *el; int argc; char **argv;{ ttymodes_t *m; char x, *d; int aflag = 0; char *s; char *name; int z = EX_IO; if (argv == NULL) return -1; name = *argv++; while (argv && *argv && argv[0][0] == '-' && argv[0][2] == '\0') switch (argv[0][1]) { case 'a': aflag++; argv++; break; case 'd': argv++; z = ED_IO; break; case 'x': argv++; z = EX_IO; break; case 'q': argv++; z = QU_IO; break; default: (void) fprintf(el->el_errfile, "%s: Unknown switch `%c'.\n", name, argv[0][1]); return -1; } if (!argv || !*argv) { int i = -1; int len = 0, st = 0, cu; for (m = ttymodes; m->m_name; m++) { if (m->m_type != i) { (void) fprintf(el->el_outfile, "%s%s", i != -1 ? "\n" : "", el->el_tty.t_t[z][m->m_type].t_name); i = m->m_type; st = len = strlen(el->el_tty.t_t[z][m->m_type].t_name); } x = (el->el_tty.t_t[z][i].t_setmask & m->m_value) ? '+' : '\0'; x = (el->el_tty.t_t[z][i].t_clrmask & m->m_value) ? '-' : x; if (x != '\0' || aflag) { cu = strlen(m->m_name) + (x != '\0') + 1; if (len + cu >= el->el_term.t_size.h) { (void) fprintf(el->el_outfile, "\n%*s", st, ""); len = st + cu; } else len += cu; if (x != '\0') (void) fprintf(el->el_outfile, "%c%s ", x, m->m_name); else (void) fprintf(el->el_outfile, "%s ", m->m_name); } } (void) fprintf(el->el_outfile, "\n"); return 0; } while (argv && (s = *argv++)) { switch (*s) { case '+': case '-': x = *s++; break; default: x = '\0'; break; } d = s; for (m = ttymodes; m->m_name; m++) if (strcmp(m->m_name, d) == 0) break; if (!m->m_name) { (void) fprintf(el->el_errfile, "%s: Invalid argument `%s'.\n", name, d); return -1; } switch (x) { case '+': el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value; el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value; break; case '-': el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value; el->el_tty.t_t[z][m->m_type].t_clrmask |= m->m_value; break; default: el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value; el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value; break; } } return 0;} /* end tty_stty */#ifdef notyet/* tty_printchar(): * DEbugging routine to print the tty characters */private voidtty_printchar(el, s) EditLine *el; unsigned char *s;{ ttyperm_t *m; int i; for (i = 0; i < C_NCC; i++) { for (m = el->el_tty.t_t; m->m_name; m++) if (m->m_type == M_CHAR && C_SH(i) == m->m_value) break; if (m->m_name) (void) fprintf(el->el_errfile, "%s ^%c ", m->m_name, s[i] + 'A'-1); if (i % 5 == 0) (void) fprintf(el->el_errfile, "\n"); } (void) fprintf(el->el_errfile, "\n"); }#endif /* notyet */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -