*** ../bash-4.2-patched/lib/readline/readline.c 2010-07-25 17:07:40.000000000 -0400 --- lib/readline/readline.c 2013-07-21 15:52:16.000000000 -0400 *************** *** 2,6 **** with emacs style editing and completion. */ ! /* Copyright (C) 1987-2009 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library --- 2,6 ---- with emacs style editing and completion. */ ! /* Copyright (C) 1987-2013 Free Software Foundation, Inc. This file is part of the GNU Readline Library (Readline), a library *************** *** 113,117 **** Keymap _rl_keymap = emacs_standard_keymap; - /* The current style of editing. */ int rl_editing_mode = emacs_mode; --- 113,116 ---- *************** *** 246,249 **** --- 245,267 ---- _rl_keyseq_cxt *_rl_kscxt = 0; + int rl_executing_key; + char *rl_executing_keyseq = 0; + int _rl_executing_keyseq_size = 0; + + /* Timeout (specified in milliseconds) when reading characters making up an + ambiguous multiple-key sequence */ + int _rl_keyseq_timeout = 500; + + #define RESIZE_KEYSEQ_BUFFER() \ + do \ + { \ + if (rl_key_sequence_length + 2 >= _rl_executing_keyseq_size) \ + { \ + _rl_executing_keyseq_size += 16; \ + rl_executing_keyseq = xrealloc (rl_executing_keyseq, _rl_executing_keyseq_size); \ + } \ + } \ + while (0); + /* Forward declarations used by the display, termcap, and history code. */ *************** *** 280,283 **** --- 298,305 ---- int _rl_echo_control_chars = 1; + /* Non-zero means to prefix the displayed prompt with a character indicating + the editing mode: @ for emacs, : for vi-command, + for vi-insert. */ + int _rl_show_mode_in_prompt = 0; + /* **************************************************************** */ /* */ *************** *** 353,356 **** --- 375,383 ---- #endif + #if HAVE_DECL_AUDIT_TTY && defined (ENABLE_TTY_AUDIT_SUPPORT) + if (value) + _rl_audit_tty (value); + #endif + return (value); } *************** *** 370,376 **** --- 397,413 ---- _rl_out_stream = rl_outstream; + /* Enable the meta key only for the duration of readline(), if this + terminal has one and the terminal has been initialized */ + if (_rl_enable_meta & RL_ISSTATE (RL_STATE_TERMPREPPED)) + _rl_enable_meta_key (); + if (rl_startup_hook) (*rl_startup_hook) (); + #if defined (VI_MODE) + if (rl_editing_mode == vi_mode) + rl_vi_insertion_mode (1, 'i'); /* don't want to reset last */ + #endif /* VI_MODE */ + /* If we're not echoing, we still want to at least print a prompt, because rl_redisplay will not do it for us. If the calling application has a *************** *** 395,403 **** } - #if defined (VI_MODE) - if (rl_editing_mode == vi_mode) - rl_vi_insert_mode (1, 'i'); - #endif /* VI_MODE */ - if (rl_pre_input_hook) (*rl_pre_input_hook) (); --- 432,435 ---- *************** *** 438,441 **** --- 470,478 ---- rl_free_undo_list (); + /* Disable the meta key, if this terminal has one and we were told to use it. + The check whether or not we sent the enable string is in + _rl_disable_meta_key(); the flag is set in _rl_enable_meta_key */ + _rl_disable_meta_key (); + /* Restore normal cursor, if available. */ _rl_set_insert_mode (RL_IM_INSERT, 0); *************** *** 493,497 **** --- 530,538 ---- lk = _rl_last_command_was_kill; + #if defined (HAVE_POSIX_SIGSETJMP) + code = sigsetjmp (_rl_top_level, 0); + #else code = setjmp (_rl_top_level); + #endif if (code) *************** *** 512,515 **** --- 553,557 ---- _rl_reset_argument (); rl_key_sequence_length = 0; + rl_executing_keyseq[0] = 0; } *************** *** 520,524 **** /* look at input.c:rl_getc() for the circumstances under which this will be returned; punt immediately on read error without converting it to ! a newline. */ if (c == READERR) { --- 562,567 ---- /* look at input.c:rl_getc() for the circumstances under which this will be returned; punt immediately on read error without converting it to ! a newline; assume that rl_read_key has already called the signal ! handler. */ if (c == READERR) { *************** *** 532,536 **** } ! /* EOF typed to a non-blank line is a . */ if (c == EOF && rl_end) c = NEWLINE; --- 575,581 ---- } ! /* EOF typed to a non-blank line is a . If we want to change this, ! to force any existing line to be ignored when read(2) reads EOF, ! for example, this is the place to change. */ if (c == EOF && rl_end) c = NEWLINE; *************** *** 744,750 **** if (RL_ISSTATE (RL_STATE_MACRODEF)) _rl_add_macro_char (ESC); map = FUNCTION_TO_KEYMAP (map, ESC); key = UNMETA (key); - rl_key_sequence_length += 2; return (_rl_dispatch (key, map)); } --- 789,796 ---- if (RL_ISSTATE (RL_STATE_MACRODEF)) _rl_add_macro_char (ESC); + RESIZE_KEYSEQ_BUFFER (); + rl_executing_keyseq[rl_key_sequence_length++] = ESC; map = FUNCTION_TO_KEYMAP (map, ESC); key = UNMETA (key); return (_rl_dispatch (key, map)); } *************** *** 766,776 **** /* Special case rl_do_lowercase_version (). */ if (func == rl_do_lowercase_version) return (_rl_dispatch (_rl_to_lower (key), map)); rl_executing_keymap = map; rl_dispatching = 1; RL_SETSTATE(RL_STATE_DISPATCHING); ! (*map[key].function)(rl_numeric_arg * rl_arg_sign, key); RL_UNSETSTATE(RL_STATE_DISPATCHING); rl_dispatching = 0; --- 812,828 ---- /* Special case rl_do_lowercase_version (). */ if (func == rl_do_lowercase_version) + /* Should we do anything special if key == ANYOTHERKEY? */ return (_rl_dispatch (_rl_to_lower (key), map)); rl_executing_keymap = map; + rl_executing_key = key; + + RESIZE_KEYSEQ_BUFFER(); + rl_executing_keyseq[rl_key_sequence_length++] = key; + rl_executing_keyseq[rl_key_sequence_length] = '\0'; rl_dispatching = 1; RL_SETSTATE(RL_STATE_DISPATCHING); ! r = (*func) (rl_numeric_arg * rl_arg_sign, key); RL_UNSETSTATE(RL_STATE_DISPATCHING); rl_dispatching = 0; *************** *** 789,793 **** shadow function that was overridden when the current keymap was created. Return -2 to note that. */ ! _rl_unget_char (key); return -2; } --- 841,848 ---- shadow function that was overridden when the current keymap was created. Return -2 to note that. */ ! if (RL_ISSTATE (RL_STATE_MACROINPUT)) ! _rl_prev_macro_key (); ! else ! _rl_unget_char (key); return -2; } *************** *** 798,802 **** we need to back up the recursion chain and find the last subsequence that is bound to a function. */ ! _rl_unget_char (key); return -1; } --- 853,860 ---- we need to back up the recursion chain and find the last subsequence that is bound to a function. */ ! if (RL_ISSTATE (RL_STATE_MACROINPUT)) ! _rl_prev_macro_key (); ! else ! _rl_unget_char (key); return -1; } *************** *** 821,831 **** will be if an arrow key has been pressed, and, if there's not, just dispatch to (what we assume is) rl_vi_movement_mode right ! away. This is essentially an input test with a zero timeout. */ if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap ! && _rl_input_queued (0) == 0) return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key))); #endif ! rl_key_sequence_length++; _rl_dispatching_keymap = FUNCTION_TO_KEYMAP (map, key); --- 879,893 ---- will be if an arrow key has been pressed, and, if there's not, just dispatch to (what we assume is) rl_vi_movement_mode right ! away. This is essentially an input test with a zero timeout (by ! default) or a timeout determined by the value of `keyseq-timeout' */ ! /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued ! takes microseconds, so multiply by 1000 */ if (rl_editing_mode == vi_mode && key == ESC && map == vi_insertion_keymap ! && _rl_input_queued ((_rl_keyseq_timeout > 0) ? _rl_keyseq_timeout*1000 : 0) == 0) return (_rl_dispatch (ANYOTHERKEY, FUNCTION_TO_KEYMAP (map, key))); #endif ! RESIZE_KEYSEQ_BUFFER (); ! rl_executing_keyseq[rl_key_sequence_length++] = key; _rl_dispatching_keymap = FUNCTION_TO_KEYMAP (map, key); *************** *** 856,859 **** --- 918,933 ---- #endif + /* Tentative inter-character timeout for potential multi-key + sequences? If no input within timeout, abort sequence and + act as if we got non-matching input. */ + /* _rl_keyseq_timeout specified in milliseconds; _rl_input_queued + takes microseconds, so multiply by 1000 */ + if (_rl_keyseq_timeout > 0 && + (RL_ISSTATE (RL_STATE_INPUTPENDING|RL_STATE_MACROINPUT) == 0) && + _rl_pushed_input_available () == 0 && + _rl_dispatching_keymap[ANYOTHERKEY].function && + _rl_input_queued (_rl_keyseq_timeout*1000) == 0) + return (_rl_subseq_result (-2, map, key, got_subseq)); + newkey = _rl_subseq_getchar (key); if (newkey < 0) *************** *** 876,879 **** --- 950,954 ---- if (map[key].function != 0) { + rl_executing_keyseq[rl_key_sequence_length] = '\0'; macro = savestring ((char *)map[key].function); _rl_with_macro_input (macro); *************** *** 885,888 **** --- 960,964 ---- if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap && key != ANYOTHERKEY && + rl_key_sequence_length == 1 && /* XXX */ _rl_vi_textmod_command (key)) _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign); *************** *** 936,940 **** tell the caller that it should try ANYOTHERKEY for an overridden function. */ ! _rl_unget_char (key); _rl_dispatching_keymap = map; return -2; --- 1012,1019 ---- tell the caller that it should try ANYOTHERKEY for an overridden function. */ ! if (RL_ISSTATE (RL_STATE_MACROINPUT)) ! _rl_prev_macro_key (); ! else ! _rl_unget_char (key); _rl_dispatching_keymap = map; return -2; *************** *** 943,947 **** { /* OK, back up the chain. */ ! _rl_unget_char (key); _rl_dispatching_keymap = map; return -1; --- 1022,1029 ---- { /* OK, back up the chain. */ ! if (RL_ISSTATE (RL_STATE_MACROINPUT)) ! _rl_prev_macro_key (); ! else ! _rl_unget_char (key); _rl_dispatching_keymap = map; return -1; *************** *** 1092,1103 **** bind_arrow_keys (); - /* Enable the meta key, if this terminal has one. */ - if (_rl_enable_meta) - _rl_enable_meta_key (); - /* If the completion parser's default word break characters haven't been set yet, then do so now. */ if (rl_completer_word_break_characters == (char *)NULL) rl_completer_word_break_characters = (char *)rl_basic_word_break_characters; } --- 1174,1190 ---- bind_arrow_keys (); /* If the completion parser's default word break characters haven't been set yet, then do so now. */ if (rl_completer_word_break_characters == (char *)NULL) rl_completer_word_break_characters = (char *)rl_basic_word_break_characters; + + #if defined (COLOR_SUPPORT) + if (_rl_colored_stats) + _rl_parse_colors (); + #endif + + rl_executing_keyseq = malloc (_rl_executing_keyseq_size = 16); + if (rl_executing_keyseq) + rl_executing_keyseq[0] = '\0'; } *************** *** 1160,1163 **** --- 1247,1254 ---- rl_bind_keyseq_if_unbound ("\340M", rl_forward_char); rl_bind_keyseq_if_unbound ("\340K", rl_backward_char); + rl_bind_keyseq_if_unbound ("\340G", rl_beg_of_line); + rl_bind_keyseq_if_unbound ("\340O", rl_end_of_line); + rl_bind_keyseq_if_unbound ("\340S", rl_delete); + rl_bind_keyseq_if_unbound ("\340R", rl_overwrite_mode); #endif