📄 tty.c
字号:
* Get the tty characters */private voidtty__getchar(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(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(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; unsigned char new[2], old[2]; const ttymap_t *tp; el_action_t *map, *alt; const el_action_t *dmap, *dalt; 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, (char *)old); map[old[0]] = dmap[old[0]]; key_clear(el, map, (char *)new); /* MAP_VI == 1, MAP_EMACS == 0... */ map[new[0]] = tp->bind[el->el_map.type]; if (dalt) { key_clear(el, alt, (char *)old); alt[old[0]] = dalt[old[0]]; key_clear(el, alt, (char *)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(EditLine *el){ if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO) return (0); if (el->el_flags & EDIT_DISABLED) 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][MD_CTL].t_clrmask; el->el_tty.t_ex.c_cflag |= el->el_tty.t_t[EX_IO][MD_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][MD_CTL].t_clrmask; el->el_tty.t_ed.c_cflag |= el->el_tty.t_t[ED_IO][MD_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][MD_LIN].t_clrmask; el->el_tty.t_ex.c_lflag |= el->el_tty.t_t[EX_IO][MD_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][MD_LIN].t_clrmask; el->el_tty.t_ed.c_lflag |= el->el_tty.t_t[ED_IO][MD_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][MD_INP].t_clrmask; el->el_tty.t_ex.c_iflag |= el->el_tty.t_t[EX_IO][MD_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][MD_INP].t_clrmask; el->el_tty.t_ed.c_iflag |= el->el_tty.t_t[ED_IO][MD_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][MD_OUT].t_clrmask; el->el_tty.t_ex.c_oflag |= el->el_tty.t_t[EX_IO][MD_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][MD_OUT].t_clrmask; el->el_tty.t_ed.c_oflag |= el->el_tty.t_t[ED_IO][MD_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][MD_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][MD_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][MD_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][MD_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);}/* tty_cookedmode(): * Set the tty back to normal mode */protected inttty_cookedmode(EditLine *el){ /* set tty in normal setup */ if (el->el_tty.t_mode == EX_IO) return (0); if (el->el_flags & EDIT_DISABLED) 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);}/* tty_quotemode(): * Turn on quote mode */protected inttty_quotemode(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][MD_INP].t_clrmask; el->el_tty.t_qu.c_iflag |= el->el_tty.t_t[QU_IO][MD_INP].t_setmask; el->el_tty.t_qu.c_oflag &= ~el->el_tty.t_t[QU_IO][MD_OUT].t_clrmask; el->el_tty.t_qu.c_oflag |= el->el_tty.t_t[QU_IO][MD_OUT].t_setmask; el->el_tty.t_qu.c_cflag &= ~el->el_tty.t_t[QU_IO][MD_CTL].t_clrmask; el->el_tty.t_qu.c_cflag |= el->el_tty.t_t[QU_IO][MD_CTL].t_setmask; el->el_tty.t_qu.c_lflag &= ~el->el_tty.t_t[QU_IO][MD_LIN].t_clrmask; el->el_tty.t_qu.c_lflag |= el->el_tty.t_t[QU_IO][MD_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);}/* tty_noquotemode(): * Turn off quote mode */protected inttty_noquotemode(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(EditLine *el, int argc, const char **argv){ const ttymodes_t *m; char x; int aflag = 0; const char *s, *d; const 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);}#ifdef notyet/* tty_printchar(): * DEbugging routine to print the tty characters */private voidtty_printchar(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 == MD_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 + -