diff -ur ../bash_old/bash-4.2//lib/readline/funmap.c ./lib/readline/funmap.c --- ../bash_old/bash-4.2//lib/readline/funmap.c 2010-05-31 04:02:37.000000000 +0530 +++ ./lib/readline/funmap.c 2011-05-05 14:17:40.312594508 +0530 @@ -98,6 +98,8 @@ { "forward-word", rl_forward_word }, { "history-search-backward", rl_history_search_backward }, { "history-search-forward", rl_history_search_forward }, + { "history-search-backward-new", rl_history_search_backward_new }, + { "history-search-forward-new", rl_history_search_forward_new }, { "insert-comment", rl_insert_comment }, { "insert-completions", rl_insert_completions }, { "kill-whole-line", rl_kill_full_line }, diff -ur ../bash_old/bash-4.2//lib/readline/readline.h ./lib/readline/readline.h --- ../bash_old/bash-4.2//lib/readline/readline.h 2011-01-17 02:03:09.000000000 +0530 +++ ./lib/readline/readline.h 2011-05-05 14:19:41.162594470 +0530 @@ -204,6 +204,8 @@ /* Bindable commands for incremental and non-incremental history searching. */ extern int rl_history_search_forward PARAMS((int, int)); extern int rl_history_search_backward PARAMS((int, int)); +extern int rl_history_search_forward_new PARAMS((int, int)); +extern int rl_history_search_backward_new PARAMS((int, int)); extern int rl_noninc_forward_search PARAMS((int, int)); extern int rl_noninc_reverse_search PARAMS((int, int)); extern int rl_noninc_forward_search_again PARAMS((int, int)); diff -ur ../bash_old/bash-4.2//lib/readline/search.c ./lib/readline/search.c --- ../bash_old/bash-4.2//lib/readline/search.c 2010-07-26 02:59:05.000000000 +0530 +++ ./lib/readline/search.c 2011-05-13 10:07:52.786726413 +0530 @@ -488,10 +488,11 @@ /* If you don't want the saved history line (last match) to show up in the line buffer after the search fails, change the #if 0 to #if 1 */ -#if 0 +#if 1 if (rl_point > rl_history_search_len) { rl_point = rl_end = rl_history_search_len; + strncpy(rl_line_buffer,history_search_string,rl_end); rl_line_buffer[rl_end] = '\0'; rl_mark = 0; } @@ -504,8 +505,10 @@ /* Copy the line we found into the current line buffer. */ make_history_line_current (temp); - - rl_point = rl_history_search_len; + rl_point=(int)(strstr(rl_line_buffer,history_search_string)+ + strlen(history_search_string)-(char *)rl_line_buffer); + //rl_point = rl_history_search_len; + rl_mark = rl_end; return 0; @@ -531,6 +534,26 @@ _rl_free_saved_history_line (); } +static void +rl_history_search_reinit_new () +{ + rl_history_search_pos = where_history (); + rl_history_search_len = rl_point; + prev_line_found = (char *)NULL; + if (rl_point) + { + if (rl_history_search_len >= history_string_size - 2) + { + history_string_size = rl_history_search_len + 2; + history_search_string = (char *)xrealloc (history_search_string, history_string_size); + } + //history_search_string[0] = '^'; + strncpy (history_search_string , rl_line_buffer, rl_point); + history_search_string[rl_point ] = '\0'; + } + _rl_free_saved_history_line (); +} + /* Search forward in the history for the string of characters from the start of the line to rl_point. This is a non-incremental search. */ @@ -566,5 +589,41 @@ if (rl_history_search_len == 0) return (rl_get_previous_history (count, ignore)); + return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1)); +} + + +int +rl_history_search_forward_new (count, ignore) + int count, ignore; +{ + if (count == 0) + return (0); + + if (rl_last_func != rl_history_search_forward_new && + rl_last_func != rl_history_search_backward_new) + rl_history_search_reinit_new (); + + if (rl_history_search_len == 0) + return (rl_get_next_history (count, ignore)); + return (rl_history_search_internal (abs (count), (count > 0) ? 1 : -1)); +} + +/* Search backward through the history for the string of characters + from the start of the line to rl_point. This is a non-incremental + search. */ +int +rl_history_search_backward_new (count, ignore) + int count, ignore; +{ + if (count == 0) + return (0); + + if (rl_last_func != rl_history_search_forward_new && + rl_last_func != rl_history_search_backward_new) + rl_history_search_reinit_new (); + + if (rl_history_search_len == 0) + return (rl_get_previous_history (count, ignore)); return (rl_history_search_internal (abs (count), (count > 0) ? -1 : 1)); }