Hi, IMO a dabbrev-expand implementation in readline would be a good idea.
In emacs dabbrev-expand is bound by default to M-/ (AFAIK emacs had the original implementation for this idea. It is now present in tcsh too) What dabbrev-expand could do in readline/bash is to complete the word the cursor is currently on with an item from history. Repeated invocations complete with other matching items from history. I have changed the implementation of "menu-complete" to behave like "dabbrev-expand", i.e. complete with items from history. Here is my proof of concept patch. It's a bit of a hack because (among other things) history_completion_generator is only available in bash, but not in readline. It could probably be moved to readline. I am not sure what is the best way to integrate this in readline, so for now I just made "menu-complete" do what dabbrev-expand is supposed to do. To test this, just do: bind '"\M-/":menu-complete' Can you please integrate this (or something similar) in readline/bash? I could help with the needed code... Thanks --dan diff -rup ../bash-3.2.orig/bashline.c ./bashline.c --- ../bash-3.2.orig/bashline.c 2006-07-29 13:39:30.000000000 -0700 +++ ./bashline.c 2007-04-05 13:42:22.000000000 -0700 @@ -116,7 +116,7 @@ static char *hostname_completion_functio static char *command_subst_completion_function __P((const char *, int)); static void build_history_completion_array __P((void)); -static char *history_completion_generator __P((const char *, int)); +char *history_completion_generator __P((const char *, int)); static int dynamic_complete_history __P((int, int)); static void initialize_hostname_list __P((void)); @@ -2466,7 +2466,7 @@ build_history_completion_array () } } -static char * +char * history_completion_generator (hint_text, state) const char *hint_text; int state; diff -rup ../bash-3.2.orig/lib/readline/complete.c ./lib/readline/complete.c --- ../bash-3.2.orig/lib/readline/complete.c 2006-07-28 08:35:49.000000000 -0700 +++ ./lib/readline/complete.c 2007-04-14 15:19:14.000000000 -0700 @@ -2112,6 +2112,7 @@ int rl_menu_complete (count, ignore) int count, ignore; { + extern char *history_completion_generator __P((const char *, int)); rl_compentry_func_t *our_func; int matching_filenames, found_quote; @@ -2135,12 +2136,17 @@ rl_menu_complete (count, ignore) match_list_index = match_list_size = 0; matches = (char **)NULL; + rl_filename_completion_desired = 0; + rl_attempted_completion_function = NULL; + /* Only the completion entry function can change these. */ - set_completion_defaults ('%'); + set_completion_defaults ('@'); - our_func = rl_completion_entry_function - ? rl_completion_entry_function - : rl_filename_completion_function; + our_func = history_completion_generator; + +/* rl_completion_entry_function */ +/* ? rl_completion_entry_function */ +/* : rl_filename_completion_function; */ /* We now look backwards for the start of a filename/variable word. */ orig_end = rl_point; _______________________________________________ Bug-bash mailing list Bug-bash@gnu.org http://lists.gnu.org/mailman/listinfo/bug-bash