aboutsummaryrefslogtreecommitdiffstats
path: root/ext/readline
diff options
context:
space:
mode:
Diffstat (limited to 'ext/readline')
-rw-r--r--ext/readline/readline.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index 3b1a6c1d6a..07c9268bb5 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -130,7 +130,6 @@ static char **readline_attempted_completion_function(const char *text,
#if defined HAVE_RL_GETC_FUNCTION
static VALUE readline_instream;
-static ID id_getbyte;
#ifndef HAVE_RL_GETC
#define rl_getc(f) EOF
@@ -173,9 +172,19 @@ readline_getc(FILE *input)
}
}
#endif
- c = rb_funcall(readline_instream, id_getbyte, 0, 0);
+ c = rb_io_getbyte(readline_instream);
if (NIL_P(c)) return EOF;
- return NUM2CHR(c);
+ if (c == INT2FIX(ESC) &&
+ RL_ISSTATE(RL_STATE_ISEARCH) && /* isn't needed in other states? */
+ rb_io_read_pending(ifp)) {
+ int meta = 0;
+ c = rb_io_getbyte(readline_instream);
+ if (FIXNUM_P(c) && isascii(FIX2INT(c))) meta = 1;
+ rb_io_ungetbyte(readline_instream, c);
+ if (meta) rl_execute_next(ESC);
+ return ESC;
+ }
+ return FIX2INT(c);
}
#elif defined HAVE_RL_EVENT_HOOK
#define BUSY_WAIT 0
@@ -1703,7 +1712,6 @@ Init_readline()
/* and using_history() call rl_initialize(). */
/* This assignment should be placed before using_history() */
rl_getc_function = readline_getc;
- id_getbyte = rb_intern_const("getbyte");
#elif defined HAVE_RL_EVENT_HOOK
rl_event_hook = readline_event;
#endif