aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog14
-rw-r--r--gdb/NEWS4
-rw-r--r--gdb/event-loop.c8
-rw-r--r--gdb/event-top.c6
-rw-r--r--gdb/event-top.h1
-rw-r--r--gdb/top.c50
6 files changed, 83 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 99aa120..a7fb83b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,19 @@
2001-11-26 Tom Tromey <tromey@redhat.com>
+ * 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 <tromey@redhat.com>
+
* NEWS: Update for --args.
* infcmd.c (construct_inferior_arguments): Moved from ...
* fork-child.c: ... here.
diff --git a/gdb/NEWS b/gdb/NEWS
index 7f87439..fbe24f8 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 de1f78f..ea74419 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 e76f087..4703a86 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 1ae485b..24044a5 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 7ddd346..3bffaf4 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