📄 terminal.c
字号:
/* terminal.c -- controlling the terminal with termcap. *//* Copyright (C) 1996 Free Software Foundation, Inc. This file is part of the GNU Readline Library, a library for reading lines of text with interactive input and history editing. The GNU Readline Library 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 2, or (at your option) any later version. The GNU Readline Library 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. The GNU General Public License is often shipped with GNU software, and is generally kept in a file called COPYING or LICENSE. If you do not have a copy of the license, write to the Free Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */#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"#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)/* **************************************************************** *//* *//* Terminal and Termcap *//* *//* **************************************************************** */static char *term_buffer = (char *)NULL;static char *term_string_buffer = (char *)NULL;static int tcap_initialized;#if !defined (__linux__)# if defined (__EMX__) || defined (NEED_EXTERN_PC)extern # endif /* __EMX__ || NEED_EXTERN_PC */char PC, *BC, *UP;#endif /* __linux__ *//* 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;#if defined (HACK_TERMCAP_MOTION)char *_rl_term_forward_char;#endif /* HACK_TERMCAP_MOTION *//* 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;/* 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 *//* 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/* 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 */#if defined (TIOCGWINSZ) if (ioctl (tty, TIOCGWINSZ, &window_size) == 0) { _rl_screenwidth = (int) window_size.ws_col; _rl_screenheight = (int) window_size.ws_row; }#endif /* TIOCGWINSZ */#if defined (__EMX__) _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight);#endif /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV is unset. */ if (_rl_screenwidth <= 0) { if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS"))) _rl_screenwidth = atoi (ss);#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 !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 (rows == 0 || cols == 0) return; _rl_screenheight = rows; _rl_screenwidth = cols; if (_rl_term_autowrap == 0) _rl_screenwidth--; _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_resize_terminal (){ if (readline_echoing_p) { _rl_get_screen_size (fileno (rl_instream), 1); if (CUSTOM_REDISPLAY_FUNC ()) rl_forced_update_display (); else _rl_redisplay_after_sigwinch (); }}struct _tc_string { const char *tc_var; char **tc_value;};/* This should be kept sorted, just in case we decide to change the search algorithm to something smarter. */static struct _tc_string tc_strings[] ={ { "@7", &_rl_term_at7 }, { "DC", &_rl_term_DC }, { "IC", &_rl_term_IC }, { "ce", &_rl_term_clreol }, { "cl", &_rl_term_clrpag }, { "cr", &_rl_term_cr }, { "dc", &_rl_term_dc }, { "ei", &_rl_term_ei }, { "ic", &_rl_term_ic }, { "im", &_rl_term_im }, { "kH", &_rl_term_kH }, /* home down ?? */ { "kI", &_rl_term_kI }, /* insert */ { "kd", &_rl_term_kd }, { "ke", &_rl_term_ke }, /* end keypad mode */ { "kh", &_rl_term_kh }, /* home */ { "kl", &_rl_term_kl }, { "kr", &_rl_term_kr }, { "ks", &_rl_term_ks }, /* start keypad mode */ { "ku", &_rl_term_ku }, { "le", &_rl_term_backspace }, { "mm", &_rl_term_mm }, { "mo", &_rl_term_mo },#if defined (HACK_TERMCAP_MOTION) { "nd", &_rl_term_forward_char },#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -