📄 terminal.c
字号:
/* If we are scrolling down, delete AMOUNT lines at END. Then insert AMOUNT lines at START. */ if (amount > 0) { terminal_delete_lines (end, amount); terminal_insert_lines (start, amount); } /* If we are scrolling up, delete AMOUNT lines before START. This actually does the upwards scroll. Then, insert AMOUNT lines after the already scrolled region (i.e., END - AMOUNT). */ if (amount < 0) { int abs_amount = -amount; terminal_delete_lines (start - abs_amount, abs_amount); terminal_insert_lines (end - abs_amount, abs_amount); } }}/* Re-initialize the terminal considering that the TERM/TERMCAP variable has changed. */voidterminal_new_terminal (terminal_name) char *terminal_name;{ if (terminal_new_terminal_hook) (*terminal_new_terminal_hook) (terminal_name); else { terminal_initialize_terminal (terminal_name); }}/* Set the global variables SCREENWIDTH and SCREENHEIGHT. */voidterminal_get_screen_size (){ if (terminal_get_screen_size_hook) (*terminal_get_screen_size_hook) (); else { screenwidth = screenheight = 0;#if defined (TIOCGWINSZ) { struct winsize window_size; if (ioctl (fileno (stdout), TIOCGWINSZ, &window_size) == 0) { screenwidth = (int) window_size.ws_col; screenheight = (int) window_size.ws_row; } }#endif /* TIOCGWINSZ */ /* Environment variable COLUMNS overrides setting of "co". */ if (screenwidth <= 0) { char *sw = getenv ("COLUMNS"); if (sw) screenwidth = atoi (sw); if (screenwidth <= 0) screenwidth = tgetnum ("co"); } /* Environment variable LINES overrides setting of "li". */ if (screenheight <= 0) { char *sh = getenv ("LINES"); if (sh) screenheight = atoi (sh); if (screenheight <= 0) screenheight = tgetnum ("li"); } /* If all else fails, default to 80x24 terminal. */ if (screenwidth <= 0) screenwidth = 80; if (screenheight <= 0) screenheight = 24; }}/* Initialize the terminal which is known as TERMINAL_NAME. If this terminal doesn't have cursor addressability, `terminal_is_dumb_p' becomes nonzero. The variables SCREENHEIGHT and SCREENWIDTH are set to the dimensions that this terminal actually has. The variable TERMINAL_HAS_META_P becomes nonzero if this terminal supports a Meta key. Finally, the terminal screen is cleared. */voidterminal_initialize_terminal (terminal_name) char *terminal_name;{ char *term, *buffer; terminal_is_dumb_p = 0; if (terminal_initialize_terminal_hook) { (*terminal_initialize_terminal_hook) (terminal_name); return; } term = terminal_name ? terminal_name : getenv ("TERM"); if (!term_string_buffer) term_string_buffer = (char *)xmalloc (2048); if (!term_buffer) term_buffer = (char *)xmalloc (2048); buffer = term_string_buffer; term_clrpag = term_cr = term_clreol = (char *)NULL; if (!term) term = "dumb"; if (tgetent (term_buffer, term) <= 0) { terminal_is_dumb_p = 1; screenwidth = 80; screenheight = 24; term_cr = "\r"; term_up = term_dn = audible_bell = visible_bell = (char *)NULL; term_ku = term_kd = term_kl = term_kr = (char *)NULL; term_kP = term_kN = (char *)NULL; return; } BC = tgetstr ("pc", &buffer); PC = BC ? *BC : 0;#if defined (TIOCGETP) { struct sgttyb sg; if (ioctl (fileno (stdout), TIOCGETP, &sg) != -1) ospeed = sg.sg_ospeed; else ospeed = B9600; }#else ospeed = B9600;#endif /* !TIOCGETP */ term_cr = tgetstr ("cr", &buffer); term_clreol = tgetstr ("ce", &buffer); term_clrpag = tgetstr ("cl", &buffer); term_goto = tgetstr ("cm", &buffer); /* Find out about this terminals scrolling capability. */ term_AL = tgetstr ("AL", &buffer); term_DL = tgetstr ("DL", &buffer); term_al = tgetstr ("al", &buffer); term_dl = tgetstr ("dl", &buffer); terminal_can_scroll = ((term_AL || term_al) && (term_DL || term_dl)); term_invbeg = tgetstr ("mr", &buffer); if (term_invbeg) term_invend = tgetstr ("me", &buffer); else term_invend = (char *)NULL; if (!term_cr) term_cr = "\r"; terminal_get_screen_size (); term_up = tgetstr ("up", &buffer); term_dn = tgetstr ("dn", &buffer); visible_bell = tgetstr ("vb", &buffer); terminal_has_visible_bell_p = (visible_bell != (char *)NULL); audible_bell = tgetstr ("bl", &buffer); if (!audible_bell) audible_bell = "\007"; term_begin_use = tgetstr ("ti", &buffer); term_end_use = tgetstr ("te", &buffer); term_keypad_on = tgetstr ("ks", &buffer); term_keypad_off = tgetstr ("ke", &buffer); /* Check to see if this terminal has a meta key. */ terminal_has_meta_p = (tgetflag ("km") || tgetflag ("MT")); if (terminal_has_meta_p) { term_mm = tgetstr ("mm", &buffer); term_mo = tgetstr ("mo", &buffer); } else { term_mm = (char *)NULL; term_mo = (char *)NULL; } /* Attempt to find the arrow keys. */ term_ku = tgetstr ("ku", &buffer); term_kd = tgetstr ("kd", &buffer); term_kr = tgetstr ("kr", &buffer); term_kl = tgetstr ("kl", &buffer); term_kP = tgetstr ("kP", &buffer); term_kN = tgetstr ("kN", &buffer); /* If this terminal is not cursor addressable, then it is really dumb. */ if (!term_goto) terminal_is_dumb_p = 1;}/* **************************************************************** *//* *//* How to Read Characters From the Terminal *//* *//* **************************************************************** */#if defined (TIOCGETC)/* A buffer containing the terminal interrupt characters upon entry to Info. */struct tchars original_tchars;#endif#if defined (TIOCGLTC)/* A buffer containing the local terminal mode characters upon entry to Info. */struct ltchars original_ltchars;#endif#if defined (HAVE_TERMIOS_H)struct termios original_termios, ttybuff;#else# if defined (HAVE_TERMIO_H)/* A buffer containing the terminal mode flags upon entry to info. */struct termio original_termio, ttybuff;# else /* !HAVE_TERMIO_H *//* Buffers containing the terminal mode flags upon entry to info. */int original_tty_flags = 0;int original_lmode;struct sgttyb ttybuff;# endif /* !HAVE_TERMIO_H */#endif /* !HAVE_TERMIOS_H *//* Prepare to start using the terminal to read characters singly. */voidterminal_prep_terminal (){ int tty; if (terminal_prep_terminal_hook) { (*terminal_prep_terminal_hook) (); return; } terminal_begin_using_terminal (); tty = fileno (stdin);#if defined (HAVE_TERMIOS_H) tcgetattr (tty, &original_termios); tcgetattr (tty, &ttybuff);#else# if defined (HAVE_TERMIO_H) ioctl (tty, TCGETA, &original_termio); ioctl (tty, TCGETA, &ttybuff);# endif#endif#if defined (HAVE_TERMIOS_H) || defined (HAVE_TERMIO_H) ttybuff.c_iflag &= (~ISTRIP & ~INLCR & ~IGNCR & ~ICRNL & ~IXON);/* These output flags are not part of POSIX, so only use them if they are defined. */#ifdef ONLCR ttybuff.c_oflag &= ~ONLCR ;#endif#ifdef OCRNL ttybuff.c_oflag &= ~OCRNL;#endif ttybuff.c_lflag &= (~ICANON & ~ECHO); ttybuff.c_cc[VMIN] = 1; ttybuff.c_cc[VTIME] = 0; if (ttybuff.c_cc[VINTR] == '\177') ttybuff.c_cc[VINTR] = -1; if (ttybuff.c_cc[VQUIT] == '\177') ttybuff.c_cc[VQUIT] = -1;#ifdef VLNEXT if (ttybuff.c_cc[VLNEXT] == '\026') ttybuff.c_cc[VLNEXT] = -1;#endif /* VLNEXT */#endif /* TERMIOS or TERMIO */#if defined (HAVE_TERMIOS_H) tcsetattr (tty, TCSANOW, &ttybuff);#else# if defined (HAVE_TERMIO_H) ioctl (tty, TCSETA, &ttybuff);# endif#endif#if !defined (HAVE_TERMIOS_H) && !defined (HAVE_TERMIO_H) ioctl (tty, TIOCGETP, &ttybuff); if (!original_tty_flags) original_tty_flags = ttybuff.sg_flags; /* Make this terminal pass 8 bits around while we are using it. */# if defined (PASS8) ttybuff.sg_flags |= PASS8;# endif /* PASS8 */# if defined (TIOCLGET) && defined (LPASS8) { int flags; ioctl (tty, TIOCLGET, &flags); original_lmode = flags; flags |= LPASS8; ioctl (tty, TIOCLSET, &flags); }# endif /* TIOCLGET && LPASS8 */# if defined (TIOCGETC) { struct tchars temp; ioctl (tty, TIOCGETC, &original_tchars); temp = original_tchars; /* C-s and C-q. */ temp.t_startc = temp.t_stopc = -1; /* Often set to C-d. */ temp.t_eofc = -1; /* If the a quit or interrupt character conflicts with one of our commands, then make it go away. */ if (temp.t_intrc == '\177') temp.t_intrc = -1; if (temp.t_quitc == '\177') temp.t_quitc = -1; ioctl (tty, TIOCSETC, &temp); }# endif /* TIOCGETC */# if defined (TIOCGLTC) { struct ltchars temp; ioctl (tty, TIOCGLTC, &original_ltchars); temp = original_ltchars; /* Make the interrupt keys go away. Just enough to make people happy. */ temp.t_lnextc = -1; /* C-v. */ temp.t_dsuspc = -1; /* C-y. */ temp.t_flushc = -1; /* C-o. */ ioctl (tty, TIOCSLTC, &temp); }# endif /* TIOCGLTC */ ttybuff.sg_flags &= ~ECHO; ttybuff.sg_flags |= CBREAK; ioctl (tty, TIOCSETN, &ttybuff);#endif /* !HAVE_TERMIOS_H && !HAVE_TERMIO_H */}/* Restore the tty settings back to what they were before we started using this terminal. */voidterminal_unprep_terminal (){ int tty; if (terminal_unprep_terminal_hook) { (*terminal_unprep_terminal_hook) (); return; } tty = fileno (stdin);#if defined (HAVE_TERMIOS_H) tcsetattr (tty, TCSANOW, &original_termios);#else# if defined (HAVE_TERMIO_H) ioctl (tty, TCSETA, &original_termio);# else /* !HAVE_TERMIO_H */ ioctl (tty, TIOCGETP, &ttybuff); ttybuff.sg_flags = original_tty_flags; ioctl (tty, TIOCSETN, &ttybuff);# if defined (TIOCGETC) ioctl (tty, TIOCSETC, &original_tchars);# endif /* TIOCGETC */# if defined (TIOCGLTC) ioctl (tty, TIOCSLTC, &original_ltchars);# endif /* TIOCGLTC */# if defined (TIOCLGET) && defined (LPASS8) ioctl (tty, TIOCLSET, &original_lmode);# endif /* TIOCLGET && LPASS8 */# endif /* !HAVE_TERMIO_H */#endif /* !HAVE_TERMIOS_H */ terminal_end_using_terminal ();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -