From: Tom Tromey Date: Tue, 27 Nov 2001 04:15:09 +0000 (+0000) Subject: * NEWS: Updated. X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=467d85198ffb27a97ef21aa85c044a3ace19990a;p=deliverable%2Fbinutils-gdb.git * NEWS: Updated. * event-loop.c (start_event_loop): Call after_char_processing_hook. * event-top.h (after_char_processing_hook): Declare. * event-top.c (rl_callback_read_char_wrapper): Call after_char_processing_hook. (after_char_processing_hook): New global. * top.c (operate_saved_history): New global. (gdb_rl_operate_and_get_next): New function. (init_main): Add the operate-and-get-next defun. (gdb_rl_operate_and_get_next_completion): New function. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 99aa1202f5..a7fb83b37c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2001-11-26 Tom Tromey + + * NEWS: Updated. + * event-loop.c (start_event_loop): Call + after_char_processing_hook. + * event-top.h (after_char_processing_hook): Declare. + * event-top.c (rl_callback_read_char_wrapper): Call + after_char_processing_hook. + (after_char_processing_hook): New global. + * top.c (operate_saved_history): New global. + (gdb_rl_operate_and_get_next): New function. + (init_main): Add the operate-and-get-next defun. + (gdb_rl_operate_and_get_next_completion): New function. + 2001-11-26 Tom Tromey * NEWS: Update for --args. diff --git a/gdb/NEWS b/gdb/NEWS index 7f874392f6..fbe24f819f 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -12,6 +12,10 @@ x86 OpenBSD i[3456]86-*-openbsd* The new `--args' feature can be used to specify command-line arguments for the inferior from gdb's command line. +* Changes to key bindings + +There is a new `operate-and-get-next' function bound to `C-o'. + *** Changes in GDB 5.1: * New native configurations diff --git a/gdb/event-loop.c b/gdb/event-loop.c index de1f78f028..ea74419623 100644 --- a/gdb/event-loop.c +++ b/gdb/event-loop.c @@ -402,6 +402,14 @@ start_event_loop (void) interface specific, because interfaces can display the prompt in their own way. */ display_gdb_prompt (0); + /* This call looks bizarre, but it is required. If the user + entered a command that caused an error, + after_char_processing_hook won't be called from + rl_callback_read_char_wrapper. Using a cleanup there + won't work, since we want this function to be called + after a new prompt is printed. */ + if (after_char_processing_hook) + (*after_char_processing_hook) (); /* Maybe better to set a flag to be checked somewhere as to whether display the prompt or not. */ } diff --git a/gdb/event-top.c b/gdb/event-top.c index e76f08728c..4703a86c36 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -153,6 +153,10 @@ struct readline_input_state char *linebuffer_ptr; } readline_input_state; + +/* This hook is called by rl_callback_read_char_wrapper after each + character is processed. */ +void (*after_char_processing_hook) (); /* Wrapper function for calling into the readline library. The event @@ -162,6 +166,8 @@ static void rl_callback_read_char_wrapper (gdb_client_data client_data) { rl_callback_read_char (); + if (after_char_processing_hook) + (*after_char_processing_hook) (); } /* Initialize all the necessary variables, start the event loop, diff --git a/gdb/event-top.h b/gdb/event-top.h index 1ae485b3b8..24044a57ba 100644 --- a/gdb/event-top.h +++ b/gdb/event-top.h @@ -108,3 +108,4 @@ extern struct prompts the_prompts; extern void (*call_readline) (void *); extern void (*input_handler) (char *); extern int input_fd; +extern void (*after_char_processing_hook) (void); diff --git a/gdb/top.c b/gdb/top.c index 7ddd346721..3bffaf4efd 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -1035,6 +1035,52 @@ init_signals (void) #endif } +/* The current saved history number from operate-and-get-next. + This is -1 if not valid. */ +static int operate_saved_history = -1; + +/* This is put on the appropriate hook and helps operate-and-get-next + do its work. */ +void +gdb_rl_operate_and_get_next_completion () +{ + int delta = where_history () - operate_saved_history; + /* The `key' argument to rl_get_previous_history is ignored. */ + rl_get_previous_history (delta, 0); + operate_saved_history = -1; + + /* readline doesn't automatically update the display for us. */ + rl_redisplay (); + + after_char_processing_hook = NULL; + rl_pre_input_hook = NULL; +} + +/* This is a gdb-local readline command handler. It accepts the + current command line (like RET does) and, if this command was taken + from the history, arranges for the next command in the history to + appear on the command line when the prompt returns. + We ignore the arguments. */ +static int +gdb_rl_operate_and_get_next (int count, int key) +{ + if (event_loop_p) + { + /* Use the async hook. */ + after_char_processing_hook = gdb_rl_operate_and_get_next_completion; + } + else + { + /* This hook only works correctly when we are using the + synchronous readline. */ + rl_pre_input_hook = (Function *) gdb_rl_operate_and_get_next_completion; + } + + /* Add 1 because we eventually want the next line. */ + operate_saved_history = where_history () + 1; + return rl_newline (1, key); +} + /* Read one line from the command input stream `instream' into the local static buffer `linebuffer' (whose current length is `linelength'). @@ -1880,6 +1926,10 @@ init_main (void) rl_completer_quote_characters = get_gdb_completer_quote_characters (); rl_readline_name = "gdb"; + /* The name for this defun comes from Bash, where it originated. + 15 is Control-o, the same binding this function has in Bash. */ + rl_add_defun ("operate-and-get-next", gdb_rl_operate_and_get_next, 15); + /* The set prompt command is different depending whether or not the async version is run. NOTE: this difference is going to disappear as we make the event loop be the default engine of