diff options
author | Tom Tromey <tromey@redhat.com> | 2001-11-27 04:15:09 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2001-11-27 04:15:09 +0000 |
commit | 467d85198ffb27a97ef21aa85c044a3ace19990a (patch) | |
tree | a7a6c2ce830a8954c50aa5d49113a63c54bcf557 /gdb/top.c | |
parent | 88118b3abf152ba1d5a7a112918cab91674237f5 (diff) | |
download | gdb-467d85198ffb27a97ef21aa85c044a3ace19990a.zip gdb-467d85198ffb27a97ef21aa85c044a3ace19990a.tar.gz gdb-467d85198ffb27a97ef21aa85c044a3ace19990a.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/top.c')
-rw-r--r-- | gdb/top.c | 50 |
1 files changed, 50 insertions, 0 deletions
@@ -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 |