📄 readline.c
字号:
rl_pending_input = key; return (rl_digit_loop ());}/* What to do when you abort reading an argument. */rl_discard_argument (){ ding (); rl_clear_message (); rl_init_argument (); return 0;}/* Create a default argument. */rl_init_argument (){ rl_numeric_arg = rl_arg_sign = 1; rl_explicit_arg = 0; return 0;}/* C-u, universal argument. Multiply the current argument by 4. Read a key. If the key has nothing to do with arguments, then dispatch on it. If the key is the abort character then abort. */rl_universal_argument (){ rl_numeric_arg *= 4; return (rl_digit_loop ());}/* **************************************************************** *//* *//* Terminal and Termcap *//* *//* **************************************************************** */static char *term_buffer = (char *)NULL;static char *term_string_buffer = (char *)NULL;static int tcap_initialized = 0;/* Non-zero means this terminal can't really do anything. */int dumb_term = 0;/* On Solaris2, sys/types.h #includes sys/reg.h, which #defines PC. Unfortunately, PC is a global variable used by the termcap library. */#undef PC#if !defined (__linux__)/* If this causes problems, add back the `extern'. *//*extern*/ char PC, *BC, *UP;#endif /* __linux__ *//* Some strings to control terminal actions. These are output by tputs (). */char *term_goto, *term_clreol, *term_cr, *term_clrpag, *term_backspace;char *term_pc;/* Non-zero if we determine that the terminal can do character insertion. */int terminal_can_insert = 0;/* How to insert characters. */char *term_im, *term_ei, *term_ic, *term_ip, *term_IC;/* How to delete characters. */char *term_dc, *term_DC;#if defined (HACK_TERMCAP_MOTION)char *term_forward_char;#endif /* HACK_TERMCAP_MOTION *//* How to go up a line. */char *term_up;/* A visible bell, if the terminal can be made to flash the screen. */char *visible_bell;/* Non-zero means that this terminal has a meta key. */int term_has_meta;/* The string to write to turn on the meta key, if this term has one. */char *term_mm;/* The string to write to turn off the meta key, if this term has one. */char *term_mo;/* The key sequences output by the arrow keys, if this terminal has any. */char *term_ku, *term_kd, *term_kr, *term_kl;/* How to initialize and reset the arrow keys, if this terminal has any. */char *term_ks, *term_ke;/* Re-initialize the terminal considering that the TERM/TERMCAP variable has changed. */rl_reset_terminal (terminal_name) char *terminal_name;{ init_terminal_io (terminal_name); return 0;}/* Set 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_set_screen_size (tty, ignore_env) int tty, ignore_env;{#if defined (TIOCGWINSZ) struct winsize window_size;#endif /* TIOCGWINSZ */#if defined (TIOCGWINSZ) if (ioctl (tty, 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 IGNORE_ENV is unset. */ if (screenwidth <= 0) { char *sw; if (!ignore_env && (sw = getenv ("COLUMNS"))) screenwidth = atoi (sw); if (screenwidth <= 0 && term_string_buffer) screenwidth = tgetnum ("co"); } /* Environment variable LINES overrides setting of "li" if IGNORE_ENV is unset. */ if (screenheight <= 0) { char *sh; if (!ignore_env && (sh = getenv ("LINES"))) screenheight = atoi (sh); if (screenheight <= 0 && term_string_buffer) screenheight = tgetnum ("li"); } /* If all else fails, default to 80x24 terminal. */ if (screenwidth <= 1) screenwidth = 80; if (screenheight <= 0) screenheight = 24;#if defined (SHELL) /* If we're being compiled as part of bash, set the environment variables $LINES and $COLUMNS to new values. */ set_lines_and_columns (screenheight, screenwidth);#endif if (!term_xn) screenwidth--; screenchars = screenwidth * screenheight;}struct _tc_string { 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[] ={ "DC", &term_DC, "IC", &term_IC, "ce", &term_clreol, "cl", &term_clrpag, "cr", &term_cr, "dc", &term_dc, "ei", &term_ei, "ic", &term_ic, "im", &term_im, "kd", &term_kd, "kl", &term_kl, "kr", &term_kr, "ku", &term_ku, "ks", &term_ks, "ke", &term_ke, "le", &term_backspace, "mm", &term_mm, "mo", &term_mo,#if defined (HACK_TERMCAP_MOTION) "nd", &term_forward_char,#endif "pc", &term_pc, "up", &term_up, "vb", &visible_bell,};#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string))/* Read the desired terminal capability strings into BP. The capabilities are described in the TC_STRINGS table. */static voidget_term_capabilities (bp) char **bp;{ register int i; for (i = 0; i < NUM_TC_STRINGS; i++) *(tc_strings[i].tc_value) = tgetstr (tc_strings[i].tc_var, bp); tcap_initialized = 1;}static intinit_terminal_io (terminal_name) char *terminal_name;{#if defined (__GO32__) screenwidth = ScreenCols (); screenheight = ScreenRows (); screenchars = screenwidth * screenheight; term_cr = "\r"; term_im = term_ei = term_ic = term_IC = (char *)NULL; term_up = term_dc = term_DC = visible_bell = (char *)NULL; /* Does the __GO32__ have a meta key? I don't know. */ term_has_meta = 0; term_mm = term_mo = (char *)NULL; /* It probably has arrow keys, but I don't know what they are. */ term_ku = term_kd = term_kr = term_kl = (char *)NULL;#if defined (HACK_TERMCAP_MOTION) term_forward_char = (char *)NULL;#endif /* HACK_TERMCAP_MOTION */ terminal_can_insert = term_xn = 0; return;#else /* !__GO32__ */ char *term, *buffer; int tty; Keymap xkeymap; term = terminal_name ? terminal_name : getenv ("TERM"); if (!term_string_buffer) term_string_buffer = xmalloc (2048); if (!term_buffer) term_buffer = xmalloc (2048); buffer = term_string_buffer; term_clrpag = term_cr = term_clreol = (char *)NULL; if (!term) term = "dumb"; if (tgetent (term_buffer, term) <= 0) { dumb_term = 1; screenwidth = 79; screenheight = 24; screenchars = 79 * 24; term_cr = "\r"; term_im = term_ei = term_ic = term_IC = (char *)NULL; term_up = term_dc = term_DC = visible_bell = (char *)NULL; term_ku = term_kd = term_kl = term_kr = (char *)NULL;#if defined (HACK_TERMCAP_MOTION) term_forward_char = (char *)NULL;#endif terminal_can_insert = 0; return 0; } get_term_capabilities (&buffer); /* Set up the variables that the termcap library expects the application to provide. */ PC = term_pc ? *term_pc : 0; BC = term_backspace; UP = term_up; if (!term_cr) term_cr = "\r"; if (rl_instream) tty = fileno (rl_instream); else tty = 0; screenwidth = screenheight = 0; term_xn = tgetflag ("am") && tgetflag ("xn"); _rl_set_screen_size (tty, 0); /* "An application program can assume that the terminal can do character insertion if *any one of* the capabilities `IC', `im', `ic' or `ip' is provided." But we can't do anything if only `ip' is provided, so... */ terminal_can_insert = (term_IC || term_im || term_ic); /* Check to see if this terminal has a meta key and clear the capability variables if there is none. */ term_has_meta = (tgetflag ("km") || tgetflag ("MT")); if (!term_has_meta) { term_mm = (char *)NULL; term_mo = (char *)NULL; } /* Attempt to find and bind the arrow keys. Do not override already bound keys in an overzealous attempt, however. */ xkeymap = _rl_keymap; _rl_keymap = emacs_standard_keymap; _rl_bind_if_unbound (term_ku, rl_get_previous_history); _rl_bind_if_unbound (term_kd, rl_get_next_history); _rl_bind_if_unbound (term_kr, rl_forward); _rl_bind_if_unbound (term_kl, rl_backward);#if defined (VI_MODE) _rl_keymap = vi_movement_keymap; _rl_bind_if_unbound (term_ku, rl_get_previous_history); _rl_bind_if_unbound (term_kd, rl_get_next_history); _rl_bind_if_unbound (term_kr, rl_forward); _rl_bind_if_unbound (term_kl, rl_backward);#endif /* VI_MODE */ _rl_keymap = xkeymap;#endif /* !__GO32__ */ return 0;}char *rl_get_termcap (cap) char *cap;{ register int i; if (tcap_initialized == 0) return ((char *)NULL); for (i = 0; i < NUM_TC_STRINGS; i++) { if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0) return *(tc_strings[i].tc_value); } return ((char *)NULL);}/* A function for the use of tputs () */int_rl_output_character_function (c) int c;{ return putc (c, out_stream);}/* Write COUNT characters from STRING to the output stream. */void_rl_output_some_chars (string, count) char *string; int count;{ fwrite (string, 1, count, out_stream);}/* Move the cursor back. */backspace (count) int count;{ register int i;#if !defined (__GO32__) if (term_backspace) for (i = 0; i < count; i++) tputs (term_backspace, 1, _rl_output_character_function); else#endif /* !__GO32__ */ for (i = 0; i < count; i++) putc ('\b', out_stream); return 0;}/* Move to the start of the next line. */crlf (){#if defined (NEW_TTY_DRIVER) tputs (term_cr, 1, _rl_output_character_function);#endif /* NEW_TTY_DRIVER */ putc ('\n', out_stream); return 0;}rl_tty_status (count, key) int count, key;{#if defined (TIOCSTAT) ioctl (1, TIOCSTAT, (char *)0); rl_refresh_line ();#else ding ();#endif return 0;}/* **************************************************************** *//* *//* Utility Functions *//* *//* **************************************************************** *//* Return 0 if C is not a member of the class of characters that belong in words, or 1 if it is. */int allow_pathname_alphabetic_chars = 0;char *pathname_alphabetic_chars = "/-_=~.#$";intalphabetic (c) int c;{ if (pure_alphabetic (c) || (digit_p (c))) return (1); if (allow_pathname_alphabetic_chars) return (strchr (pathname_alphabetic_chars, c) != NULL); else return (0);}/* Ring the terminal bell. */intding (){ if (readline_echoing_p) {#if !defined (__GO32__) switch (_rl_bell_preference) { case NO_BELL: default: break; case VISIBLE_BELL: if (visible_bell) { tputs (visible_bell, 1, _rl_output_character_function); break; } /* FALLTHROUGH */ case AUDIBLE_BELL: fprintf (stderr, "\007"); fflush (stderr); break; }#else /* __GO32__ */ fprintf (stderr, "\007"); fflush (stderr);#endif /* __GO32__ */ return (0); } return (-1);}/* How to abort things. */rl_abort (count, key) int count, key;{ ding (); rl_clear_message (); rl_init_argument (); rl_pending_input = 0; defining_kbd_macro = 0; while (executing_macro) pop_executing_macro (); rl_last_func = (Function *)NULL; longjmp (readline_top_level, 1);}/* Return a copy of the string between FROM and TO. FROM is inclusive, TO is not. */char *rl_copy_text (from, to) int from, to;{ register int length; char *copy; /* Fix it if the caller is confused. */ if (from > to) { int t = from; from = to; to = t; } length = to - from; copy = xmalloc (1 + length); strncpy (copy, the_line + from, length); copy[length] = '\0'; return (copy);}/* Increase the size of RL_LINE_BUFFER until it has enough space to hold LEN characters. */voidrl_extend_line_buffer (len) int len;{ while (len >= rl_line_buffer_len) { rl_line_buffer_len += DEFAULT_BUFFER_SIZE; rl_line_buffer = xrealloc (rl_line_buffer, rl_line_buffer_len); } the_line = rl_line_buffer;}/* **************************************************************** *//* *//* Insert and Delete *//* *//* **************************************************************** *//* Insert a string of text into the line at point. This is the only way that you should do insertion. rl_insert () calls this function. */rl_insert_text (string) char *string;{ register int i, l = strlen (string); if (rl_end + l >= rl_line_buffer_len) rl_extend_line_buffer (rl_end + l); for (i = rl_end; i >= rl_point; i--) the_line[i + l] = the_line[i]; strncpy (the_line + rl_point, string, l); /* Remember how to undo this if we aren't undoing something. */ if (!doing_an_undo) { /* If possible and desirable, concatenate the undos. */ if ((l == 1) && rl_undo_list && (rl_undo_list->what == UNDO_INSERT) && (rl_undo_list->end == rl_point) && (rl_undo_list->end - rl_undo_list->start < 20)) rl_undo_list->end++; else rl_add_undo (UNDO_INSERT, rl_point, rl_point + l, (char *)NULL); } rl_point += l; rl_end += l; the_line[rl_end] = '\0'; return l;}/* Delete the string between FROM and TO. FROM is inclusive, TO is not. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -