📄 terminal.c
字号:
/* terminal.c -- controlling the terminal with termcap. *//* Copyright (C) 1996-2009 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing. Readline is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Readline is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Readline. If not, see <http://www.gnu.org/licenses/>.*/#define READLINE_LIBRARY#if defined (HAVE_CONFIG_H)# include <config.h>#endif#include <sys/types.h>#include "posixstat.h"#include <fcntl.h>#if defined (HAVE_SYS_FILE_H)# include <sys/file.h>#endif /* HAVE_SYS_FILE_H */#if defined (HAVE_UNISTD_H)# include <unistd.h>#endif /* HAVE_UNISTD_H */#if defined (HAVE_STDLIB_H)# include <stdlib.h>#else# include "ansi_stdlib.h"#endif /* HAVE_STDLIB_H */#if defined (HAVE_LOCALE_H)# include <locale.h>#endif#include <stdio.h>/* System-specific feature definitions and include files. */#include "rldefs.h"#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ)# include <sys/ioctl.h>#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */#include "rltty.h"#include "tcap.h"/* Some standard library routines. */#include "readline.h"#include "history.h"#include "rlprivate.h"#include "rlshell.h"#include "xmalloc.h"#if defined (__MINGW32__)# include <windows.h># include <wincon.h>static void _win_get_screensize PARAMS((int *, int *));#endif#if defined (__EMX__)static void _emx_get_screensize PARAMS((int *, int *));#endif#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)/* If the calling application sets this to a non-zero value, readline will use the $LINES and $COLUMNS environment variables to set its idea of the window size before interrogating the kernel. */int rl_prefer_env_winsize = 0;/* **************************************************************** *//* *//* Terminal and Termcap *//* *//* **************************************************************** */static char *term_buffer = (char *)NULL;static char *term_string_buffer = (char *)NULL;static int tcap_initialized;#if !defined (__linux__) && !defined (NCURSES_VERSION)# if defined (__EMX__) || defined (NEED_EXTERN_PC)extern # endif /* __EMX__ || NEED_EXTERN_PC */char PC, *BC, *UP;#endif /* !__linux__ && !NCURSES_VERSION *//* Some strings to control terminal actions. These are output by tputs (). */char *_rl_term_clreol;char *_rl_term_clrpag;char *_rl_term_cr;char *_rl_term_backspace;char *_rl_term_goto;char *_rl_term_pc;/* Non-zero if we determine that the terminal can do character insertion. */int _rl_terminal_can_insert = 0;/* How to insert characters. */char *_rl_term_im;char *_rl_term_ei;char *_rl_term_ic;char *_rl_term_ip;char *_rl_term_IC;/* How to delete characters. */char *_rl_term_dc;char *_rl_term_DC;char *_rl_term_forward_char;/* How to go up a line. */char *_rl_term_up;/* A visible bell; char if the terminal can be made to flash the screen. */static char *_rl_visible_bell;/* Non-zero means the terminal can auto-wrap lines. */int _rl_term_autowrap = -1;/* Non-zero means that this terminal has a meta key. */static int term_has_meta;/* The sequences to write to turn on and off the meta key, if this terminal has one. */static char *_rl_term_mm;static char *_rl_term_mo;/* The key sequences output by the arrow keys, if this terminal has any. */static char *_rl_term_ku;static char *_rl_term_kd;static char *_rl_term_kr;static char *_rl_term_kl;/* How to initialize and reset the arrow keys, if this terminal has any. */static char *_rl_term_ks;static char *_rl_term_ke;/* The key sequences sent by the Home and End keys, if any. */static char *_rl_term_kh;static char *_rl_term_kH;static char *_rl_term_at7; /* @7 *//* Delete key */static char *_rl_term_kD;/* Insert key */static char *_rl_term_kI;/* Cursor control */static char *_rl_term_vs; /* very visible */static char *_rl_term_ve; /* normal */static void bind_termcap_arrow_keys PARAMS((Keymap));/* Variables that hold the screen dimensions, used by the display code. */int _rl_screenwidth, _rl_screenheight, _rl_screenchars;/* Non-zero means the user wants to enable the keypad. */int _rl_enable_keypad;/* Non-zero means the user wants to enable a meta key. */int _rl_enable_meta = 1;#if defined (__EMX__)static void_emx_get_screensize (swp, shp) int *swp, *shp;{ int sz[2]; _scrsize (sz); if (swp) *swp = sz[0]; if (shp) *shp = sz[1];}#endif#if defined (__MINGW32__)static void_win_get_screensize (swp, shp) int *swp, *shp;{ HANDLE hConOut; CONSOLE_SCREEN_BUFFER_INFO scr; hConOut = GetStdHandle (STD_OUTPUT_HANDLE); if (hConOut != INVALID_HANDLE_VALUE) { if (GetConsoleScreenBufferInfo (hConOut, &scr)) { *swp = scr.dwSize.X; *shp = scr.srWindow.Bottom - scr.srWindow.Top + 1; } }}#endif/* Get readline's idea of the screen size. TTY is a file descriptor open to the terminal. If IGNORE_ENV is true, we do not pay attention to the values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being non-null serve to check whether or not we have initialized termcap. */void_rl_get_screen_size (tty, ignore_env) int tty, ignore_env;{ char *ss;#if defined (TIOCGWINSZ) struct winsize window_size;#endif /* TIOCGWINSZ */ int wr, wc; wr = wc = -1;#if defined (TIOCGWINSZ) if (ioctl (tty, TIOCGWINSZ, &window_size) == 0) { wc = (int) window_size.ws_col; wr = (int) window_size.ws_row; }#endif /* TIOCGWINSZ */#if defined (__EMX__) _emx_get_screensize (&wc, &wr);#elif defined (__MINGW32__) _win_get_screensize (&wc, &wr);#endif if (ignore_env || rl_prefer_env_winsize == 0) { _rl_screenwidth = wc; _rl_screenheight = wr; } else _rl_screenwidth = _rl_screenheight = -1; /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV is unset. If we prefer the environment, check it first before assigning the value returned by the kernel. */ if (_rl_screenwidth <= 0) { if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS"))) _rl_screenwidth = atoi (ss); if (_rl_screenwidth <= 0) _rl_screenwidth = wc;#if !defined (__DJGPP__) if (_rl_screenwidth <= 0 && term_string_buffer) _rl_screenwidth = tgetnum ("co");#endif } /* Environment variable LINES overrides setting of "li" if IGNORE_ENV is unset. */ if (_rl_screenheight <= 0) { if (ignore_env == 0 && (ss = sh_get_env_value ("LINES"))) _rl_screenheight = atoi (ss); if (_rl_screenheight <= 0) _rl_screenheight = wr;#if !defined (__DJGPP__) if (_rl_screenheight <= 0 && term_string_buffer) _rl_screenheight = tgetnum ("li");#endif } /* If all else fails, default to 80x24 terminal. */ if (_rl_screenwidth <= 1) _rl_screenwidth = 80; if (_rl_screenheight <= 0) _rl_screenheight = 24; /* If we're being compiled as part of bash, set the environment variables $LINES and $COLUMNS to new values. Otherwise, just do a pair of putenv () or setenv () calls. */ sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth); if (_rl_term_autowrap == 0) _rl_screenwidth--; _rl_screenchars = _rl_screenwidth * _rl_screenheight;}void_rl_set_screen_size (rows, cols) int rows, cols;{ if (_rl_term_autowrap == -1) _rl_init_terminal_io (rl_terminal_name); if (rows > 0) _rl_screenheight = rows; if (cols > 0) { _rl_screenwidth = cols; if (_rl_term_autowrap == 0) _rl_screenwidth--; } if (rows > 0 || cols > 0) _rl_screenchars = _rl_screenwidth * _rl_screenheight;}voidrl_set_screen_size (rows, cols) int rows, cols;{ _rl_set_screen_size (rows, cols);}voidrl_get_screen_size (rows, cols) int *rows, *cols;{ if (rows) *rows = _rl_screenheight; if (cols) *cols = _rl_screenwidth;}voidrl_reset_screen_size (){ _rl_get_screen_size (fileno (rl_instream), 0);} voidrl_resize_terminal (){ _rl_get_screen_size (fileno (rl_instream), 1); if (_rl_echoing_p) { if (CUSTOM_REDISPLAY_FUNC ()) rl_forced_update_display (); else if (RL_ISSTATE(RL_STATE_REDISPLAYING) == 0) _rl_redisplay_after_sigwinch (); }}struct _tc_string { const char * const tc_var; char **tc_value;};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -