# HG changeset patch # User jwe # Date 757757827 0 # Node ID 0febc87abbd40a34655fafec534b92d9a42cfc8e # Parent 69ed7cc2c05a27162ff2205131d492346d2f6de6 [project @ 1994-01-05 08:17:07 by jwe] diff -r 69ed7cc2c05a -r 0febc87abbd4 src/input.cc --- a/src/input.cc Wed Jan 05 07:20:02 1994 +0000 +++ b/src/input.cc Wed Jan 05 08:17:07 1994 +0000 @@ -1,7 +1,7 @@ // input.cc -*- C++ -*- /* -Copyright (C) 1992, 1993 John W. Eaton +Copyright (C) 1992, 1993, 1994 John W. Eaton This file is part of Octave. @@ -37,6 +37,7 @@ extern "C" { #include "readline/readline.h" +#include "readline/history.h" extern char *xmalloc (); @@ -173,7 +174,7 @@ /* * Read a line from the input stream. */ -int +int octave_read (char *buf, int max_size) { int status = 0; @@ -291,7 +292,7 @@ return rl_instream; } -char * +static char * command_generator (char *text, int state) { static int len = 0; @@ -330,7 +331,7 @@ return (char *) NULL; } -char ** +static char ** command_completer (char *text, int start, int end) { char **matches = (char **) NULL; @@ -338,6 +339,69 @@ return matches; } +/* + * The next two functions implement the equivalent of the K*rn shell + * C-o operate-and-get-next-history-line editing command. Stolen from + * the GNU Bourne Again SHell. + */ + +// ?? +static int saved_history_line_to_use = 0; + +// ?? +static Function *old_rl_startup_hook = (Function *) NULL; + +static void +set_saved_history (void) +{ + HIST_ENTRY *h; + + if (saved_history_line_to_use) + { + if (history_set_pos (saved_history_line_to_use)) + { + h = current_history (); + if (h) + { + rl_insert_text (h->line); + +// Get rid of any undo list created by the previous insert, so the +// line won't totally be erased when the edits are undone (they will +// be normally, because this is a history line -- cf. readline.c: +// line 380 or so). + if (rl_undo_list) + { + free_undo_list (); + rl_undo_list = (UNDO_LIST *) NULL; + } + } + } + } + saved_history_line_to_use = 0; + rl_startup_hook = old_rl_startup_hook; +} + +static void +operate_and_get_next (int count, int c) +{ + int where; + extern int history_stifled, history_length, max_input_history; + + /* Accept the current line. */ + rl_newline (); + + /* Find the current line, and find the next line to use. */ + where = where_history (); + + if (history_stifled && (history_length >= max_input_history)) + saved_history_line_to_use = where; + else + saved_history_line_to_use = where + 1; + + old_rl_startup_hook = rl_startup_hook; + rl_startup_hook = (Function *) set_saved_history; +} + void initialize_readline (void) { @@ -346,6 +410,10 @@ // Tell the completer that we want to try first. rl_attempted_completion_function = (Function *) command_completer; + +// Bind operate-and-get-next. + rl_add_defun ("operate-and-get-next", + (Function *) operate_and_get_next, CTRL ('O')); } /* diff -r 69ed7cc2c05a -r 0febc87abbd4 src/input.h --- a/src/input.h Wed Jan 05 07:20:02 1994 +0000 +++ b/src/input.h Wed Jan 05 08:17:07 1994 +0000 @@ -1,7 +1,7 @@ // input.h -*- C++ -*- /* -Copyright (C) 1992, 1993 John W. Eaton +Copyright (C) 1992, 1993, 1994 John W. Eaton This file is part of Octave. @@ -32,8 +32,6 @@ extern int octave_read (char *buf, int max_size); extern FILE *get_input_from_file (char *name, int warn = 1); extern FILE *get_input_from_stdin (void); -extern char *command_generator (char *text, int state); -extern char **command_completer (char *text, int start, int end); extern void initialize_readline (void); // Global pointer for eval().